diff --git a/web/karma.conf.js b/web/karma.conf.js
index 1a2b6c925d..9310bbb9da 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -15,7 +15,7 @@ const webpack = require('webpack');
 module.exports = function (config) {
   config.set({
     frameworks: ['jasmine', 'source-map-support'],
-    reporters: ['progress', 'kjhtml'],
+    reporters: ['progress', 'kjhtml', 'coverage'],
     plugins: [
       'karma-webpack',
       'karma-chrome-launcher',
@@ -23,6 +23,7 @@ module.exports = function (config) {
       'karma-jasmine-html-reporter',
       'karma-source-map-support',
       'karma-sourcemap-loader',
+      'karma-coverage',
       new webpack.SourceMapDevToolPlugin({
         /*
          * filename: null, // if no value is provided the sourcemap is inlined
@@ -37,6 +38,7 @@ module.exports = function (config) {
       {pattern: 'pgadmin/static/**/*.png', included: false, watched: true, served: true, nocache: false},
       {pattern: 'pgadmin/browser/static/js/**/*.js', included: false, watched: true},
       {pattern: 'pgadmin/pem/**/*.spec.js', watched: true},
+      {pattern: 'pgadmin/pem/**/static/**/*.js', included: false, watched: true},
       {pattern: 'regression/javascript/**/*.js', watched: true},
     ],
 
@@ -50,11 +52,18 @@ module.exports = function (config) {
     // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
     preprocessors: {
       'pgadmin/**/js/**/*.js?': ['sourcemap'],
-      'pgadmin/pem/**/*.spec.js': ['webpack','sourcemap'],
+      'pgadmin/pem/**/*.spec.js': ['webpack'],
       'regression/javascript/**/*.js': ['webpack', 'sourcemap'],
       'pgadmin/static/bundle/slickgrid.js': ['webpack', 'sourcemap'],
     },
 
+    // optionally, configure the reporter
+    coverageReporter: {
+      type : 'html',
+      dir : 'coverage/',
+      includeAllSources: true,
+    },
+
     webpack: webpackConfig,
     webpackMiddleware: {
       stats: 'errors-only',
diff --git a/web/package.json b/web/package.json
index 71bdc89ea8..a0d935e166 100644
--- a/web/package.json
+++ b/web/package.json
@@ -28,6 +28,7 @@
     "image-webpack-loader": "^6.0.0",
     "imports-loader": "^0.8.0",
     "is-docker": "^2.0.0",
+    "istanbul-instrumenter-loader": "^3.0.1",
     "jasmine-core": "~3.5.0",
     "karma": "^5.0.2",
     "karma-babel-preprocessor": "^8.0.1",
@@ -89,6 +90,7 @@
     "jquery-ui": "^1.12.1",
     "jquery.cookie": "^1.4.1",
     "json-bignumber": "^1.0.2",
+    "karma-coverage": "^2.0.3",
     "leaflet": "^1.6.0",
     "moment": "^2.24.0",
     "moment-timezone": "^0.5.28",
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index 386599431f..8dca474d0a 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -15,6 +15,8 @@ const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
 const nodeModulesDir = path.resolve(__dirname, 'node_modules');
 const regressionDir = path.resolve(__dirname, 'regression');
 
+//const sourcesDirPem = path.resolve(__dirname, 'pgadmin/pem');
+
 module.exports = {
   mode: 'development',
   devtool: 'inline-source-map',
@@ -65,7 +67,17 @@ module.exports = {
         ',jquery.event.drag' +
         '!exports-loader?' +
         'Slick',
-      }],
+      },
+      {
+        test: /\.js$|\.jsx$/,
+        use: {
+          loader: 'istanbul-instrumenter-loader',
+          options: { esModules: true },
+        },
+        enforce: 'post',
+        exclude: /node_modules|slickgrid|plugins|bundle|generated|\.spec\.js$/,
+      },
+    ],
   },
 
   resolve: {
