Rev 4657: Push result reporting thoroughly into TestResult. in http://bazaar.launchpad.net/~lifeless/bzr/test-speed
Robert Collins
robertc at robertcollins.net
Thu Aug 27 00:14:51 BST 2009
At http://bazaar.launchpad.net/~lifeless/bzr/test-speed
------------------------------------------------------------
revno: 4657
revision-id: robertc at robertcollins.net-20090826231441-8ouomxwxzgxt180l
parent: robertc at robertcollins.net-20090826224718-xjqbmhs14m7lmnjg
committer: Robert Collins <robertc at robertcollins.net>
branch nick: test-speed
timestamp: Thu 2009-08-27 09:14:41 +1000
message:
Push result reporting thoroughly into TestResult.
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py 2009-08-26 22:47:18 +0000
+++ b/bzrlib/tests/__init__.py 2009-08-26 23:14:41 +0000
@@ -176,14 +176,46 @@
self._strict = strict
def stopTestRun(self):
+ run = self.testsRun
+ actionTaken = "Ran"
+ stopTime = time.time()
+ timeTaken = stopTime - self.startTime
+ self.printErrors()
+ self.stream.writeln(self.separator2)
+ self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
+ run, run != 1 and "s" or "", timeTaken))
+ self.stream.writeln()
+ if not self.wasSuccessful():
+ self.stream.write("FAILED (")
+ failed, errored = map(len, (self.failures, self.errors))
+ if failed:
+ self.stream.write("failures=%d" % failed)
+ if errored:
+ if failed: self.stream.write(", ")
+ self.stream.write("errors=%d" % errored)
+ if self.known_failure_count:
+ if failed or errored: self.stream.write(", ")
+ self.stream.write("known_failure_count=%d" %
+ self.known_failure_count)
+ self.stream.writeln(")")
+ else:
+ if self.known_failure_count:
+ self.stream.writeln("OK (known_failures=%d)" %
+ self.known_failure_count)
+ else:
+ self.stream.writeln("OK")
+ if self.skip_count > 0:
+ skipped = self.skip_count
+ self.stream.writeln('%d test%s skipped' %
+ (skipped, skipped != 1 and "s" or ""))
+ if self.unsupported:
+ for feature, count in sorted(self.unsupported.items()):
+ self.stream.writeln("Missing feature '%s' skipped %d tests." %
+ (feature, count))
if self._strict:
ok = self.wasStrictlySuccessful()
else:
ok = self.wasSuccessful()
- if ok:
- self.stream.write('tests passed\n')
- else:
- self.stream.write('tests failed\n')
if TestCase._first_thread_leaker_id:
self.stream.write(
'%s is leaking threads among %d leaking tests.\n' % (
@@ -381,12 +413,12 @@
else:
raise errors.BzrError("Unknown whence %r" % whence)
- def finished(self):
- pass
-
def report_cleaning_up(self):
pass
+ def report_starting(self):
+ self.startTime = time.time()
+
def report_success(self, test):
pass
@@ -422,12 +454,11 @@
def stopTestRun(self):
# called when the tests that are going to run have run
self.pb.clear()
+ self.pb.finished()
super(TextTestResult, self).stopTestRun()
- def finished(self):
- self.pb.finished()
-
def report_starting(self):
+ super(TextTestResult, self).report_starting()
self.pb.update('[test 0/%d] Starting' % (self.num_tests))
def printErrors(self):
@@ -513,6 +544,7 @@
return result.ljust(final_width)
def report_starting(self):
+ super(VerboseTestResult, self).report_starting()
self.stream.write('running %d tests...\n' % self.num_tests)
def report_test_start(self, test):
@@ -597,7 +629,14 @@
def run(self, test):
"Run the given test case or test suite."
- startTime = time.time()
+ if self.list_only:
+ if self.verbosity >= 2:
+ self.stream.writeln("Listing tests only ...\n")
+ run = 0
+ for t in iter_suite_tests(test):
+ self.stream.writeln("%s" % (t.id()))
+ run += 1
+ return None
if self.verbosity == 1:
result_class = TextTestResult
elif self.verbosity >= 2:
@@ -613,62 +652,17 @@
run_result = decorator(run_result)
result.stop_early = self.stop_on_failure
result.report_starting()
- if self.list_only:
- if self.verbosity >= 2:
- self.stream.writeln("Listing tests only ...\n")
- run = 0
- for t in iter_suite_tests(test):
- self.stream.writeln("%s" % (t.id()))
- run += 1
- return None
+ try:
+ import testtools
+ except ImportError:
+ test.run(run_result)
else:
- try:
- import testtools
- except ImportError:
+ if isinstance(test, testtools.ConcurrentTestSuite):
+ # We need to catch bzr specific behaviors
+ test.run(BZRTransformingResult(run_result))
+ else:
test.run(run_result)
- else:
- if isinstance(test, testtools.ConcurrentTestSuite):
- # We need to catch bzr specific behaviors
- test.run(BZRTransformingResult(run_result))
- else:
- test.run(run_result)
- run = result.testsRun
- actionTaken = "Ran"
- stopTime = time.time()
- timeTaken = stopTime - startTime
- result.printErrors()
- self.stream.writeln(result.separator2)
- self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
- run, run != 1 and "s" or "", timeTaken))
- self.stream.writeln()
- if not result.wasSuccessful():
- self.stream.write("FAILED (")
- failed, errored = map(len, (result.failures, result.errors))
- if failed:
- self.stream.write("failures=%d" % failed)
- if errored:
- if failed: self.stream.write(", ")
- self.stream.write("errors=%d" % errored)
- if result.known_failure_count:
- if failed or errored: self.stream.write(", ")
- self.stream.write("known_failure_count=%d" %
- result.known_failure_count)
- self.stream.writeln(")")
- else:
- if result.known_failure_count:
- self.stream.writeln("OK (known_failures=%d)" %
- result.known_failure_count)
- else:
- self.stream.writeln("OK")
- if result.skip_count > 0:
- skipped = result.skip_count
- self.stream.writeln('%d test%s skipped' %
- (skipped, skipped != 1 and "s" or ""))
- if result.unsupported:
- for feature, count in sorted(result.unsupported.items()):
- self.stream.writeln("Missing feature '%s' skipped %d tests." %
- (feature, count))
- result.finished()
+ run_result.stopTestRun()
return result
@@ -2831,7 +2825,6 @@
result = runner.run(suite)
if list_only:
return True
- result.stopTestRun()
if strict:
return result.wasStrictlySuccessful()
else:
@@ -3170,7 +3163,7 @@
self.result.startTestRun()
def stopTestRun(self):
- self.result.stopTest()
+ self.result.stopTestRun()
def addSkip(self, test, reason):
self.result.addSkip(test, reason)
=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py 2009-08-26 22:47:18 +0000
+++ b/bzrlib/tests/test_selftest.py 2009-08-26 23:14:41 +0000
@@ -1001,11 +1001,14 @@
because of our use of global state.
"""
old_root = tests.TestCaseInTempDir.TEST_ROOT
+ old_leak = tests.TestCase._first_thread_leaker_id
try:
tests.TestCaseInTempDir.TEST_ROOT = None
+ tests.TestCase._first_thread_leaker_id = None
return testrunner.run(test)
finally:
tests.TestCaseInTempDir.TEST_ROOT = old_root
+ tests.TestCase._first_thread_leaker_id = old_leak
def test_known_failure_failed_run(self):
# run a test that generates a known failure which should be printed in
@@ -1291,6 +1294,20 @@
self.assertContainsRe(log, 'this will be kept')
self.assertEqual(log, test._log_contents)
+ def test_stopTestRun(self):
+ """run should call result.stopTestRun()"""
+ calls = []
+ class LoggingDecorator(tests.ForwardingResult):
+ def stopTestRun(self):
+ tests.ForwardingResult.stopTestRun(self)
+ calls.append('stopTestRun')
+ test = unittest.FunctionTestCase(lambda:None)
+ stream = StringIO()
+ runner = tests.TextTestRunner(stream=stream,
+ result_decorators=[LoggingDecorator])
+ result = self.run_test_runner(runner, test)
+ self.assertLength(1, calls)
+
class SampleTestCase(tests.TestCase):
@@ -2934,19 +2951,3 @@
self.verbosity)
tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
self.assertLength(1, calls)
-
- def test_stopTestRun(self):
- """run_suite should call result.stopTestRun()"""
- self.calls = 0
- def one_more_call(): self.calls += 1
- def test_function():
- pass
- test = unittest.FunctionTestCase(test_function)
- class InstrumentedTestResult(tests.ExtendedTestResult):
- def stopTestRun(self): one_more_call()
- class MyRunner(tests.TextTestRunner):
- def run(self, test):
- return InstrumentedTestResult(self.stream, self.descriptions,
- self.verbosity)
- tests.run_suite(test, runner_class=MyRunner, stream=StringIO())
- self.assertEquals(1, self.calls)
More information about the bazaar-commits
mailing list