diff --git a/product/ERP5Type/tests/runUnitTest.py b/product/ERP5Type/tests/runUnitTest.py
index 0e74b7694eccdfaab32fafdb30e801d172c2c54c..0f2b01a9bfdfd301afdf3607f509edbaf928f091 100755
--- a/product/ERP5Type/tests/runUnitTest.py
+++ b/product/ERP5Type/tests/runUnitTest.py
@@ -13,6 +13,10 @@ import random
 from glob import glob
 
 import backportUnittest
+try:
+  from coverage import coverage
+except ImportError:
+  coverage = None
 
 WIN = os.name == 'nt'
 
@@ -24,6 +28,8 @@ Options:
   -v, --verbose              produce verbose output
   -h, --help                 this help screen
   -p, --profile              print profiling results at the end
+  --coverage=STRING          Use the given path as a coverage config file and
+                             thus enable code coverateg report
   --portal_id=STRING         force id of the portal. Useful when using
                              --data_fs_path to run tests on an existing
                              Data.fs
@@ -482,6 +488,11 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None):
     signal.signal(signal.SIGINT, shutdown)
   signal.signal(signal.SIGHUP, shutdown)
 
+  coverage_config = os.environ.get('coverage', None)
+  if coverage_config:
+    coverage_process = coverage(config_file=coverage_config)
+    coverage_process.start()
+
   try:
     save = int(os.environ.get('erp5_save_data_fs', 0))
     load = int(os.environ.get('erp5_load_data_fs', 0))
@@ -542,6 +553,11 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None):
       if neo_cluster:
         neo_cluster.stop()
 
+  if coverage_config:
+    coverage_process.stop()
+    coverage_process.save()
+    coverage_process.html_report()
+
   if save:
     os.chdir(instance_home)
     if save_mysql:
@@ -591,7 +607,8 @@ def main(argument_list=None):
   sys.argv.extend(old_argv[1:])
   try:
     opts, args = getopt.getopt(sys.argv[1:],
-        "hpvD", ["help", "verbose", "profile", "portal_id=", "data_fs_path=",
+        "hpvD", ["help", "verbose", "profile", "coverage=", "portal_id=",
+        "data_fs_path=",
         "bt5_path=",
         "recreate_catalog=", "erp5_sql_connection_string=",
         "cmf_activity_sql_connection_string=",
@@ -644,6 +661,11 @@ def main(argument_list=None):
       sys.exit()
     elif opt == '-D':
       debug = 1
+    elif opt == "--coverage":
+      if coverage:
+        os.environ['coverage'] = arg
+      else:
+        _print("WARNING Coverage module not found")
     elif opt in ("-p", "--profile"):
       os.environ['PROFILE_TESTS'] = "1"
       # profiling of setup and teardown is disabled by default, just set