[Zope3-checkins] SVN: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/ Move coverage analysis out as its own feature.

Christian Theune ct at gocept.com
Sun May 4 07:02:53 EDT 2008


Log message for revision 86335:
  Move coverage analysis out as its own feature.
  

Changed:
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/coverage.py
  A   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/feature.py
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/interfaces.py
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/testrunner-layers-api.txt

-=-
Modified: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py	2008-05-04 11:02:32 UTC (rev 86334)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py	2008-05-04 11:02:53 UTC (rev 86335)
@@ -20,12 +20,15 @@
 import unittest
 
 
-from zope.testing.testrunner.runner import Runner
+import zope.testing.testrunner.interfaces
 
 
+
 def run(defaults=None, args=None):
     # This function is here to make the whole test runner compatible before
     # the large refactoring.
+    # XXX Bah. Lazy import to avoid circular/early import problems
+    from zope.testing.testrunner.runner import Runner
     runner = Runner(defaults, args)
     runner.run()
     if runner.failed and runner.options.exitwithstatus:

Modified: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/coverage.py
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/coverage.py	2008-05-04 11:02:32 UTC (rev 86334)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/coverage.py	2008-05-04 11:02:53 UTC (rev 86335)
@@ -21,7 +21,9 @@
 import os.path
 import threading
 
+import zope.testing.testrunner.feature
 
+
 # For some reason, the doctest module resets the trace callable randomly, thus
 # disabling the coverage. Simply disallow the code from doing this. A real
 # trace can be set, so that debugging still works.
@@ -118,3 +120,34 @@
     class TestIgnore(OldTestIgnore):
         def _filenameFormat(self, filename):
             return os.path.normcase(os.path.abspath(filename))
+
+
+class Coverage(zope.testing.testrunner.feature.Feature):
+
+    tracer = None
+    directory = None
+
+    def __init__(self, runner):
+        super(Coverage, self).__init__(runner)
+        self.active = bool(runner.options.coverage)
+
+    def global_setup(self):
+        """Executed once when the test runner is being set up."""
+        self.directory = os.path.join(os.getcwd(), self.runner.options.coverage)
+        self.tracer = TestTrace(self.runner.test_directories,
+                                trace=False, count=True)
+
+    def late_setup(self):
+        """Executed once right before the actual tests get executed and after
+        all global setups have happened."""
+        self.tracer.start()
+
+    def early_teardown(self):
+        """Executed once directly after all tests."""
+        self.tracer.stop()
+
+    def report(self):
+        """Executed once after all tests have been run and all setup was
+        torn down."""
+        r = self.tracer.results()
+        r.write_results(summary=True, coverdir=self.directory)

Added: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/feature.py
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/feature.py	                        (rev 0)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/feature.py	2008-05-04 11:02:53 UTC (rev 86335)
@@ -0,0 +1,63 @@
+##############################################################################
+#
+# Copyright (c) 2004-2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Generic features for the test runner.
+
+$Id: __init__.py 86232 2008-05-03 15:09:33Z ctheune $
+"""
+
+import zope.interface
+import zope.testing.testrunner.interfaces
+
+
+class Feature(object):
+    """A base class implementing no-op methods for the IFeature interface."""
+
+    zope.interface.implements(zope.testing.testrunner.interfaces.IFeature)
+
+    active = False
+
+    def __init__(self, runner):
+        self.runner = runner
+
+    def global_setup(self):
+        """Executed once when the test runner is being set up."""
+        pass
+
+    def late_setup(self):
+        """Executed once right before the actual tests get executed and after
+        all global setups have happened.
+        """
+        pass
+
+    def test_setup(self):
+        """Executed once before each test."""
+        pass
+
+    def test_teardown(self):
+        """Executed once after each test."""
+        pass
+
+    def early_teardown(self):
+        """Executed once directly after all tests."""
+        pass
+
+    def global_teardown(self):
+        """Executed once after all tests where run and early teardowns have
+        happened."""
+        pass
+
+    def report(self):
+        """Executed once after all tests have been run and all setup was
+        torn down."""
+        pass


Property changes on: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/feature.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/interfaces.py
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/interfaces.py	2008-05-04 11:02:32 UTC (rev 86334)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/interfaces.py	2008-05-04 11:02:53 UTC (rev 86335)
@@ -28,6 +28,10 @@
     order.
     """
 
+    active = zope.interface.Attribute(
+      "Flag whether this feature is activated. If it is not activated than "
+      "its methods won't be called by the runner.")
+
     def global_setup():
         """Executed once when the test runner is being set up."""
 
@@ -67,7 +71,7 @@
 
     def report():
         """Executed once after all tests have been run and all setup was
-        teared down.
+        torn down.
 
         This is the only method that should produce output.
 

Modified: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py	2008-05-04 11:02:32 UTC (rev 86334)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py	2008-05-04 11:02:53 UTC (rev 86335)
@@ -35,7 +35,7 @@
 from zope.testing.testrunner.find import find_tests, test_dirs
 from zope.testing.testrunner.find import StartUpFailure, import_name
 from zope.testing.testrunner.find import name_from_layer, _layer_name_cache
-from zope.testing.testrunner.coverage import TestTrace
+from zope.testing.testrunner import coverage
 from zope.testing.testrunner.refcount import TrackRefs
 from zope.testing.testrunner.options import get_options
 
@@ -164,6 +164,14 @@
 
         self.options = options
 
+        # XXX I moved this here mechanically.
+        self.test_directories = test_dirs(self.options, {})
+
+        self.features.append(coverage.Coverage(self))
+
+        # Remove all features that aren't activated
+        self.features = [f for f in self.features if f.active]
+
     def setup_features(self):
         # Make sure we start with real pdb.set_trace.  This is needed
         # to make tests of the test runner work properly. :)
@@ -177,13 +185,6 @@
         # Control reporting flags during run
         self.old_reporting_flags = doctest.set_unittest_reportflags(0)
 
-        # Set up code coverage analysis
-        if self.options.coverage:
-            self.tracer = TestTrace(test_dirs(self.options, {}), trace=False, count=True)
-            self.tracer.start()
-        else:
-            self.tracer = None
-
         # Setup profiling
         if (self.options.profile
             and sys.version_info[:3] <= (2,4,1)
@@ -390,9 +391,6 @@
                 self.profiler_stats = self.profiler.loadStats(self.prof_glob)
                 self.profiler_stats.sort_stats('cumulative', 'calls')
 
-        if self.tracer:
-            self.tracer.stop()
-
         doctest.set_unittest_reportflags(self.old_reporting_flags)
 
     def report(self):
@@ -420,12 +418,7 @@
         if self.options.profile and not self.options.resume_layer:
             self.options.output.profiler_stats(self.profiler_stats)
 
-        if self.tracer:
-            coverdir = os.path.join(os.getcwd(), self.options.coverage)
-            r = self.tracer.results()
-            r.write_results(summary=True, coverdir=coverdir)
 
-
 def run_tests(options, tests, name, failures, errors):
     repeat = options.repeat or 1
     repeat_range = iter(range(repeat))

Modified: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/testrunner-layers-api.txt
===================================================================
--- zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/testrunner-layers-api.txt	2008-05-04 11:02:32 UTC (rev 86334)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/testrunner-layers-api.txt	2008-05-04 11:02:53 UTC (rev 86335)
@@ -111,7 +111,7 @@
 the TestSpecifyingNoLayer was run and setup/torn down around the
 TestSpecifyingBaseLayer tests.
 
->>> from zope.testing.testrunner import Runner
+>>> from zope.testing.testrunner.runner import Runner
 >>> runner = Runner(options=fresh_options(), args=[], found_suites=[umbrella_suite])
 >>> succeeded = runner.run()
 Running unit tests:



More information about the Zope3-Checkins mailing list