diff --git a/.gitignore b/.gitignore
index 67eac53b45cd59a8db7b5e988128fb80bece7faf..7e8ebcd581704b17425f5a7576c1ae3c139f59dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,5 @@ dist/*
 *.pyc
 
 .coverage
+coverage.xml
+htmlcov/*
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5788612ec2ee35c80bbd59e80dcc9e3daef340cc..b17457db642b7eceb4eed0f04724adb973ba7f4e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -45,6 +45,19 @@ run_pylint:
 #   script:
 #     - echo "build fortran/c/cpp extension source code"
 
+run_unit_tests_coverage:
+  stage: test
+  image: python:3.7
+  script:
+   - tox -e coverage
+  artifacts:
+    reports:
+      coverage_report:
+        coverage_format: cobertura
+        path: coverage.xml
+    paths:
+      - htmlcov/*
+
 run_unit_tests:
   stage: test
   image: python:3.${PY_VERSION}
diff --git a/tox.ini b/tox.ini
index 0c73407b467025c899dbf77bd869e9633a6f0356..bd77bdffc92e5e342dd56dc69f551a0f35d13e24 100644
--- a/tox.ini
+++ b/tox.ini
@@ -16,7 +16,12 @@ deps =
     -r{toxinidir}/tests/requirements.txt
 commands =
     {envpython} --version
-    {envpython} -m pytest --cov=map
+    {envpython} -m pytest
+
+[testenv:coverage]
+commands =
+    {envpython} --version
+    {envpython} -m pytest --cov-report xml --cov-report html --cov=map
 
 # Use generative name and command prefixes to reuse the same virtualenv
 # for all linting jobs.