[Zope3-checkins]
SVN: zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/
Refactored the run method into a class as preparation for
more restructuring.
Christian Theune
ct at gocept.com
Sat May 3 12:12:18 EDT 2008
Log message for revision 86252:
Refactored the run method into a class as preparation for more restructuring.
Changed:
U zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py
U zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py
-=-
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-03 16:04:53 UTC (rev 86251)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/__init__.py 2008-05-03 16:12:17 UTC (rev 86252)
@@ -20,9 +20,16 @@
import unittest
-from zope.testing.testrunner.runner import run
+from zope.testing.testrunner.runner import Runner
+def run(defaults=None, args=None):
+ # This function is here to make the whole test runner compatible before
+ # the large refactoring.
+ runner = Runner(defaults, args)
+ failed = runner.run()
+ return failed
+
###############################################################################
# Install 2.4 TestSuite __iter__ into earlier versions
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 16:04:53 UTC (rev 86251)
+++ zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner/runner.py 2008-05-03 16:12:17 UTC (rev 86252)
@@ -61,6 +61,127 @@
"""
+class Runner(object):
+ """The test runner.
+
+ It is the central point of this package and responsible for finding and
+ executing tests as well as configuring itself from the (command-line)
+ options passed into it.
+
+ """
+
+ def __init__(self, defaults=None, args=None):
+ self.defaults = defaults
+ self.args = args
+
+ def run(self):
+ args = self.args
+ defaults = self.defaults
+
+ if args is None:
+ args = sys.argv[:]
+
+ # 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.
+ configure_logging()
+
+ # Control reporting flags during run
+ old_reporting_flags = doctest.set_unittest_reportflags(0)
+
+ # Check to see if we are being run as a subprocess. If we are,
+ # then use the resume-layer and defaults passed in.
+ if len(args) > 1 and args[1] == '--resume-layer':
+ args.pop(1)
+ resume_layer = args.pop(1)
+ resume_number = int(args.pop(1))
+ defaults = []
+ while len(args) > 1 and args[1] == '--default':
+ args.pop(1)
+ defaults.append(args.pop(1))
+
+ sys.stdin = FakeInputContinueGenerator()
+ else:
+ resume_layer = resume_number = None
+
+ options = get_options(args, defaults)
+ if options.fail:
+ return True
+
+ output = options.output
+
+ options.testrunner_defaults = defaults
+ options.resume_layer = resume_layer
+ options.resume_number = resume_number
+
+ # 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
+
+ if (options.profile
+ and sys.version_info[:3] <= (2,4,1)
+ and __debug__):
+ output.error('Because of a bug in Python < 2.4.1, profiling '
+ 'during tests requires the -O option be passed to '
+ 'Python (not the test runner).')
+ sys.exit()
+
+ if options.coverage:
+ tracer = TestTrace(test_dirs(options, {}), trace=False, count=True)
+ tracer.start()
+ else:
+ tracer = None
+
+ if 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 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[options.profile](file_path)
+ profiler.enable()
+
+ try:
+ try:
+ failed = not run_with_options(options)
+ except EndRun:
+ failed = True
+ finally:
+ if tracer:
+ tracer.stop()
+ if 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)
+
+ if options.profile and not options.resume_layer:
+ stats = profiler.loadStats(prof_glob)
+ stats.sort_stats('cumulative', 'calls')
+ output.profiler_stats(stats)
+
+ if tracer:
+ coverdir = os.path.join(os.getcwd(), options.coverage)
+ r = tracer.results()
+ r.write_results(summary=True, coverdir=coverdir)
+
+ doctest.set_unittest_reportflags(old_reporting_flags)
+
+ if failed and options.exitwithstatus:
+ sys.exit(1)
+
+ return failed
+
+
def run_tests(options, tests, name, failures, errors):
repeat = options.repeat or 1
repeat_range = iter(range(repeat))
@@ -251,110 +372,6 @@
return rantotal
-def run(defaults=None, args=None):
- if args is None:
- args = sys.argv[:]
-
- # 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.
- configure_logging()
-
- # Control reporting flags during run
- old_reporting_flags = doctest.set_unittest_reportflags(0)
-
- # Check to see if we are being run as a subprocess. If we are,
- # then use the resume-layer and defaults passed in.
- if len(args) > 1 and args[1] == '--resume-layer':
- args.pop(1)
- resume_layer = args.pop(1)
- resume_number = int(args.pop(1))
- defaults = []
- while len(args) > 1 and args[1] == '--default':
- args.pop(1)
- defaults.append(args.pop(1))
-
- sys.stdin = FakeInputContinueGenerator()
- else:
- resume_layer = resume_number = None
-
- options = get_options(args, defaults)
- if options.fail:
- return True
-
- output = options.output
-
- options.testrunner_defaults = defaults
- options.resume_layer = resume_layer
- options.resume_number = resume_number
-
- # 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
-
- if (options.profile
- and sys.version_info[:3] <= (2,4,1)
- and __debug__):
- output.error('Because of a bug in Python < 2.4.1, profiling '
- 'during tests requires the -O option be passed to '
- 'Python (not the test runner).')
- sys.exit()
-
- if options.coverage:
- tracer = TestTrace(test_dirs(options, {}), trace=False, count=True)
- tracer.start()
- else:
- tracer = None
-
- if 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 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[options.profile](file_path)
- profiler.enable()
-
- try:
- try:
- failed = not run_with_options(options)
- except EndRun:
- failed = True
- finally:
- if tracer:
- tracer.stop()
- if 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)
-
- if options.profile and not options.resume_layer:
- stats = profiler.loadStats(prof_glob)
- stats.sort_stats('cumulative', 'calls')
- output.profiler_stats(stats)
-
- if tracer:
- coverdir = os.path.join(os.getcwd(), options.coverage)
- r = tracer.results()
- r.write_results(summary=True, coverdir=coverdir)
-
- doctest.set_unittest_reportflags(old_reporting_flags)
-
- if failed and options.exitwithstatus:
- sys.exit(1)
-
- return failed
-
def run_with_options(options, found_suites=None):
"""Find and run tests
More information about the Zope3-Checkins
mailing list