[Zope3-checkins] SVN: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py finally move out the setup and teardown code to the separate methods

Christian Theune ct at gocept.com
Sat May 3 16:21:53 EDT 2008


Log message for revision 86288:
  finally move out the setup and teardown code to the separate methods
  

Changed:
  U   zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py

-=-
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-03 20:14:55 UTC (rev 86287)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py	2008-05-03 20:21:53 UTC (rev 86288)
@@ -77,34 +77,22 @@
         self.found_suites = found_suites
         self.options = options
 
+        self.late_initializers = []
+        self.early_shutdown = []
+
     def run(self):
         self.configure()
-
         if self.options.fail:
             return True
 
         self.setup_features()
 
-        # Make sure we start with real pdb.set_trace.  This is needed
-        # to make tests of the test runner work properly. :)
-        pdb.set_trace = real_pdb_set_trace
+        # Some system tools like profilers are really bad with stack frames.
+        # E.g. hotshot doesn't like it when we leave the stack frame that we
+        # called start() from.
+        for init in self.late_initializers:
+            init()
 
-        if self.options.profile:
-            prof_prefix = 'tests_profile.'
-            prof_suffix = '.prof'
-            prof_glob = prof_prefix + '*' + prof_suffix
-
-            # if we are going to be profiling, and this isn't a subprocess,
-            # clean up any stale results files
-            if not self.options.resume_layer:
-                for file_name in glob.glob(prof_glob):
-                    os.unlink(file_name)
-
-            # set up the output file
-            oshandle, file_path = tempfile.mkstemp(prof_suffix, prof_prefix, '.')
-            profiler = available_profilers[self.options.profile](file_path)
-            profiler.enable()
-
         try:
             try:
                 self.find_tests()
@@ -112,23 +100,10 @@
             except EndRun:
                 failed = True
         finally:
-            if self.tracer:
-                self.tracer.stop()
-            if self.options.profile:
-                profiler.disable()
-                profiler.finish()
-                # We must explicitly close the handle mkstemp returned, else on
-                # Windows this dies the next time around just above due to an
-                # attempt to unlink a still-open file.
-                os.close(oshandle)
+            for shutdown in self.early_shutdown:
+                shutdown()
+            self.shutdown_features()
 
-        if self.options.profile and not self.options.resume_layer:
-            stats = profiler.loadStats(prof_glob)
-            stats.sort_stats('cumulative', 'calls')
-            self.options.output.profiler_stats(stats)
-
-        self.shutdown_features()
-
         if failed and self.options.exitwithstatus:
             sys.exit(1)
 
@@ -162,6 +137,10 @@
         self.options = options
 
     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. :)
+        pdb.set_trace = real_pdb_set_trace
+
         # Set the default logging policy.
         # XXX There are no tests for this logging behavior.
         # It's not at all clear that the test runner should be doing this.
@@ -187,6 +166,21 @@
                 'Python (not the test runner).')
             sys.exit()
 
+        if self.options.profile:
+            self.prof_prefix = 'tests_profile.'
+            self.prof_suffix = '.prof'
+            self.prof_glob = self.prof_prefix + '*' + self.prof_suffix
+            # if we are going to be profiling, and this isn't a subprocess,
+            # clean up any stale results files
+            if not self.options.resume_layer:
+                for file_name in glob.glob(self.prof_glob):
+                    os.unlink(file_name)
+            # set up the output file
+            self.oshandle, self.file_path = tempfile.mkstemp(self.prof_suffix,
+                                                             self.prof_prefix, '.')
+            self.profiler = available_profilers[self.options.profile](self.file_path)
+            self.late_initializers.append(self.profiler.enable)
+            self.early_shutdown.append(self.profiler.disable)
 
     def find_tests(self):
         pass
@@ -370,7 +364,19 @@
         return bool(import_errors or failures or errors)
 
     def shutdown_features(self):
+        if self.options.profile:
+            self.profiler.finish()
+            # We must explicitly close the handle mkstemp returned, else on
+            # Windows this dies the next time around just above due to an
+            # attempt to unlink a still-open file.
+            os.close(self.oshandle)
+            if not self.options.resume_layer:
+                stats = self.profiler.loadStats(self.prof_glob)
+                stats.sort_stats('cumulative', 'calls')
+                self.options.output.profiler_stats(stats)
+
         if self.tracer:
+            self.tracer.stop()
             coverdir = os.path.join(os.getcwd(), self.options.coverage)
             r = self.tracer.results()
             r.write_results(summary=True, coverdir=coverdir)
@@ -378,7 +384,6 @@
         doctest.set_unittest_reportflags(self.old_reporting_flags)
 
 
-
 def run_tests(options, tests, name, failures, errors):
     repeat = options.repeat or 1
     repeat_range = iter(range(repeat))
@@ -854,5 +859,3 @@
         print '*'*70
         print
         return 'c\n'
-
-



More information about the Zope3-Checkins mailing list