changeset 441:641a73f078f5

Experimental support for using [http://nedbatchelder.com/code/modules/coverage.html coverage.py] with the Bitten `unittest` command.
author cmlenz
date Tue, 21 Aug 2007 14:00:53 +0000
parents e660687ac89c
children a8787de4fbc3
files bitten/util/testrunner.py
diffstat 1 files changed, 70 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/util/testrunner.py
+++ b/bitten/util/testrunner.py
@@ -147,38 +147,71 @@
                                        self.coverage_method)
 
     def run_tests(self):
-        if self.coverage_dir:
-
+        if self.coverage_summary:
             if self.coverage_method == 'coverage':
-                import coverage
-                coverage.erase()
-                coverage.start()
-                log.info('running tests under coverage.py')
-                try:
-                    self._run_tests()
-                finally:
-                    coverage.stop()
-
+                self._run_with_coverage()
             else:
-                from trace import Trace
-                trace = Trace(ignoredirs=[sys.prefix, sys.exec_prefix],
-                              trace=False, count=True)
-                try:
-                    trace.runfunc(self._run_tests)
-                finally:
-                    results = trace.results()
-                    real_stdout = sys.stdout
-                    sys.stdout = open(self.coverage_summary, 'w')
-                    try:
-                        results.write_results(show_missing=True, summary=True,
-                                              coverdir=self.coverage_dir)
-                    finally:
-                        sys.stdout.close()
-                        sys.stdout = real_stdout
-
+                self._run_with_trace()
         else:
             self._run_tests()
 
+    def _run_with_coverage(self):
+        import coverage
+        coverage.use_cache(False)
+        coverage.start()
+        log.info('running tests under coverage.py')
+        try:
+            self._run_tests()
+        finally:
+            coverage.stop()
+
+            modules = [m for _, m in sys.modules.items()
+                       if m is not None and hasattr(m, '__file__')
+                       and os.path.splitext(m.__file__)[-1] in ('.py', '.pyc')]
+
+            # Generate summary file
+            buf = StringIO()
+            coverage.report(modules, file=buf)
+            buf.seek(0)
+            fileobj = open(self.coverage_summary, 'w')
+            try:
+                for idx, line in enumerate(buf):
+                    if idx < 2 or line.startswith('--'):
+                        fileobj.write(line)
+                        continue
+                    parts = line.split()
+                    name = parts[0]
+                    if name not in sys.modules:
+                        fileobj.write(line)
+                        continue
+                    filename = os.path.normpath(sys.modules[name].__file__)
+                    fileobj.write(line + ' ' + filename + '\n')
+            finally:
+                fileobj.close()
+
+            if self.coverage_dir:
+                if not os.path.exists(self.coverage_dir):
+                    os.makedirs(self.coverage_dir)
+                coverage.annotate(modules, directory=self.coverage_dir,
+                                  ignore_errors=True)
+
+    def _run_with_trace(self):
+        from trace import Trace
+        trace = Trace(ignoredirs=[sys.prefix, sys.exec_prefix], trace=False,
+                      count=True)
+        try:
+            trace.runfunc(self._run_tests)
+        finally:
+            results = trace.results()
+            real_stdout = sys.stdout
+            sys.stdout = open(self.coverage_summary, 'w')
+            try:
+                results.write_results(show_missing=True, summary=True,
+                                      coverdir=self.coverage_dir)
+            finally:
+                sys.stdout.close()
+                sys.stdout = real_stdout
+
     def _run_tests(self):
         old_path = sys.path[:]
         ei_cmd = self.get_finalized_command("egg_info")
@@ -192,13 +225,16 @@
         loader_ep = EntryPoint.parse("x=" + self.test_loader)
         loader_class = loader_ep.load(require=False)
 
-        import unittest
-        unittest.main(
-            None, None, [unittest.__file__] + self.test_args,
-            testRunner=XMLTestRunner(stream=sys.stdout,
-                                     xml_stream=self.xml_output_file),
-            testLoader=loader_class()
-        )
+        try:
+            import unittest
+            unittest.main(
+                None, None, [unittest.__file__] + self.test_args,
+                testRunner=XMLTestRunner(stream=sys.stdout,
+                                         xml_stream=self.xml_output_file),
+                testLoader=loader_class()
+            )
+        except SystemExit, e:
+            return e.code
 
 
 def main():
Copyright (C) 2012-2017 Edgewall Software