diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml
new file mode 100644
index 0000000000000000000000000000000000000000..70bced49b2ad5078b3062d299545379285996412
--- /dev/null
+++ b/.github/workflows/frontend.yml
@@ -0,0 +1,25 @@
+name: Frontend Tests (Karma + Mocha + Chai)
+
+on: [push]
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        node-version: [8.x, 10.x, 12.x]
+
+    steps:
+    - uses: actions/checkout@v1
+    - name: Use Node.js ${{ matrix.node-version }}
+      uses: actions/setup-node@v1
+      with:
+        node-version: ${{ matrix.node-version }}
+    - name: npm install and test
+      run: |
+        npm i
+        npm test
+      env:
+        NODE_ENV: test
\ No newline at end of file
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
deleted file mode 100644
index 27627524395b65dfe42d1aefc5d186e48acca2b3..0000000000000000000000000000000000000000
--- a/.github/workflows/test.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-name: Test_Action
-
-on: [push]
-
-jobs:
-  build:
-    runs-on: self-hosted
-    steps:
-    - uses: actions/checkout@v1
-    - name: works
-      run: echo hello world
diff --git a/spec/karma.conf.js b/spec/karma.conf.js
index a4d590e55175a85e124a387fe93e848c71108191..ee43450136d389ae2f97f90dfb94cf09cf2393c8 100644
--- a/spec/karma.conf.js
+++ b/spec/karma.conf.js
@@ -6,6 +6,11 @@ const webpackTest = require('../webpack.test')
 const webpackConfig = require('../webpack.dev')
 const fullWebpack = merge(webpackTest, webpackConfig)
 
+const singleRun = process.env.NODE_ENV === 'test'
+const browsers = process.env.NODE_ENV === 'test'
+  ? ['ChromeHeadless']
+  : ['Chrome']
+
 module.exports = function(config) {
   config.set({
 
@@ -62,12 +67,12 @@ module.exports = function(config) {
 
     // start these browsers
     // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    browsers: ['Chrome'],
+    browsers,
 
 
     // Continuous Integration mode
     // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
+    singleRun,
 
     // Concurrency level
     // how many browser should be started simultaneous