[Zope3-checkins] SVN: zope.testing/trunk/ Merge of my
'ctheune-cleanup' branch.
Christian Theune
ct at gocept.com
Mon May 5 14:50:48 EDT 2008
Log message for revision 86460:
Merge of my 'ctheune-cleanup' branch.
Changed:
U zope.testing/trunk/README.txt
U zope.testing/trunk/setup.py
A zope.testing/trunk/src/zope/testing/testrunner/
D zope.testing/trunk/src/zope/testing/testrunner-arguments.txt
D zope.testing/trunk/src/zope/testing/testrunner-colors.txt
D zope.testing/trunk/src/zope/testing/testrunner-coverage-win32.txt
D zope.testing/trunk/src/zope/testing/testrunner-coverage.txt
D zope.testing/trunk/src/zope/testing/testrunner-debugging-layer-setup.test
D zope.testing/trunk/src/zope/testing/testrunner-debugging.txt
D zope.testing/trunk/src/zope/testing/testrunner-edge-cases.txt
D zope.testing/trunk/src/zope/testing/testrunner-errors.txt
D zope.testing/trunk/src/zope/testing/testrunner-ex/
D zope.testing/trunk/src/zope/testing/testrunner-ex-pp-lib/
D zope.testing/trunk/src/zope/testing/testrunner-ex-pp-products/
D zope.testing/trunk/src/zope/testing/testrunner-gc.txt
D zope.testing/trunk/src/zope/testing/testrunner-knit.txt
D zope.testing/trunk/src/zope/testing/testrunner-layers-api.txt
D zope.testing/trunk/src/zope/testing/testrunner-layers-ntd.txt
D zope.testing/trunk/src/zope/testing/testrunner-layers.txt
D zope.testing/trunk/src/zope/testing/testrunner-leaks-err.txt
D zope.testing/trunk/src/zope/testing/testrunner-leaks.txt
D zope.testing/trunk/src/zope/testing/testrunner-profiling-cprofiler.txt
D zope.testing/trunk/src/zope/testing/testrunner-profiling.txt
D zope.testing/trunk/src/zope/testing/testrunner-progress.txt
D zope.testing/trunk/src/zope/testing/testrunner-repeat.txt
D zope.testing/trunk/src/zope/testing/testrunner-simple.txt
D zope.testing/trunk/src/zope/testing/testrunner-test-selection.txt
D zope.testing/trunk/src/zope/testing/testrunner-verbose.txt
D zope.testing/trunk/src/zope/testing/testrunner-wo-source.txt
D zope.testing/trunk/src/zope/testing/testrunner.py
D zope.testing/trunk/src/zope/testing/testrunner.txt
U zope.testing/trunk/src/zope/testing/tests.py
-=-
Modified: zope.testing/trunk/README.txt
===================================================================
--- zope.testing/trunk/README.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/README.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -58,7 +58,7 @@
Releases
********
-Next release
+3.6.0 (????/??/??)
============
New Features
@@ -70,6 +70,12 @@
- Added --no-progress and --auto-progress options.
+- Complete refactoring of the test runner into multiple code files and a more
+ modular (pipeline-like) architecture.
+
+- Unified unit tests with the layer support by introducing a real unit test
+ layer.
+
3.5.1 (2007/08/14)
==================
Modified: zope.testing/trunk/setup.py
===================================================================
--- zope.testing/trunk/setup.py 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/setup.py 2008-05-05 18:50:48 UTC (rev 86460)
@@ -32,33 +32,38 @@
extra = {}
chapters = '\n'.join([
- open(os.path.join('src', 'zope', 'testing', name)).read()
+ open(os.path.join('src', 'zope', 'testing', 'testrunner', name)).read()
for name in (
- 'testrunner.txt',
- 'testrunner-simple.txt',
- 'testrunner-layers-api.txt',
- 'testrunner-layers.txt',
- 'testrunner-arguments.txt',
- 'testrunner-verbose.txt',
- 'testrunner-test-selection.txt',
- 'testrunner-progress.txt',
+ 'testrunner.txt',
+ 'testrunner-simple.txt',
+ 'testrunner-layers-api.txt',
+ 'testrunner-layers.txt',
+ 'testrunner-arguments.txt',
+ 'testrunner-verbose.txt',
+ 'testrunner-test-selection.txt',
+ 'testrunner-progress.txt',
-# The following seems to cause weird unicode in the output: :(
-## 'testrunner-errors.txt',
-
- 'testrunner-debugging.txt',
- 'testrunner-layers-ntd.txt',
- 'testrunner-coverage.txt',
- 'testrunner-profiling.txt',
- 'testrunner-wo-source.txt',
- 'testrunner-repeat.txt',
- 'testrunner-gc.txt',
- 'testrunner-leaks.txt',
- 'testrunner-knit.txt',
- 'formparser.txt',
- 'setupstack.txt',
+ # The following seems to cause weird unicode in the output: :(
+ ## 'testrunner-errors.txt',
+
+ 'testrunner-debugging.txt',
+ 'testrunner-layers-ntd.txt',
+ 'testrunner-coverage.txt',
+ 'testrunner-profiling.txt',
+ 'testrunner-wo-source.txt',
+ 'testrunner-repeat.txt',
+ 'testrunner-gc.txt',
+ 'testrunner-leaks.txt',
+ 'testrunner-knit.txt',
)])
+chapters += '\n'.join([
+ open(os.path.join('src', 'zope', 'testing', name)).read()
+ for name in (
+ 'formparser.txt',
+ 'setupstack.txt',
+ )])
+
long_description=(
open('README.txt').read()
+ '\n' +
Copied: zope.testing/trunk/src/zope/testing/testrunner (from rev 86459, zope.testing/branches/ctheune-cleanup/src/zope/testing/testrunner)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-arguments.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-arguments.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-arguments.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,27 +0,0 @@
-Passing arguments explicitly
-============================
-
-In most of the examples here, we set up `sys.argv`. In normal usage,
-the testrunner just uses `sys.argv`. It is possible to pass arguments
-explicitly.
-
- >>> import os.path
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults, 'test --layer 111'.split())
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in N.NNN seconds.
- Set up samplelayers.Layer1 in N.NNN seconds.
- Set up samplelayers.Layer11 in N.NNN seconds.
- Set up samplelayers.Layer111 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer111 in N.NNN seconds.
- Tear down samplelayers.Layerx in N.NNN seconds.
- Tear down samplelayers.Layer11 in N.NNN seconds.
- Tear down samplelayers.Layer1 in N.NNN seconds.
- False
Deleted: zope.testing/trunk/src/zope/testing/testrunner-colors.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-colors.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-colors.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,372 +0,0 @@
-Colorful output
-===============
-
-If you're on a Unix-like system, you can ask for colorized output. The test
-runner emits terminal control sequences to highlight important pieces of
-information (such as the names of failing tests) in different colors.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> from zope.testing import testrunner
-
-Since it wouldn't be a good idea to have terminal control characters in a
-test file, let's wrap sys.stdout in a simple terminal interpreter
-
- >>> import re
- >>> class Terminal(object):
- ... _color_regexp = re.compile('\033[[]([0-9;]*)m')
- ... _colors = {'0': 'normal', '1': 'bold', '30': 'black', '31': 'red',
- ... '32': 'green', '33': 'yellow', '34': 'blue',
- ... '35': 'magenta', '36': 'cyan', '37': 'grey'}
- ... def __init__(self, stream):
- ... self._stream = stream
- ... def __getattr__(self, attr):
- ... return getattr(self._stream, attr)
- ... def isatty(self):
- ... return True
- ... def write(self, text):
- ... if '\033[' in text:
- ... text = self._color_regexp.sub(self._color, text)
- ... self._stream.write(text)
- ... def writelines(self, lines):
- ... for line in lines:
- ... self.write(line)
- ... def _color(self, match):
- ... colorstring = '{'
- ... for number in match.group(1).split(';'):
- ... colorstring += self._colors.get(number, '?')
- ... return colorstring + '}'
-
- >>> real_stdout = sys.stdout
- >>> sys.stdout = Terminal(sys.stdout)
-
-
-Successful test
----------------
-
-A successful test run soothes the developer with warm green colors:
-
- >>> sys.argv = 'test --layer 122 -c'.split()
- >>> testrunner.run(defaults)
- {normal}Running samplelayers.Layer122 tests:{normal}
- Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer12 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer122 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.007{normal} seconds.{normal}
- {normal}Tearing down left over layers:{normal}
- Tear down samplelayers.Layer122 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer12 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer1 in {green}0.000{normal} seconds.
- False
-
-
-Failed test
------------
-
-A failed test run highlights the failures in red:
-
- >>> sys.argv = 'test -c --tests-pattern ^sampletests(f|_e|_f)?$ '.split()
- >>> testrunner.run(defaults)
- {normal}Running unit tests:{normal}
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Failure in test eek (sample2.sampletests_e){normal}
- Failed doctest test for sample2.sampletests_e.eek
- File "testrunner-ex/sample2/sampletests_e.py", line 28, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- {normal}File "{boldblue}testrunner-ex/sample2/sampletests_e.py{normal}", line {boldred}30{normal}, in {boldcyan}sample2.sampletests_e.eek{normal}
- Failed example:
- {cyan} f(){normal}
- Exception raised:
- {red} Traceback (most recent call last):{normal}
- {red} File ".../doctest.py", line 1356, in __run{normal}
- {red} compileflags, 1) in test.globs{normal}
- {red} File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?{normal}
- {red} f(){normal}
- {red} File "testrunner-ex/sample2/sampletests_e.py", line 19, in f{normal}
- {red} g(){normal}
- {red} File "testrunner-ex/sample2/sampletests_e.py", line 24, in g{normal}
- {red} x = y + 1{normal}
- {red} NameError: global name 'y' is not defined{normal}
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Error in test test3 (sample2.sampletests_e.Test){normal}
- Traceback (most recent call last):
- {normal} File "{boldblue}unittest.py{normal}", line {boldred}260{normal}, in {boldcyan}run{normal}
- {cyan} testMethod(){normal}
- {normal} File "{boldblue}testrunner-ex/sample2/sampletests_e.py{normal}", line {boldred}43{normal}, in {boldcyan}test3{normal}
- {cyan} f(){normal}
- {normal} File "{boldblue}testrunner-ex/sample2/sampletests_e.py{normal}", line {boldred}19{normal}, in {boldcyan}f{normal}
- {cyan} g(){normal}
- {normal} File "{boldblue}testrunner-ex/sample2/sampletests_e.py{normal}", line {boldred}24{normal}, in {boldcyan}g{normal}
- {cyan} x = y + 1{normal}
- {red}NameError: global name 'y' is not defined{normal}
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Failure in test testrunner-ex/sample2/e.txt{normal}
- Failed doctest test for e.txt
- File "testrunner-ex/sample2/e.txt", line 0
- <BLANKLINE>
- ----------------------------------------------------------------------
- {normal}File "{boldblue}testrunner-ex/sample2/e.txt{normal}", line {boldred}4{normal}, in {boldcyan}e.txt{normal}
- Failed example:
- {cyan} f(){normal}
- Exception raised:
- {red} Traceback (most recent call last):{normal}
- {red} File ".../doctest.py", line 1356, in __run{normal}
- {red} compileflags, 1) in test.globs{normal}
- {red} File "<doctest e.txt[1]>", line 1, in ?{normal}
- {red} f(){normal}
- {red} File "<doctest e.txt[0]>", line 2, in f{normal}
- {red} return x{normal}
- {red} NameError: global name 'x' is not defined{normal}
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Failure in test test (sample2.sampletests_f.Test){normal}
- Traceback (most recent call last):
- {normal} File "{boldblue}unittest.py{normal}", line {boldred}260{normal}, in {boldcyan}run{normal}
- {cyan} testMethod(){normal}
- {normal} File "{boldblue}testrunner-ex/sample2/sampletests_f.py{normal}", line {boldred}21{normal}, in {boldcyan}test{normal}
- {cyan} self.assertEqual(1,0){normal}
- {normal} File "{boldblue}unittest.py{normal}", line {boldred}333{normal}, in {boldcyan}failUnlessEqual{normal}
- {cyan} raise self.failureException, \{normal}
- {red}AssertionError: 1 != 0{normal}
- <BLANKLINE>
- {normal} Ran {green}200{normal} tests with {boldred}3{normal} failures and {boldred}1{normal} errors in {green}0.045{normal} seconds.{normal}
- {normal}Running samplelayers.Layer1 tests:{normal}
- Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
- {normal} Ran {green}9{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.001{normal} seconds.{normal}
- {normal}Running samplelayers.Layer11 tests:{normal}
- Set up samplelayers.Layer11 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.007{normal} seconds.{normal}
- {normal}Running samplelayers.Layer111 tests:{normal}
- Set up samplelayers.Layerx in {green}0.000{normal} seconds.
- Set up samplelayers.Layer111 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.008{normal} seconds.{normal}
- {normal}Running samplelayers.Layer112 tests:{normal}
- Tear down samplelayers.Layer111 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer112 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.008{normal} seconds.{normal}
- {normal}Running samplelayers.Layer12 tests:{normal}
- Tear down samplelayers.Layer112 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layerx in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer11 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer12 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.007{normal} seconds.{normal}
- {normal}Running samplelayers.Layer121 tests:{normal}
- Set up samplelayers.Layer121 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.007{normal} seconds.{normal}
- {normal}Running samplelayers.Layer122 tests:{normal}
- Tear down samplelayers.Layer121 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer122 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.008{normal} seconds.{normal}
- {normal}Tearing down left over layers:{normal}
- Tear down samplelayers.Layer122 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer12 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer1 in {green}0.000{normal} seconds.
- {normal}Total: {green}413{normal} tests, {boldred}3{normal} failures, {boldred}1{normal} errors in {green}0.023{normal} seconds.{normal}
- True
-
-
-Doctest failures
-----------------
-
-The expected and actual outputs of failed doctests are shown in different
-colors:
-
- >>> sys.argv = 'test --tests-pattern ^pledge$ -c'.split()
- >>> _ = testrunner.run(defaults)
- {normal}Running unit tests:{normal}
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Failure in test pledge (pledge){normal}
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- {normal}File testrunner-ex/pledge.py{normal}", line {boldred}26{normal}, in {boldcyan}pledge.pledge{normal}
- Failed example:
- {cyan} print pledge_template % ('and earthling', 'planet'),{normal}
- Expected:
- {green} I give my pledge, as an earthling,{normal}
- {green} to save, and faithfully, to defend from waste,{normal}
- {green} the natural resources of my planet.{normal}
- {green} It's soils, minerals, forests, waters, and wildlife.{normal}
- Got:
- {red} I give my pledge, as and earthling,{normal}
- {red} to save, and faithfully, to defend from waste,{normal}
- {red} the natural resources of my planet.{normal}
- {red} It's soils, minerals, forests, waters, and wildlife.{normal}
- <BLANKLINE>
- {normal} Ran {green}1{normal} tests with {boldred}1{normal} failures and {green}0{normal} errors in {green}0.002{normal} seconds.{normal}
-
-Diffs are highlighted so you can easily tell the context and the mismatches
-apart:
-
- >>> sys.argv = 'test --tests-pattern ^pledge$ --ndiff -c'.split()
- >>> _ = testrunner.run(defaults)
- {normal}Running unit tests:{normal}
- <BLANKLINE>
- <BLANKLINE>
- {boldred}Failure in test pledge (pledge){normal}
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- {normal}File testrunner-ex/pledge.py{normal}", line {boldred}26{normal}, in {boldcyan}pledge.pledge{normal}
- Failed example:
- {cyan} print pledge_template % ('and earthling', 'planet'),{normal}
- Differences (ndiff with -expected +actual):
- {green} - I give my pledge, as an earthling,{normal}
- {red} + I give my pledge, as and earthling,{normal}
- {magenta} ? +{normal}
- {normal} to save, and faithfully, to defend from waste,{normal}
- {normal} the natural resources of my planet.{normal}
- {normal} It's soils, minerals, forests, waters, and wildlife.{normal}
- <BLANKLINE>
- {normal} Ran {green}1{normal} tests with {boldred}1{normal} failures and {green}0{normal} errors in {green}0.003{normal} seconds.{normal}
-
-
-Timing individual tests
------------------------
-
-At very high verbosity levels you can see the time taken by each test
-
- >>> sys.argv = 'test -u -t test_one.TestNotMuch -c -vvv'.split()
- >>> testrunner.run(defaults)
- {normal}Running tests at level 1{normal}
- {normal}Running unit tests:{normal}
- {normal} Running:{normal}
- test_1 (sample1.sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- test_2 (sample1.sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- test_3 (sample1.sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- test_1 (sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- test_2 (sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- test_3 (sampletests.test_one.TestNotMuch) ({green}N.NNN s{normal})
- {normal} Ran {green}6{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}N.NNN{normal} seconds.{normal}
- False
-
-If we had very slow tests we would see their times highlighted in a different color.
-Instead of creating a test that waits 10 seconds, let's lower the slow test threshold
-in the test runner to 0 seconds to make all of the tests seem slow.
-
- >>> sys.argv = 'test -u -t test_one.TestNotMuch -c -vvv --slow-test 0'.split()
- >>> testrunner.run(defaults)
- {normal}Running tests at level 1{normal}
- {normal}Running unit tests:{normal}
- {normal} Running:{normal}
- test_1 (sample1.sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- test_2 (sample1.sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- test_3 (sample1.sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- test_1 (sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- test_2 (sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- test_3 (sampletests.test_one.TestNotMuch) ({boldmagenta}N.NNN s{normal})
- {normal} Ran {green}6{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}N.NNN{normal} seconds.{normal}
- False
-
-
-Disabling colors
-----------------
-
-If -c or --color have been previously provided on the command line (perhaps by
-a test runner wrapper script), but no colorized output is desired, the -C or
---no-color options will disable colorized output:
-
- >>> sys.argv = 'test --layer 122 -c -C'.split()
- >>> testrunner.run(defaults)
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
- >>> sys.argv = 'test --layer 122 -c --no-color'.split()
- >>> testrunner.run(defaults)
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-
-Autodetecting colors
---------------------
-
-The --auto-color option will determine if stdout is a terminal that supports
-colors, and only enable colorized output if so. Our ``Terminal`` wrapper
-pretends it is a terminal, but the curses module will realize it isn't:
-
- >>> sys.argv = 'test --layer 122 --auto-color'.split()
- >>> testrunner.run(defaults)
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-We can fake it
-
- >>> class FakeCurses(object):
- ... class error(Exception):
- ... pass
- ... def setupterm(self):
- ... pass
- ... def tigetnum(self, attr):
- ... return dict(colors=8).get(attr, -2)
- >>> sys.modules['curses'] = FakeCurses()
-
- >>> sys.argv = 'test --layer 122 --auto-color'.split()
- >>> testrunner.run(defaults)
- {normal}Running samplelayers.Layer122 tests:{normal}
- Set up samplelayers.Layer1 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer12 in {green}0.000{normal} seconds.
- Set up samplelayers.Layer122 in {green}0.000{normal} seconds.
- {normal} Ran {green}34{normal} tests with {green}0{normal} failures and {green}0{normal} errors in {green}0.007{normal} seconds.{normal}
- {normal}Tearing down left over layers:{normal}
- Tear down samplelayers.Layer122 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer12 in {green}0.000{normal} seconds.
- Tear down samplelayers.Layer1 in {green}0.000{normal} seconds.
- False
-
- >>> del sys.modules['curses']
-
-The real stdout is not a terminal in a doctest:
-
- >>> sys.stdout = real_stdout
-
- >>> sys.argv = 'test --layer 122 --auto-color'.split()
- >>> testrunner.run(defaults)
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
Deleted: zope.testing/trunk/src/zope/testing/testrunner-coverage-win32.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-coverage-win32.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-coverage-win32.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,31 +0,0 @@
-Code Coverage
-=============
-
-On Windows drive names can be upper and lower case, these can be
-randomly passed to TestIgnore.names.
-Watch out for the case of the R drive!
-
- >>> class WinOptions(object):
- ... package = None
- ... test_path = [('r:\\winproject\\src\\blah\\foo', ''),
- ... ('R:\\winproject\\src\\blah\\bar', '')]
-
- >>> from zope.testing import testrunner
- >>> ignore = testrunner.TestIgnore(WinOptions())
- >>> ignore._test_dirs
- ['r:\\winproject\\src\\blah\\foo\\', 'R:\\winproject\\src\\blah\\bar\\']
-
-We can now ask whether a particular module should be ignored:
-
- >>> ignore.names('r:\\winproject\\src\\blah\\foo\\baz.py', 'baz')
- False
- >>> ignore.names('R:\\winproject\\src\\blah\\foo\\baz.py', 'baz')
- False
- >>> ignore.names('r:\\winproject\\src\\blah\\bar\\zab.py', 'zab')
- False
- >>> ignore.names('R:\\winproject\\src\\blah\\bar\\zab.py', 'zab')
- False
- >>> ignore.names('r:\\winproject\\src\\blah\\hello.py', 'hello')
- True
- >>> ignore.names('R:\\winproject\\src\\blah\\hello.py', 'hello')
- True
Deleted: zope.testing/trunk/src/zope/testing/testrunner-coverage.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-coverage.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-coverage.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,126 +0,0 @@
-Code Coverage
-=============
-
-If the --coverage option is used, test coverage reports will be generated. The
-directory name given as the parameter will be used to hold the reports.
-
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --coverage=coverage_dir'.split()
-
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in 0.125 seconds.
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Ran 9 tests with 0 failures and 0 errors in 0.003 seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.029 seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.024 seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Set up samplelayers.Layer112 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.024 seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.026 seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.025 seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.025 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- Total: 405 tests, 0 failures, 0 errors in N.NNN seconds.
- lines cov% module (path)
- ...
- 52 92% sample1.sampletests.test1 (testrunner-ex/sample1/sampletests/test1.py)
- 78 94% sample1.sampletests.test11 (testrunner-ex/sample1/sampletests/test11.py)
- 78 94% sample1.sampletests.test111 (testrunner-ex/sample1/sampletests/test111.py)
- 78 94% sample1.sampletests.test112 (testrunner-ex/sample1/sampletests/test112.py)
- 78 94% sample1.sampletests.test12 (testrunner-ex/sample1/sampletests/test12.py)
- 78 94% sample1.sampletests.test121 (testrunner-ex/sample1/sampletests/test121.py)
- 78 94% sample1.sampletests.test122 (testrunner-ex/sample1/sampletests/test122.py)
- ...
- False
-
-The directory specified with the --coverage option will have been created and
-will hold the coverage reports.
-
- >>> os.path.exists('coverage_dir')
- True
- >>> os.listdir('coverage_dir')
- [...]
-
-(We should clean up after ourselves.)
-
- >>> import shutil
- >>> shutil.rmtree('coverage_dir')
-
-
-Ignoring Tests
---------------
-
-The ``trace`` module supports ignoring directories and modules based the test
-selection. Only directories selected for testing should report coverage. The
-test runner provides a custom implementation of the relevant API.
-
-The ``TestIgnore`` class, the class managing the ignoring, is initialized by
-passing the command line options. It uses the options to determine the
-directories that should be covered.
-
- >>> class FauxOptions(object):
- ... package = None
- ... test_path = [('/myproject/src/blah/foo', ''),
- ... ('/myproject/src/blah/bar', '')]
-
- >>> from zope.testing import testrunner
- >>> ignore = testrunner.TestIgnore(FauxOptions())
- >>> ignore._test_dirs
- ['/myproject/src/blah/foo/', '/myproject/src/blah/bar/']
-
-We can now ask whether a particular module should be ignored:
-
- >>> ignore.names('/myproject/src/blah/foo/baz.py', 'baz')
- False
- >>> ignore.names('/myproject/src/blah/bar/mine.py', 'mine')
- False
- >>> ignore.names('/myproject/src/blah/foo/__init__.py', 'foo')
- False
- >>> ignore.names('/myproject/src/blah/hello.py', 'hello')
- True
-
-When running the test runner, modules are sometimes created from text
-strings. Those should *always* be ignored:
-
- >>> ignore.names('/myproject/src/blah/hello.txt', '<string>')
- True
-
-To make this check fast, the class implements a cache. In an early
-implementation, the result was cached by the module name, which was a problem,
-since a lot of modules carry the same name (not the Python dotted name
-here!). So just because a module has the same name in an ignored and tested
-directory, does not mean it is always ignored:
-
- >>> ignore.names('/myproject/src/blah/module.py', 'module')
- True
- >>> ignore.names('/myproject/src/blah/foo/module.py', 'module')
- False
Deleted: zope.testing/trunk/src/zope/testing/testrunner-debugging-layer-setup.test
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-debugging-layer-setup.test 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-debugging-layer-setup.test 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,133 +0,0 @@
-Post-mortem debugging also works when there is a failure in layer
-setup.
-
- >>> import os, shutil, sys, tempfile
- >>> tdir = tempfile.mkdtemp()
- >>> dir = os.path.join(tdir, 'TESTS-DIR')
- >>> os.mkdir(dir)
- >>> open(os.path.join(dir, 'tests.py'), 'w').write(
- ... '''
- ... import doctest
- ...
- ... class Layer:
- ... @classmethod
- ... def setUp(self):
- ... x = 1
- ... raise ValueError
- ...
- ... def a_test():
- ... """
- ... >>> None
- ... """
- ... def test_suite():
- ... suite = doctest.DocTestSuite()
- ... suite.layer = Layer
- ... return suite
- ...
- ... ''')
-
- >>> class Input:
- ... def __init__(self, src):
- ... self.lines = src.split('\n')
- ... def readline(self):
- ... line = self.lines.pop(0)
- ... print line
- ... return line+'\n'
-
- >>> real_stdin = sys.stdin
- >>> if sys.version_info[:2] == (2, 3):
- ... sys.stdin = Input('n\np x\nc')
- ... else:
- ... sys.stdin = Input('p x\nc')
-
- >>> sys.argv = [testrunner_script]
- >>> import zope.testing.testrunner
- >>> try:
- ... zope.testing.testrunner.run(['--path', dir, '-D'])
- ... finally: sys.stdin = real_stdin
- ... # doctest: +ELLIPSIS
- Running tests.Layer tests:
- Set up tests.Layer exceptions.ValueError:
- <BLANKLINE>
- > ...tests.py(8)setUp()
- -> raise ValueError
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Note that post-mortem debugging doesn't work when the layer is run in
-a subprocess:
-
- >>> if sys.version_info[:2] == (2, 3):
- ... sys.stdin = Input('n\np x\nc')
- ... else:
- ... sys.stdin = Input('p x\nc')
-
- >>> open(os.path.join(dir, 'tests2.py'), 'w').write(
- ... '''
- ... import doctest, unittest
- ...
- ... class Layer1:
- ... @classmethod
- ... def setUp(self):
- ... pass
- ...
- ... @classmethod
- ... def tearDown(self):
- ... raise NotImplementedError
- ...
- ... class Layer2:
- ... @classmethod
- ... def setUp(self):
- ... x = 1
- ... raise ValueError
- ...
- ... def a_test():
- ... """
- ... >>> None
- ... """
- ... def test_suite():
- ... suite1 = doctest.DocTestSuite()
- ... suite1.layer = Layer1
- ... suite2 = doctest.DocTestSuite()
- ... suite2.layer = Layer2
- ... return unittest.TestSuite((suite1, suite2))
- ...
- ... ''')
-
- >>> try:
- ... zope.testing.testrunner.run(
- ... ['--path', dir, '-Dvv', '--tests-pattern', 'tests2'])
- ... finally: sys.stdin = real_stdin
- ... # doctest: +ELLIPSIS
- Running tests at level 1
- Running tests2.Layer1 tests:
- Set up tests2.Layer1 in 0.000 seconds.
- Running:
- a_test (tests2)
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
- Running tests2.Layer2 tests:
- Tear down tests2.Layer1 ... not supported
- Running in a subprocess.
- Set up tests2.Layer2
- **********************************************************************
- <BLANKLINE>
- Can't post-mortem debug when running a layer as a subprocess!
- Try running layer 'tests2.Layer2' by itself.
- <BLANKLINE>
- **********************************************************************
- <BLANKLINE>
- Traceback (most recent call last):
- ...
- raise ValueError
- ValueError
- <BLANKLINE>
- <BLANKLINE>
- Tests with errors:
- runTest (__main__.SetUpLayerFailure)
- Total: 1 tests, 0 failures, 1 errors in 0.210 seconds.
- True
-
- >>> shutil.rmtree(tdir)
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-debugging.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-debugging.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-debugging.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,118 +0,0 @@
-Debugging
-=========
-
-The testrunner module supports post-mortem debugging and debugging
-using `pdb.set_trace`. Let's look first at using `pdb.set_trace`.
-To demonstrate this, we'll provide input via helper Input objects:
-
- >>> class Input:
- ... def __init__(self, src):
- ... self.lines = src.split('\n')
- ... def readline(self):
- ... line = self.lines.pop(0)
- ... print line
- ... return line+'\n'
-
-If a test or code called by a test calls pdb.set_trace, then the
-runner will enter pdb at that point:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> from zope.testing import testrunner
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> real_stdin = sys.stdin
- >>> if sys.version_info[:2] == (2, 3):
- ... sys.stdin = Input('n\np x\nc')
- ... else:
- ... sys.stdin = Input('p x\nc')
-
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace1').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +ELLIPSIS
- Running unit tests:...
- > testrunner-ex/sample3/sampletests_d.py(27)test_set_trace1()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
- False
-
-Note that, prior to Python 2.4, calling pdb.set_trace caused pdb to
-break in the pdb.set_trace function. It was necessary to use 'next'
-or 'up' to get to the application code that called pdb.set_trace. In
-Python 2.4, pdb.set_trace causes pdb to stop right after the call to
-pdb.set_trace.
-
-You can also do post-mortem debugging, using the --post-mortem (-D)
-option:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem1 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_post_mortem1 (sample3.sampletests_d.TestSomething)
- Traceback (most recent call last):
- File "testrunner-ex/sample3/sampletests_d.py",
- line 34, in test_post_mortem1
- raise ValueError
- ValueError
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > testrunner-ex/sample3/sampletests_d.py(34)test_post_mortem1()
- -> raise ValueError
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Note that the test runner exits after post-mortem debugging.
-
-In the example above, we debugged an error. Failures are actually
-converted to errors and can be debugged the same way:
-
- >>> sys.stdin = Input('up\np x\np y\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem_failure1 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_post_mortem_failure1 (sample3.sampletests_d.TestSomething)
- Traceback (most recent call last):
- File ".../unittest.py", line 252, in debug
- getattr(self, self.__testMethodName)()
- File "testrunner-ex/sample3/sampletests_d.py",
- line 42, in test_post_mortem_failure1
- self.assertEqual(x, y)
- File ".../unittest.py", line 302, in failUnlessEqual
- raise self.failureException, \
- AssertionError: 1 != 2
- <BLANKLINE>
- exceptions.AssertionError:
- 1 != 2
- > .../unittest.py(302)failUnlessEqual()
- -> ...
- (Pdb) up
- > testrunner-ex/sample3/sampletests_d.py(42)test_post_mortem_failure1()
- -> self.assertEqual(x, y)
- (Pdb) p x
- 1
- (Pdb) p y
- 2
- (Pdb) c
- True
Deleted: zope.testing/trunk/src/zope/testing/testrunner-edge-cases.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-edge-cases.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-edge-cases.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,476 +0,0 @@
-testrunner Edge Cases
-=====================
-
-This document has some edge-case examples to test various aspects of
-the test runner.
-
-Separating Python path and test directories
--------------------------------------------
-
-The --path option defines a directory to be searched for tests *and* a
-directory to be added to Python's search path. The --test-path option
-can be used when you want to set a test search path without also
-affecting the Python path:
-
- >>> import os, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
-
- >>> from zope.testing import testrunner
-
- >>> defaults = [
- ... '--test-path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
- >>> sys.argv = ['test']
- >>> testrunner.run(defaults)
- ... # doctest: +ELLIPSIS
- Test-module import failures:
- <BLANKLINE>
- Module: sampletestsf
- <BLANKLINE>
- ImportError: No module named sampletestsf
- ...
-
- >>> sys.path.append(directory_with_tests)
- >>> sys.argv = ['test']
- >>> testrunner.run(defaults)
- ... # doctest: +ELLIPSIS
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in 0.028 seconds.
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Ran 9 tests with 0 failures and 0 errors in 0.000 seconds.
- ...
-
-Debugging Edge Cases
---------------------
-
- >>> class Input:
- ... def __init__(self, src):
- ... self.lines = src.split('\n')
- ... def readline(self):
- ... line = self.lines.pop(0)
- ... print line
- ... return line+'\n'
-
- >>> real_stdin = sys.stdin
-
-Using pdb.set_trace in a function called by an ordinary test:
-
- >>> if sys.version_info[:2] == (2, 3):
- ... sys.stdin = Input('n\np x\nc')
- ... else:
- ... sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace2').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +ELLIPSIS
- Running unit tests:...
- > testrunner-ex/sample3/sampletests_d.py(47)f()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
- False
-
-Using pdb.set_trace in a function called by a doctest in a doc string:
-
- >>> sys.stdin = Input('n\np x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace4').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- Running unit tests:
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) n
- > testrunner-ex/sample3/sampletests_d.py(42)f()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.002 seconds.
- False
-
-Using pdb in a docstring-based doctest
-
- >>> sys.stdin = Input('n\np x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace3').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- Running unit tests:
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) n
- > <doctest sample3.sampletests_d.set_trace3[1]>(3)...()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.002 seconds.
- False
-
-Using pdb.set_trace in a doc file:
-
-
- >>> sys.stdin = Input('n\np x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace5').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- Running unit tests:
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) n
- > <doctest set_trace5.txt[1]>(3)...()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.002 seconds.
- False
-
-
-Using pdb.set_trace in a function called by a doctest in a doc file:
-
-
- >>> sys.stdin = Input('n\np x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t set_trace6').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- Running unit tests:
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) n
- > testrunner-ex/sample3/sampletests_d.py(42)f()
- -> y = x
- (Pdb) p x
- 1
- (Pdb) c
- Ran 1 tests with 0 failures and 0 errors in 0.002 seconds.
- False
-
-Post-mortem debugging function called from ordinary test:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem2 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_post_mortem2 (sample3.sampletests_d.TestSomething)
- Traceback (most recent call last):
- File "testrunner-ex/sample3/sampletests_d.py",
- line 37, in test_post_mortem2
- g()
- File "testrunner-ex/sample3/sampletests_d.py", line 46, in g
- raise ValueError
- ValueError
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > testrunner-ex/sample3/sampletests_d.py(46)g()
- -> raise ValueError
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-
-Post-mortem debugging docstring-based doctest:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem3 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test post_mortem3 (sample3.sampletests_d)
- Traceback (most recent call last):
- File "zope/testing/doctest.py", line 2276, in debug
- runner.run(self._dt_test)
- File "zope/testing/doctest.py", line 1731, in run
- r = DocTestRunner.run(self, test, compileflags, out, False)
- File "zope/testing/doctest.py", line 1389, in run
- return self.__run(test, compileflags, out)
- File "zope/testing/doctest.py", line 1310, in __run
- exc_info)
- File "zope/testing/doctest.py", line 1737, in report_unexpected_exception
- raise UnexpectedException(test, example, exc_info)
- UnexpectedException:
- from testrunner-ex/sample3/sampletests_d.py:61 (2 examples)>
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > <doctest sample3.sampletests_d.post_mortem3[1]>(1)...()
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Post-mortem debugging function called from docstring-based doctest:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem4 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test post_mortem4 (sample3.sampletests_d)
- Traceback (most recent call last):
- File "zope/testing/doctest.py", line 2276, in debug
- runner.run(self._dt_test)
- File "zope/testing/doctest.py", line 1731, in run
- r = DocTestRunner.run(self, test, compileflags, out, False)
- File "zope/testing/doctest.py", line 1389, in run
- return self.__run(test, compileflags, out)
- File "zope/testing/doctest.py", line 1310, in __run
- exc_info)
- File "zope/testing/doctest.py", line 1737, in report_unexpected_exception
- raise UnexpectedException(test, example, exc_info)
- UnexpectedException: testrunner-ex/sample3/sampletests_d.py:67 (1 example)>
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > testrunner-ex/sample3/sampletests_d.py(46)g()
- -> raise ValueError
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Post-mortem debugging file-based doctest:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem5 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test zope/testing/testrunner-ex/sample3/post_mortem5.txt
- Traceback (most recent call last):
- File "zope/testing/doctest.py", line 2276, in debug
- runner.run(self._dt_test)
- File "zope/testing/doctest.py", line 1731, in run
- r = DocTestRunner.run(self, test, compileflags, out, False)
- File "zope/testing/doctest.py", line 1389, in run
- return self.__run(test, compileflags, out)
- File "zope/testing/doctest.py", line 1310, in __run
- exc_info)
- File "zope/testing/doctest.py", line 1737, in report_unexpected_exception
- raise UnexpectedException(test, example, exc_info)
- UnexpectedException: testrunner-ex/sample3/post_mortem5.txt:0 (2 examples)>
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > <doctest post_mortem5.txt[1]>(1)...()
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-
-Post-mortem debugging function called from file-based doctest:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem6 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test zope/testing/testrunner-ex/sample3/post_mortem6.txt
- Traceback (most recent call last):
- File "zope/testing/doctest.py", line 2276, in debug
- runner.run(self._dt_test)
- File "zope/testing/doctest.py", line 1731, in run
- r = DocTestRunner.run(self, test, compileflags, out, False)
- File "zope/testing/doctest.py", line 1389, in run
- return self.__run(test, compileflags, out)
- File "zope/testing/doctest.py", line 1310, in __run
- exc_info)
- File "zope/testing/doctest.py", line 1737, in report_unexpected_exception
- raise UnexpectedException(test, example, exc_info)
- UnexpectedException: testrunner-ex/sample3/post_mortem6.txt:0 (2 examples)>
- <BLANKLINE>
- exceptions.ValueError:
- <BLANKLINE>
- > testrunner-ex/sample3/sampletests_d.py(46)g()
- -> raise ValueError
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Post-mortem debugging of a docstring doctest failure:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem_failure2 -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test post_mortem_failure2 (sample3.sampletests_d)
- <BLANKLINE>
- File "testrunner-ex/sample3/sampletests_d.py",
- line 81, in sample3.sampletests_d.post_mortem_failure2
- <BLANKLINE>
- x
- <BLANKLINE>
- Want:
- 2
- <BLANKLINE>
- Got:
- 1
- <BLANKLINE>
- <BLANKLINE>
- > testrunner-ex/sample3/sampletests_d.py(81)_()
- exceptions.ValueError:
- Expected and actual output are different
- > <string>(1)...()
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-
-Post-mortem debugging of a docfile doctest failure:
-
- >>> sys.stdin = Input('p x\nc')
- >>> sys.argv = ('test -ssample3 --tests-pattern ^sampletests_d$'
- ... ' -t post_mortem_failure.txt -D').split()
- >>> try: testrunner.run(defaults)
- ... finally: sys.stdin = real_stdin
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Error in test /home/jim/z3/zope.testing/src/zope/testing/testrunner-ex/sample3/post_mortem_failure.txt
- <BLANKLINE>
- File "testrunner-ex/sample3/post_mortem_failure.txt",
- line 2, in post_mortem_failure.txt
- <BLANKLINE>
- x
- <BLANKLINE>
- Want:
- 2
- <BLANKLINE>
- Got:
- 1
- <BLANKLINE>
- <BLANKLINE>
- > testrunner-ex/sample3/post_mortem_failure.txt(2)_()
- exceptions.ValueError:
- Expected and actual output are different
- > <string>(1)...()
- (Pdb) p x
- 1
- (Pdb) c
- True
-
-Post-mortem debugging with triple verbosity
-
- >>> sys.argv = 'test --layer samplelayers.Layer1$ -vvv -D'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Running:
- test_x1 (sampletestsf.TestA1) (0.000 s)
- test_y0 (sampletestsf.TestA1) (0.000 s)
- test_z0 (sampletestsf.TestA1) (0.000 s)
- test_x0 (sampletestsf.TestB1) (0.000 s)
- test_y1 (sampletestsf.TestB1) (0.000 s)
- test_z0 (sampletestsf.TestB1) (0.000 s)
- test_1 (sampletestsf.TestNotMuch1) (0.000 s)
- test_2 (sampletestsf.TestNotMuch1) (0.000 s)
- test_3 (sampletestsf.TestNotMuch1) (0.000 s)
- Ran 9 tests with 0 failures and 0 errors in 0.001 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-Test Suites with None for suites or tests
------------------------------------------
-
- >>> sys.argv = ['test',
- ... '--tests-pattern', '^sampletests_none_suite$',
- ... ]
- >>> testrunner.run(defaults)
- Test-module import failures:
- <BLANKLINE>
- Module: sample1.sampletests_none_suite
- <BLANKLINE>
- TypeError: Invalid test_suite, None, in sample1.sampletests_none_suite
- <BLANKLINE>
- <BLANKLINE>
- Total: 0 tests, 0 failures, 0 errors in N.NNN seconds.
- <BLANKLINE>
- Test-modules with import problems:
- sample1.sampletests_none_suite
- True
-
-
- >>> sys.argv = ['test',
- ... '--tests-pattern', '^sampletests_none_test$',
- ... ]
- >>> testrunner.run(defaults)
- Test-module import failures:
- <BLANKLINE>
- Module: sample1.sampletests_none_test
- <BLANKLINE>
- TypeError: ...
- <BLANKLINE>
- <BLANKLINE>
- Total: 0 tests, 0 failures, 0 errors in N.NNN seconds.
- <BLANKLINE>
- Test-modules with import problems:
- sample1.sampletests_none_test
- True
-
-You must use --repeat with --report-refcounts
----------------------------------------------
-
-It is an error to specify --report-refcounts (-r) without specifying a
-repeat count greater than 1
-
- >>> sys.argv = 'test -r'.split()
- >>> testrunner.run(defaults)
- You must use the --repeat (-N) option to specify a repeat
- count greater than 1 when using the --report_refcounts (-r)
- option.
- <BLANKLINE>
- True
-
- >>> sys.argv = 'test -r -N1'.split()
- >>> testrunner.run(defaults)
- You must use the --repeat (-N) option to specify a repeat
- count greater than 1 when using the --report_refcounts (-r)
- option.
- <BLANKLINE>
- True
Deleted: zope.testing/trunk/src/zope/testing/testrunner-errors.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-errors.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-errors.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,856 +0,0 @@
-Errors and Failures
-===================
-
-Let's look at tests that have errors and failures, first we need to make a
-temporary copy of the entire testing directory (except .svn files which may
-be read only):
-
- >>> import os.path, sys, tempfile, shutil
- >>> tmpdir = tempfile.mkdtemp()
- >>> directory_with_tests = os.path.join(tmpdir, 'testrunner-ex')
- >>> source = os.path.join(this_directory, 'testrunner-ex')
- >>> n = len(source) + 1
- >>> for root, dirs, files in os.walk(source):
- ... dirs[:] = [d for d in dirs if d != ".svn"] # prune cruft
- ... os.mkdir(os.path.join(directory_with_tests, root[n:]))
- ... for f in files:
- ... shutil.copy(os.path.join(root, f),
- ... os.path.join(directory_with_tests, root[n:], f))
-
- >>> from zope.testing import testrunner
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --tests-pattern ^sampletests(f|_e|_f)?$ '.split()
- >>> testrunner.run(defaults)
- ... # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_e)
- Failed doctest test for sample2.sampletests_e.eek
- File "testrunner-ex/sample2/sampletests_e.py", line 28, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_e.py", line 30, in sample2.sampletests_e.eek
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Error in test test3 (sample2.sampletests_e.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_e.py", line 43, in test3
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Failure in test testrunner-ex/sample2/e.txt
- Failed doctest test for e.txt
- File "testrunner-ex/sample2/e.txt", line 0
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/e.txt", line 4, in e.txt
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest e.txt[1]>", line 1, in ?
- f()
- File "<doctest e.txt[0]>", line 2, in f
- return x
- NameError: global name 'x' is not defined
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Failure in test test (sample2.sampletests_f.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_f.py", line 21, in test
- self.assertEqual(1,0)
- File "/usr/local/python/2.3/lib/python2.3/unittest.py", line 302, in failUnlessEqual
- raise self.failureException, \
- AssertionError: 1 != 0
- <BLANKLINE>
- Ran 200 tests with 3 failures and 1 errors in 0.038 seconds.
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Ran 9 tests with 0 failures and 0 errors in 0.000 seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Set up samplelayers.Layer112 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.006 seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.006 seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- Total: 413 tests, 3 failures, 1 errors in N.NNN seconds.
- True
-
-We see that we get an error report and a traceback for the failing
-test. In addition, the test runner returned True, indicating that
-there was an error.
-
-If we ask for verbosity, the dotted output will be interrupted, and
-there'll be a summary of the errors at the end of the test:
-
- >>> sys.argv = 'test --tests-pattern ^sampletests(f|_e|_f)?$ -uv'.split()
- >>> testrunner.run(defaults)
- ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
- Running tests at level 1
- Running unit tests:
- Running:
- .................................................................................................
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_e)
- Failed doctest test for sample2.sampletests_e.eek
- File "testrunner-ex/sample2/sampletests_e.py", line 28, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_e.py", line 30,
- in sample2.sampletests_e.eek
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- ...
- <BLANKLINE>
- <BLANKLINE>
- Error in test test3 (sample2.sampletests_e.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_e.py", line 43, in test3
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- ...
- <BLANKLINE>
- Failure in test testrunner-ex/sample2/e.txt
- Failed doctest test for e.txt
- File "testrunner-ex/sample2/e.txt", line 0
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/e.txt", line 4, in e.txt
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest e.txt[1]>", line 1, in ?
- f()
- File "<doctest e.txt[0]>", line 2, in f
- return x
- NameError: global name 'x' is not defined
- <BLANKLINE>
- .
- <BLANKLINE>
- Failure in test test (sample2.sampletests_f.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_f.py", line 21, in test
- self.assertEqual(1,0)
- File ".../unittest.py", line 302, in failUnlessEqual
- raise self.failureException, \
- AssertionError: 1 != 0
- <BLANKLINE>
- ................................................................................................
- <BLANKLINE>
- Ran 200 tests with 3 failures and 1 errors in 0.040 seconds.
- <BLANKLINE>
- Tests with errors:
- test3 (sample2.sampletests_e.Test)
- <BLANKLINE>
- Tests with failures:
- eek (sample2.sampletests_e)
- testrunner-ex/sample2/e.txt
- test (sample2.sampletests_f.Test)
- True
-
-Similarly for progress output, the progress ticker will be interrupted:
-
- >>> sys.argv = ('test --tests-pattern ^sampletests(f|_e|_f)?$ -u -ssample2'
- ... ' -p').split()
- >>> testrunner.run(defaults)
- ... # doctest: +NORMALIZE_WHITESPACE +REPORT_NDIFF
- Running unit tests:
- Running:
- 1/56 (1.8%)
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_e)
- Failed doctest test for sample2.sampletests_e.eek
- File "testrunner-ex/sample2/sampletests_e.py", line 28, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_e.py", line 30,
- in sample2.sampletests_e.eek
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_e.eek[0]>", line 1, in ?
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- 2/56 (3.6%)\r
- \r
- 3/56 (5.4%)\r
- \r
- 4/56 (7.1%)
- <BLANKLINE>
- Error in test test3 (sample2.sampletests_e.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_e.py", line 43, in test3
- f()
- File "testrunner-ex/sample2/sampletests_e.py", line 19, in f
- g()
- File "testrunner-ex/sample2/sampletests_e.py", line 24, in g
- x = y + 1
- NameError: global name 'y' is not defined
- <BLANKLINE>
- 5/56 (8.9%)\r
- \r
- 6/56 (10.7%)\r
- \r
- 7/56 (12.5%)
- <BLANKLINE>
- Failure in test testrunner-ex/sample2/e.txt
- Failed doctest test for e.txt
- File "testrunner-ex/sample2/e.txt", line 0
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/e.txt", line 4, in e.txt
- Failed example:
- f()
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest e.txt[1]>", line 1, in ?
- f()
- File "<doctest e.txt[0]>", line 2, in f
- return x
- NameError: global name 'x' is not defined
- <BLANKLINE>
- 8/56 (14.3%)
- <BLANKLINE>
- Failure in test test (sample2.sampletests_f.Test)
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sampletests_f.py", line 21, in test
- self.assertEqual(1,0)
- File ".../unittest.py", line 302, in failUnlessEqual
- raise self.failureException, \
- AssertionError: 1 != 0
- <BLANKLINE>
- 9/56 (16.1%)\r
- \r
- 10/56 (17.9%)\r
- \r
- 11/56 (19.6%)\r
- \r
- 12/56 (21.4%)\r
- \r
- 13/56 (23.2%)\r
- \r
- 14/56 (25.0%)\r
- \r
- 15/56 (26.8%)\r
- \r
- 16/56 (28.6%)\r
- \r
- 17/56 (30.4%)\r
- \r
- 18/56 (32.1%)\r
- \r
- 19/56 (33.9%)\r
- \r
- 20/56 (35.7%)\r
- \r
- 24/56 (42.9%)\r
- \r
- 25/56 (44.6%)\r
- \r
- 26/56 (46.4%)\r
- \r
- 27/56 (48.2%)\r
- \r
- 28/56 (50.0%)\r
- \r
- 29/56 (51.8%)\r
- \r
- 30/56 (53.6%)\r
- \r
- 31/56 (55.4%)\r
- \r
- 32/56 (57.1%)\r
- \r
- 33/56 (58.9%)\r
- \r
- 34/56 (60.7%)\r
- \r
- 35/56 (62.5%)\r
- \r
- 36/56 (64.3%)\r
- \r
- 40/56 (71.4%)\r
- \r
- 41/56 (73.2%)\r
- \r
- 42/56 (75.0%)\r
- \r
- 43/56 (76.8%)\r
- \r
- 44/56 (78.6%)\r
- \r
- 45/56 (80.4%)\r
- \r
- 46/56 (82.1%)\r
- \r
- 47/56 (83.9%)\r
- \r
- 48/56 (85.7%)\r
- \r
- 49/56 (87.5%)\r
- \r
- 50/56 (89.3%)\r
- \r
- 51/56 (91.1%)\r
- \r
- 52/56 (92.9%)\r
- \r
- 56/56 (100.0%)\r
- \r
- <BLANKLINE>
- Ran 56 tests with 3 failures and 1 errors in 0.054 seconds.
- True
-
-If you also want a summary of errors at the end, ask for verbosity as well
-as progress output.
-
-
-Suppressing multiple doctest errors
------------------------------------
-
-Often, when a doctest example fails, the failure will cause later
-examples in the same test to fail. Each failure is reported:
-
- >>> sys.argv = 'test --tests-pattern ^sampletests_1$'.split()
- >>> testrunner.run(defaults) # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_1)
- Failed doctest test for sample2.sampletests_1.eek
- File "testrunner-ex/sample2/sampletests_1.py", line 17, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 19,
- in sample2.sampletests_1.eek
- Failed example:
- x = y
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
- x = y
- NameError: name 'y' is not defined
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 21,
- in sample2.sampletests_1.eek
- Failed example:
- x
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[1]>", line 1, in ?
- x
- NameError: name 'x' is not defined
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 24,
- in sample2.sampletests_1.eek
- Failed example:
- z = x + 1
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[2]>", line 1, in ?
- z = x + 1
- NameError: name 'x' is not defined
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
- True
-
-This can be a bit confusing, especially when there are enough tests
-that they scroll off a screen. Often you just want to see the first
-failure. This can be accomplished with the -1 option (for "just show
-me the first failed example in a doctest" :)
-
- >>> sys.argv = 'test --tests-pattern ^sampletests_1$ -1'.split()
- >>> testrunner.run(defaults) # doctest:
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_1)
- Failed doctest test for sample2.sampletests_1.eek
- File "testrunner-ex/sample2/sampletests_1.py", line 17, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 19,
- in sample2.sampletests_1.eek
- Failed example:
- x = y
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
- x = y
- NameError: name 'y' is not defined
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.001 seconds.
- True
-
-The --hide-secondary-failures option is an alias for -1:
-
- >>> sys.argv = (
- ... 'test --tests-pattern ^sampletests_1$'
- ... ' --hide-secondary-failures'
- ... ).split()
- >>> testrunner.run(defaults) # doctest:
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_1)
- Failed doctest test for sample2.sampletests_1.eek
- File "testrunner-ex/sample2/sampletests_1.py", line 17, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 19,
- in sample2.sampletests_1.eek
- Failed example:
- x = y
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
- x = y
- NameError: name 'y' is not defined
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.001 seconds.
- True
-
-The --show-secondary-failures option counters -1 (or it's alias),
-causing the second and subsequent errors to be shown. This is useful
-if -1 is provided by a test script by inserting it ahead of
-command-line options in sys.argv.
-
- >>> sys.argv = (
- ... 'test --tests-pattern ^sampletests_1$'
- ... ' --hide-secondary-failures --show-secondary-failures'
- ... ).split()
- >>> testrunner.run(defaults) # doctest: +NORMALIZE_WHITESPACE
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test eek (sample2.sampletests_1)
- Failed doctest test for sample2.sampletests_1.eek
- File "testrunner-ex/sample2/sampletests_1.py", line 17, in eek
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 19,
- in sample2.sampletests_1.eek
- Failed example:
- x = y
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[0]>", line 1, in ?
- x = y
- NameError: name 'y' is not defined
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 21,
- in sample2.sampletests_1.eek
- Failed example:
- x
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[1]>", line 1, in ?
- x
- NameError: name 'x' is not defined
- ----------------------------------------------------------------------
- File "testrunner-ex/sample2/sampletests_1.py", line 24,
- in sample2.sampletests_1.eek
- Failed example:
- z = x + 1
- Exception raised:
- Traceback (most recent call last):
- File ".../doctest.py", line 1256, in __run
- compileflags, 1) in test.globs
- File "<doctest sample2.sampletests_1.eek[2]>", line 1, in ?
- z = x + 1
- NameError: name 'x' is not defined
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
- True
-
-
-Getting diff output for doctest failures
-----------------------------------------
-
-If a doctest has large expected and actual output, it can be hard to
-see differences when expected and actual output differ. The --ndiff,
---udiff, and --cdiff options can be used to get diff output of various
-kinds.
-
- >>> sys.argv = 'test --tests-pattern ^pledge$'.split()
- >>> _ = testrunner.run(defaults)
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test pledge (pledge)
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/pledge.py", line 26, in pledge.pledge
- Failed example:
- print pledge_template % ('and earthling', 'planet'),
- Expected:
- I give my pledge, as an earthling,
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- It's soils, minerals, forests, waters, and wildlife.
- Got:
- I give my pledge, as and earthling,
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- It's soils, minerals, forests, waters, and wildlife.
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
-
-Here, the actual output uses the word "and" rather than the word "an",
-but it's a bit hard to pick this out. We can use the various diff
-outputs to see this better. We could modify the test to ask for diff
-output, but it's easier to use one of the diff options.
-
-The --ndiff option requests a diff using Python's ndiff utility. This
-is the only method that marks differences within lines as well as
-across lines. For example, if a line of expected output contains digit
-1 where actual output contains letter l, a line is inserted with a
-caret marking the mismatching column positions.
-
- >>> sys.argv = 'test --tests-pattern ^pledge$ --ndiff'.split()
- >>> _ = testrunner.run(defaults)
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test pledge (pledge)
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/pledge.py", line 26, in pledge.pledge
- Failed example:
- print pledge_template % ('and earthling', 'planet'),
- Differences (ndiff with -expected +actual):
- - I give my pledge, as an earthling,
- + I give my pledge, as and earthling,
- ? +
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- It's soils, minerals, forests, waters, and wildlife.
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.003 seconds.
-
-The -udiff option requests a standard "unified" diff:
-
- >>> sys.argv = 'test --tests-pattern ^pledge$ --udiff'.split()
- >>> _ = testrunner.run(defaults)
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test pledge (pledge)
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/pledge.py", line 26, in pledge.pledge
- Failed example:
- print pledge_template % ('and earthling', 'planet'),
- Differences (unified diff with -expected +actual):
- @@ -1,3 +1,3 @@
- -I give my pledge, as an earthling,
- +I give my pledge, as and earthling,
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
-
-The -cdiff option requests a standard "context" diff:
-
- >>> sys.argv = 'test --tests-pattern ^pledge$ --cdiff'.split()
- >>> _ = testrunner.run(defaults)
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure in test pledge (pledge)
- Failed doctest test for pledge.pledge
- File "testrunner-ex/pledge.py", line 24, in pledge
- <BLANKLINE>
- ----------------------------------------------------------------------
- File "testrunner-ex/pledge.py", line 26, in pledge.pledge
- Failed example:
- print pledge_template % ('and earthling', 'planet'),
- Differences (context diff with expected followed by actual):
- ***************
- *** 1,3 ****
- ! I give my pledge, as an earthling,
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- --- 1,3 ----
- ! I give my pledge, as and earthling,
- to save, and faithfully, to defend from waste,
- the natural resources of my planet.
- <BLANKLINE>
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
-
-
-Testing-Module Import Errors
-----------------------------
-
-If there are errors when importing a test module, these errors are
-reported. In order to illustrate a module with a syntax error, we create
-one now: this module used to be checked in to the project, but then it was
-included in distributions of projects using zope.testing too, and distutils
-complained about the syntax error when it compiled Python files during
-installation of such projects. So first we create a module with bad syntax:
-
- >>> badsyntax_path = os.path.join(directory_with_tests,
- ... "sample2", "sampletests_i.py")
- >>> f = open(badsyntax_path, "w")
- >>> print >> f, "importx unittest" # syntax error
- >>> f.close()
-
-Then run the tests:
-
- >>> sys.argv = ('test --tests-pattern ^sampletests(f|_i)?$ --layer 1 '
- ... ).split()
- >>> testrunner.run(defaults)
- ... # doctest: +NORMALIZE_WHITESPACE
- Test-module import failures:
- <BLANKLINE>
- Module: sample2.sampletests_i
- <BLANKLINE>
- File "testrunner-ex/sample2/sampletests_i.py", line 1
- importx unittest
- ^
- SyntaxError: invalid syntax
- <BLANKLINE>
- <BLANKLINE>
- Module: sample2.sample21.sampletests_i
- <BLANKLINE>
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sample21/sampletests_i.py", line 15, in ?
- import zope.testing.huh
- ImportError: No module named huh
- <BLANKLINE>
- <BLANKLINE>
- Module: sample2.sample22.sampletests_i
- <BLANKLINE>
- AttributeError: 'module' object has no attribute 'test_suite'
- <BLANKLINE>
- <BLANKLINE>
- Module: sample2.sample23.sampletests_i
- <BLANKLINE>
- Traceback (most recent call last):
- File "testrunner-ex/sample2/sample23/sampletests_i.py", line 18, in ?
- class Test(unittest.TestCase):
- File "testrunner-ex/sample2/sample23/sampletests_i.py", line 23, in Test
- raise TypeError('eek')
- TypeError: eek
- <BLANKLINE>
- <BLANKLINE>
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Ran 9 tests with 0 failures and 0 errors in 0.000 seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Set up samplelayers.Layer112 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Ran 34 tests with 0 failures and 0 errors in 0.006 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- Total: 213 tests, 0 failures, 0 errors in N.NNN seconds.
- <BLANKLINE>
- Test-modules with import problems:
- sample2.sampletests_i
- sample2.sample21.sampletests_i
- sample2.sample22.sampletests_i
- sample2.sample23.sampletests_i
- True
-
-
-Unicode Errors
---------------
-
-There was a bug preventing decent error reporting when a result contained
-unicode and another not:
-
- >>> sys.argv = 'test --tests-pattern ^unicode$ -u'.split()
- >>> testrunner.run(defaults) # doctest: +REPORT_NDIFF
- Running unit tests:
- <BLANKLINE>
- <BLANKLINE>
- Failure testrunner-ex/unicode.txt
- Failed doctest test for unicode.txt
- testrunner-ex/unicode.txt", line 0
- <BLANKLINE>
- ----------------------------------------------------------------------
- File testrunner-ex/unicode.txt", Line NNN, in unicode.txt
- Failed example:
- print get_unicode()
- Expected:
- oink
- Got:
- foo â bar
- ----------------------------------------------------------------------
- File testrunner-ex/unicode.txt", Line NNN, in unicode.txt
- Failed example:
- 'xyz'
- Expected:
- 123
- Got:
- 'xyz'
- <BLANKLINE>
- Ran 3 tests with 1 failures and 0 errors in N.NNN seconds.
- True
-
-
-Reporting Errors to Calling Processes
--------------------------------------
-
-The testrunner can return an error status, indicating that the tests
-failed. This can be useful for an invoking process that wants to
-monitor the result of a test run.
-
-To use, specify the argument "--exit-with-status".
-
- >>> sys.argv = (
- ... 'test --exit-with-status --tests-pattern ^sampletests_1$'.split())
- >>> try:
- ... testrunner.run(defaults)
- ... except SystemExit, e:
- ... print 'exited with code', e.code
- ... else:
- ... print 'sys.exit was not called'
- ... # doctest: +ELLIPSIS
- Running unit tests:
- ...
- Ran 1 tests with 1 failures and 0 errors in 0.002 seconds.
- exited with code 1
-
-A passing test does not exit.
-
- >>> sys.argv = (
- ... 'test --exit-with-status --tests-pattern ^sampletests$'.split())
- >>> try:
- ... testrunner.run(defaults)
- ... except SystemExit, e2:
- ... print 'oops'
- ... else:
- ... print 'sys.exit was not called'
- ... # doctest: +ELLIPSIS
- Running unit tests:
- ...
- Total: 364 tests, 0 failures, 0 errors in N.NNN seconds.
- ...
- sys.exit was not called
-
-And remove the temporary directory:
-
- >>> shutil.rmtree(tmpdir)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-gc.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-gc.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-gc.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,82 +0,0 @@
-Garbage Collection Control
-==========================
-
-When having problems that seem to be caused my memory-management
-errors, it can be helpful to adjust Python's cyclic garbage collector
-or to get garbage colection statistics. The --gc option can be used
-for this purpose.
-
-If you think you are getting a test failure due to a garbage
-collection problem, you can try disabling garbage collection by
-using the --gc option with a value of zero.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = ['--path', directory_with_tests]
-
- >>> from zope.testing import testrunner
-
- >>> sys.argv = 'test --tests-pattern ^gc0$ --gc 0 -vv'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Cyclic garbage collection is disabled.
- Running unit tests:
- Running:
- make_sure_gc_is_disabled (gc0)
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
-
-Alternatively, if you think you are having a garbage collection
-related problem, you can cause garbage collection to happen more often
-by providing a low threshold:
-
- >>> sys.argv = 'test --tests-pattern ^gc1$ --gc 1 -vv'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Cyclic garbage collection threshold set to: (1,)
- Running unit tests:
- Running:
- make_sure_gc_threshold_is_one (gc1)
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
-
-You can specify up to 3 --gc options to set each of the 3 gc threshold
-values:
-
-
- >>> sys.argv = ('test --tests-pattern ^gcset$ --gc 701 --gc 11 --gc 9 -vv'
- ... .split())
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Cyclic garbage collection threshold set to: (701, 11, 9)
- Running unit tests:
- Running:
- make_sure_gc_threshold_is_701_11_9 (gcset)
- Ran 1 tests with 0 failures and 0 errors in 0.001 seconds.
-
-Garbage Collection Statistics
------------------------------
-
-You can enable gc debugging statistics using the --gc-options (-G)
-option. You should provide names of one or more of the flags
-described in the library documentation for the gc module.
-
-The output statistics are written to standard error.
-
- >>> from StringIO import StringIO
- >>> err = StringIO()
- >>> stderr = sys.stderr
- >>> sys.stderr = err
- >>> sys.argv = ('test --tests-pattern ^gcstats$ -G DEBUG_STATS'
- ... ' -G DEBUG_COLLECTABLE -vv'
- ... .split())
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- generate_some_gc_statistics (gcstats)
- Ran 1 tests with 0 failures and 0 errors in 0.006 seconds.
-
- >>> sys.stderr = stderr
-
- >>> print err.getvalue() # doctest: +ELLIPSIS
- gc: collecting generation ...
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-knit.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-knit.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-knit.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,105 +0,0 @@
-Knitting in extra package directories
-=====================================
-
-Python packages have __path__ variables that can be manipulated to add
-extra directories cntaining software used in the packages. The
-testrunner needs to be given extra information about this sort of
-situation.
-
-Let's look at an example. The testrunner-ex-knit-lib directory
-is a directory that we want to add to the Python path, but that we
-don't want to search for tests. It has a sample4 package and a
-products subpackage. The products subpackage adds the
-testrunner-ex-knit-products to it's __path__. We want to run tests
-from the testrunner-ex-knit-products directory. When we import these
-tests, we need to import them from the sample4.products package. We
-can't use the --path option to name testrunner-ex-knit-products.
-It isn't enough to add the containing directory to the test path
-because then we wouldn't be able to determine the package name
-properly. We might be able to use the --package option to run the
-tests from the sample4/products package, but we want to run tests in
-testrunner-ex that aren't in this package.
-
-We can use the --package-path option in this case. The --package-path
-option is like the --test-path option in that it defines a path to be
-searched for tests without affecting the python path. It differs in
-that it supplied a package name that is added a profex when importing
-any modules found. The --package-path option takes *two* arguments, a
-package name and file path.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> sys.path.append(os.path.join(this_directory, 'testrunner-ex-pp-lib'))
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... '--package-path',
- ... os.path.join(this_directory, 'testrunner-ex-pp-products'),
- ... 'sample4.products',
- ... ]
-
- >>> from zope.testing import testrunner
-
- >>> sys.argv = 'test --layer Layer111 -vv'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Running:
- test_x1 (sample1.sampletests.test111.TestA)
- test_y0 (sample1.sampletests.test111.TestA)
- ...
- test_y0 (sampletests.test111)
- test_z1 (sampletests.test111)
- testrunner-ex/sampletests/../sampletestsl.txt
- test_extra_test_in_products (sample4.products.sampletests.Test)
- test_another_test_in_products (sample4.products.more.sampletests.Test)
- Ran 36 tests with 0 failures and 0 errors in 0.008 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
-
-In the example, the last test, test_extra_test_in_products, came from
-the products directory. As usual, we can select the knit-in packages
-or individual packages within knit-in packages:
-
- >>> sys.argv = 'test --package sample4.products -vv'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Running:
- test_extra_test_in_products (sample4.products.sampletests.Test)
- test_another_test_in_products (sample4.products.more.sampletests.Test)
- Ran 2 tests with 0 failures and 0 errors in 0.000 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
-
- >>> sys.argv = 'test --package sample4.products.more -vv'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer111 in 0.000 seconds.
- Running:
- test_another_test_in_products (sample4.products.more.sampletests.Test)
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer111 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-layers-api.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-layers-api.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-layers-api.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,267 +0,0 @@
-Layers
-======
-
-A Layer is an object providing setup and teardown methods used to setup
-and teardown the environment provided by the layer. It may also provide
-setup and teardown methods used to reset the environment provided by the
-layer between each test.
-
-Layers are generally implemented as classes using class methods.
-
->>> class BaseLayer:
-... def setUp(cls):
-... log('BaseLayer.setUp')
-... setUp = classmethod(setUp)
-...
-... def tearDown(cls):
-... log('BaseLayer.tearDown')
-... tearDown = classmethod(tearDown)
-...
-... def testSetUp(cls):
-... log('BaseLayer.testSetUp')
-... testSetUp = classmethod(testSetUp)
-...
-... def testTearDown(cls):
-... log('BaseLayer.testTearDown')
-... testTearDown = classmethod(testTearDown)
-...
-
-Layers can extend other layers. Note that they do not explicitly
-invoke the setup and teardown methods of other layers - the test runner
-does this for us in order to minimize the number of invocations.
-
->>> class TopLayer(BaseLayer):
-... def setUp(cls):
-... log('TopLayer.setUp')
-... setUp = classmethod(setUp)
-...
-... def tearDown(cls):
-... log('TopLayer.tearDown')
-... tearDown = classmethod(tearDown)
-...
-... def testSetUp(cls):
-... log('TopLayer.testSetUp')
-... testSetUp = classmethod(testSetUp)
-...
-... def testTearDown(cls):
-... log('TopLayer.testTearDown')
-... testTearDown = classmethod(testTearDown)
-...
-
-Tests or test suites specify what layer they need by storing a reference
-in the 'layer' attribute.
-
->>> import unittest
->>> class TestSpecifyingBaseLayer(unittest.TestCase):
-... 'This TestCase explicitly specifies its layer'
-... layer = BaseLayer
-... name = 'TestSpecifyingBaseLayer' # For testing only
-...
-... def setUp(self):
-... log('TestSpecifyingBaseLayer.setUp')
-...
-... def tearDown(self):
-... log('TestSpecifyingBaseLayer.tearDown')
-...
-... def test1(self):
-... log('TestSpecifyingBaseLayer.test1')
-...
-... def test2(self):
-... log('TestSpecifyingBaseLayer.test2')
-...
->>> class TestSpecifyingNoLayer(unittest.TestCase):
-... 'This TestCase specifies no layer'
-... name = 'TestSpecifyingNoLayer' # For testing only
-... def setUp(self):
-... log('TestSpecifyingNoLayer.setUp')
-...
-... def tearDown(self):
-... log('TestSpecifyingNoLayer.tearDown')
-...
-... def test1(self):
-... log('TestSpecifyingNoLayer.test')
-...
-... def test2(self):
-... log('TestSpecifyingNoLayer.test')
-...
-
-Create a TestSuite containing two test suites, one for each of
-TestSpecifyingBaseLayer and TestSpecifyingNoLayer.
-
->>> umbrella_suite = unittest.TestSuite()
->>> umbrella_suite.addTest(unittest.makeSuite(TestSpecifyingBaseLayer))
->>> no_layer_suite = unittest.makeSuite(TestSpecifyingNoLayer)
->>> umbrella_suite.addTest(no_layer_suite)
-
-Before we can run the tests, we need to setup some helpers.
-
->>> from zope.testing import testrunner
->>> from zope.testing.loggingsupport import InstalledHandler
->>> import logging
->>> log_handler = InstalledHandler('zope.testing.tests')
->>> def log(msg):
-... logging.getLogger('zope.testing.tests').info(msg)
->>> def fresh_options():
-... options = testrunner.get_options(['--test-filter', '.*'])
-... options.resume_layer = None
-... options.resume_number = 0
-... return options
-
-Now we run the tests. Note that the BaseLayer was not setup when
-the TestSpecifyingNoLayer was run and setup/torn down around the
-TestSpecifyingBaseLayer tests.
-
->>> succeeded = testrunner.run_with_options(fresh_options(), [umbrella_suite])
-Running unit tests:
- Ran 2 tests with 0 failures and 0 errors in N.NNN seconds.
- Set up BaseLayer in N.NNN seconds.
- Ran 2 tests with 0 failures and 0 errors in N.NNN seconds.
-Tearing down left over layers:
- Tear down BaseLayer in N.NNN seconds.
-Total: 4 tests, 0 failures, 0 errors in N.NNN seconds.
-
-Now lets specify a layer in the suite containing TestSpecifyingNoLayer
-and run the tests again. This demonstrates the other method of specifying
-a layer. This is generally how you specify what layer doctests need.
-
->>> no_layer_suite.layer = BaseLayer
->>> succeeded = testrunner.run_with_options(fresh_options(), [umbrella_suite])
- Set up BaseLayer in N.NNN seconds.
- Ran 4 tests with 0 failures and 0 errors in N.NNN seconds.
-Tearing down left over layers:
- Tear down BaseLayer in N.NNN seconds.
-
-Clear our logged output, as we want to inspect it shortly.
-
->>> log_handler.clear()
-
-Now lets also specify a layer in the TestSpecifyingNoLayer class and rerun
-the tests. This demonstrates that the most specific layer is used. It also
-shows the behavior of nested layers - because TopLayer extends BaseLayer,
-both the BaseLayer and TopLayer environments are setup when the
-TestSpecifyingNoLayer tests are run.
-
->>> TestSpecifyingNoLayer.layer = TopLayer
->>> succeeded = testrunner.run_with_options(fresh_options(), [umbrella_suite])
- Set up BaseLayer in N.NNN seconds.
- Ran 2 tests with 0 failures and 0 errors in N.NNN seconds.
- Set up TopLayer in N.NNN seconds.
- Ran 2 tests with 0 failures and 0 errors in N.NNN seconds.
-Tearing down left over layers:
- Tear down TopLayer in N.NNN seconds.
- Tear down BaseLayer in N.NNN seconds.
-Total: 4 tests, 0 failures, 0 errors in N.NNN seconds.
-
-If we inspect our trace of what methods got called in what order, we can
-see that the layer setup and teardown methods only got called once. We can
-also see that the layer's test setup and teardown methods got called for
-each test using that layer in the right order.
-
->>> def report():
-... for record in log_handler.records:
-... print record.getMessage()
->>> report()
-BaseLayer.setUp
-BaseLayer.testSetUp
-TestSpecifyingBaseLayer.setUp
-TestSpecifyingBaseLayer.test1
-TestSpecifyingBaseLayer.tearDown
-BaseLayer.testTearDown
-BaseLayer.testSetUp
-TestSpecifyingBaseLayer.setUp
-TestSpecifyingBaseLayer.test2
-TestSpecifyingBaseLayer.tearDown
-BaseLayer.testTearDown
-TopLayer.setUp
-BaseLayer.testSetUp
-TopLayer.testSetUp
-TestSpecifyingNoLayer.setUp
-TestSpecifyingNoLayer.test
-TestSpecifyingNoLayer.tearDown
-TopLayer.testTearDown
-BaseLayer.testTearDown
-BaseLayer.testSetUp
-TopLayer.testSetUp
-TestSpecifyingNoLayer.setUp
-TestSpecifyingNoLayer.test
-TestSpecifyingNoLayer.tearDown
-TopLayer.testTearDown
-BaseLayer.testTearDown
-TopLayer.tearDown
-BaseLayer.tearDown
-
-Now lets stack a few more layers to ensure that our setUp and tearDown
-methods are called in the correct order.
-
->>> from zope.testing.testrunner import name_from_layer
->>> class A(object):
-... def setUp(cls):
-... log('%s.setUp' % name_from_layer(cls))
-... setUp = classmethod(setUp)
-...
-... def tearDown(cls):
-... log('%s.tearDown' % name_from_layer(cls))
-... tearDown = classmethod(tearDown)
-...
-... def testSetUp(cls):
-... log('%s.testSetUp' % name_from_layer(cls))
-... testSetUp = classmethod(testSetUp)
-...
-... def testTearDown(cls):
-... log('%s.testTearDown' % name_from_layer(cls))
-... testTearDown = classmethod(testTearDown)
-...
->>> class B(A): pass
->>> class C(B): pass
->>> class D(A): pass
->>> class E(D): pass
->>> class F(C,E): pass
-
->>> class DeepTest(unittest.TestCase):
-... layer = F
-... def test(self):
-... pass
->>> suite = unittest.makeSuite(DeepTest)
->>> log_handler.clear()
->>> succeeded = testrunner.run_with_options(fresh_options(), [suite])
- Set up A in 0.000 seconds.
- Set up B in 0.000 seconds.
- Set up C in 0.000 seconds.
- Set up D in 0.000 seconds.
- Set up E in 0.000 seconds.
- Set up F in 0.000 seconds.
- Ran 1 tests with 0 failures and 0 errors in 0.003 seconds.
-Tearing down left over layers:
- Tear down F in 0.000 seconds.
- Tear down E in 0.000 seconds.
- Tear down D in 0.000 seconds.
- Tear down C in 0.000 seconds.
- Tear down B in 0.000 seconds.
- Tear down A in 0.000 seconds.
-
->>> report()
-A.setUp
-B.setUp
-C.setUp
-D.setUp
-E.setUp
-F.setUp
-A.testSetUp
-B.testSetUp
-C.testSetUp
-D.testSetUp
-E.testSetUp
-F.testSetUp
-F.testTearDown
-E.testTearDown
-D.testTearDown
-C.testTearDown
-B.testTearDown
-A.testTearDown
-F.tearDown
-E.tearDown
-D.tearDown
-C.tearDown
-B.tearDown
-A.tearDown
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-layers-ntd.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-layers-ntd.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-layers-ntd.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,240 +0,0 @@
-Layers that can't be torn down
-==============================
-
-A layer can have a tearDown method that raises NotImplementedError.
-If this is the case and there are no remaining tests to run, the test
-runner will just note that the tear down couldn't be done:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> from zope.testing import testrunner
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test -ssample2 --tests-pattern sampletests_ntd$'.split()
- >>> testrunner.run(defaults)
- Running sample2.sampletests_ntd.Layer tests:
- Set up sample2.sampletests_ntd.Layer in 0.000 seconds.
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- Tearing down left over layers:
- Tear down sample2.sampletests_ntd.Layer ... not supported
- False
-
-If the tearDown method raises NotImplementedError and there are remaining
-layers to run, the test runner will restart itself as a new process,
-resuming tests where it left off:
-
- >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntd$']
- >>> testrunner.run(defaults)
- Running sample1.sampletests_ntd.Layer tests:
- Set up sample1.sampletests_ntd.Layer in N.NNN seconds.
- Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
- Running sample2.sampletests_ntd.Layer tests:
- Tear down sample1.sampletests_ntd.Layer ... not supported
- Running in a subprocess.
- Set up sample2.sampletests_ntd.Layer in N.NNN seconds.
- Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
- Tear down sample2.sampletests_ntd.Layer ... not supported
- Running sample3.sampletests_ntd.Layer tests:
- Running in a subprocess.
- Set up sample3.sampletests_ntd.Layer in N.NNN seconds.
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_error1 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_error1
- raise TypeError("Can we see errors")
- TypeError: Can we see errors
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_error2 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_error2
- raise TypeError("I hope so")
- TypeError: I hope so
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Failure in test test_fail1 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_fail1
- self.assertEqual(1, 2)
- AssertionError: 1 != 2
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Failure in test test_fail2 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_fail2
- self.assertEqual(1, 3)
- AssertionError: 1 != 3
- <BLANKLINE>
- Ran 6 tests with 2 failures and 2 errors in N.NNN seconds.
- Tear down sample3.sampletests_ntd.Layer ... not supported
- Total: 8 tests, 2 failures, 2 errors in N.NNN seconds.
- True
-
-in the example above, some of the tests run as a subprocess had errors
-and failures. They were displayed as usual and the failure and error
-statistice were updated as usual.
-
-Note that debugging doesn't work when running tests in a subprocess:
-
- >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntd$',
- ... '-D', ]
- >>> testrunner.run(defaults)
- Running sample1.sampletests_ntd.Layer tests:
- Set up sample1.sampletests_ntd.Layer in N.NNN seconds.
- Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
- Running sample2.sampletests_ntd.Layer tests:
- Tear down sample1.sampletests_ntd.Layer ... not supported
- Running in a subprocess.
- Set up sample2.sampletests_ntd.Layer in N.NNN seconds.
- Ran 1 tests with 0 failures and 0 errors in N.NNN seconds.
- Tear down sample2.sampletests_ntd.Layer ... not supported
- Running sample3.sampletests_ntd.Layer tests:
- Running in a subprocess.
- Set up sample3.sampletests_ntd.Layer in N.NNN seconds.
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_error1 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_error1
- raise TypeError("Can we see errors")
- TypeError: Can we see errors
- <BLANKLINE>
- <BLANKLINE>
- **********************************************************************
- Can't post-mortem debug when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_error2 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_error2
- raise TypeError("I hope so")
- TypeError: I hope so
- <BLANKLINE>
- <BLANKLINE>
- **********************************************************************
- Can't post-mortem debug when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_fail1 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_fail1
- self.assertEqual(1, 2)
- AssertionError: 1 != 2
- <BLANKLINE>
- <BLANKLINE>
- **********************************************************************
- Can't post-mortem debug when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- <BLANKLINE>
- <BLANKLINE>
- Error in test test_fail2 (sample3.sampletests_ntd.TestSomething)
- Traceback (most recent call last):
- testrunner-ex/sample3/sampletests_ntd.py", Line NNN, in test_fail2
- self.assertEqual(1, 3)
- AssertionError: 1 != 3
- <BLANKLINE>
- <BLANKLINE>
- **********************************************************************
- Can't post-mortem debug when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- Ran 6 tests with 0 failures and 4 errors in N.NNN seconds.
- Tear down sample3.sampletests_ntd.Layer ... not supported
- Total: 8 tests, 0 failures, 4 errors in N.NNN seconds.
- True
-
-Similarly, pdb.set_trace doesn't work when running tests in a layer
-that is run as a subprocess:
-
- >>> sys.argv = [testrunner_script, '--tests-pattern', 'sampletests_ntds']
- >>> testrunner.run(defaults)
- Running sample1.sampletests_ntds.Layer tests:
- Set up sample1.sampletests_ntds.Layer in 0.000 seconds.
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- Running sample2.sampletests_ntds.Layer tests:
- Tear down sample1.sampletests_ntds.Layer ... not supported
- Running in a subprocess.
- Set up sample2.sampletests_ntds.Layer in 0.000 seconds.
- --Return--
- > testrunner-ex/sample2/sampletests_ntds.py(37)test_something()->None
- -> import pdb; pdb.set_trace()
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > testrunner-ex/sample2/sampletests_ntds.py(40)test_something2()->None
- -> import pdb; pdb.set_trace()
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > testrunner-ex/sample2/sampletests_ntds.py(43)test_something3()->None
- -> import pdb; pdb.set_trace()
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > testrunner-ex/sample2/sampletests_ntds.py(46)test_something4()->None
- -> import pdb; pdb.set_trace()
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > testrunner-ex/sample2/sampletests_ntds.py(52)f()->None
- -> import pdb; pdb.set_trace()
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- --Return--
- > doctest.py(351)set_trace()->None
- -> pdb.Pdb.set_trace(self)
- (Pdb) c
- <BLANKLINE>
- **********************************************************************
- Can't use pdb.set_trace when running a layer as a subprocess!
- **********************************************************************
- <BLANKLINE>
- Ran 7 tests with 0 failures and 0 errors in 0.008 seconds.
- Tear down sample2.sampletests_ntds.Layer ... not supported
- Total: 8 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-If you want to use pdb from a test in a layer that is run as a
-subprocess, then rerun the test runner selecting *just* that layer so
-that it's not run as a subprocess.
Deleted: zope.testing/trunk/src/zope/testing/testrunner-layers.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-layers.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-layers.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,117 +0,0 @@
-Layer Selection
-===============
-
-We can select which layers to run using the --layer option:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --layer 112 --layer unit'.split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer112 tests:
- Set up samplelayers.Layerx in N.NNN seconds.
- Set up samplelayers.Layer1 in N.NNN seconds.
- Set up samplelayers.Layer11 in N.NNN seconds.
- Set up samplelayers.Layer112 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer112 in N.NNN seconds.
- Tear down samplelayers.Layerx in N.NNN seconds.
- Tear down samplelayers.Layer11 in N.NNN seconds.
- Tear down samplelayers.Layer1 in N.NNN seconds.
- Total: 226 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-We can also specify that we want to run only the unit tests:
-
- >>> sys.argv = 'test -u'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in 0.033 seconds.
- False
-
-Or that we want to run all of the tests except for the unit tests:
-
- >>> sys.argv = 'test -f'.split()
- >>> testrunner.run(defaults)
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in N.NNN seconds.
- Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in N.NNN seconds.
- Set up samplelayers.Layer111 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in N.NNN seconds.
- Set up samplelayers.Layer112 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in N.NNN seconds.
- Tear down samplelayers.Layerx in N.NNN seconds.
- Tear down samplelayers.Layer11 in N.NNN seconds.
- Set up samplelayers.Layer12 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in N.NNN seconds.
- Set up samplelayers.Layer122 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in N.NNN seconds.
- Tear down samplelayers.Layer12 in N.NNN seconds.
- Tear down samplelayers.Layer1 in N.NNN seconds.
- Total: 213 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-Or we can explicitly say that we want both unit and non-unit tests.
-
- >>> sys.argv = 'test -uf'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in 0.033 seconds.
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in N.NNN seconds.
- Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in N.NNN seconds.
- Set up samplelayers.Layer111 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in N.NNN seconds.
- Set up samplelayers.Layer112 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in N.NNN seconds.
- Tear down samplelayers.Layerx in N.NNN seconds.
- Tear down samplelayers.Layer11 in N.NNN seconds.
- Set up samplelayers.Layer12 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in N.NNN seconds.
- Set up samplelayers.Layer122 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in N.NNN seconds.
- Tear down samplelayers.Layer12 in N.NNN seconds.
- Tear down samplelayers.Layer1 in N.NNN seconds.
- Total: 405 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-leaks-err.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-leaks-err.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-leaks-err.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,22 +0,0 @@
-Debugging Memory Leaks without a debug build of Python
-======================================================
-
-To use the --report-refcounts (-r) to detect or debug memory leaks,
-you must have a debug build of Python. Without a debug build, you will
-get an error message:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> from zope.testing import testrunner
-
- >>> sys.argv = 'test -r -N6'.split()
- >>> _ = testrunner.run(defaults)
- The Python you are running was not configured
- with --with-pydebug. This is required to use
- the --report-refcounts option.
- <BLANKLINE>
Deleted: zope.testing/trunk/src/zope/testing/testrunner-leaks.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-leaks.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-leaks.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,218 +0,0 @@
-Debugging Memory Leaks
-======================
-
-The --report-refcounts (-r) option can be used with the --repeat (-N)
-option to detect and diagnose memory leaks. To use this option, you
-must configure Python with the --with-pydebug option. (On Unix, pass
-this option to configure and then build Python.)
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> from zope.testing import testrunner
-
- >>> sys.argv = 'test --layer Layer11$ --layer Layer12$ -N4 -r'.split()
- >>> _ = testrunner.run(defaults)
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer11 in 0.000 seconds.
- Iteration 1
- Ran 34 tests with 0 failures and 0 errors in 0.013 seconds.
- Iteration 2
- Ran 34 tests with 0 failures and 0 errors in 0.012 seconds.
- sys refcount=100401 change=0
- Iteration 3
- Ran 34 tests with 0 failures and 0 errors in 0.012 seconds.
- sys refcount=100401 change=0
- Iteration 4
- Ran 34 tests with 0 failures and 0 errors in 0.013 seconds.
- sys refcount=100401 change=0
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Iteration 1
- Ran 34 tests with 0 failures and 0 errors in 0.013 seconds.
- Iteration 2
- Ran 34 tests with 0 failures and 0 errors in 0.012 seconds.
- sys refcount=100411 change=0
- Iteration 3
- Ran 34 tests with 0 failures and 0 errors in 0.012 seconds.
- sys refcount=100411 change=0
- Iteration 4
- Ran 34 tests with 0 failures and 0 errors in 0.012 seconds.
- sys refcount=100411 change=0
- Tearing down left over layers:
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- Total: 68 tests, 0 failures, 0 errors in N.NNN seconds.
-
-Each layer is repeated the requested number of times. For each
-iteration after the first, the system refcount and change in system
-refcount is shown. The system refcount is the total of all refcount in
-the system. When a refcount on any object is changed, the system
-refcount is changed by the same amount. Tests that don't leak show
-zero changes in systen refcount.
-
-Let's look at an example test that leaks:
-
- >>> sys.argv = 'test --tests-pattern leak -N4 -r'.split()
- >>> _ = testrunner.run(defaults)
- Running unit tests:
- Iteration 1
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- Iteration 2
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sys refcount=92506 change=12
- Iteration 3
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sys refcount=92513 change=12
- Iteration 4
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sys refcount=92520 change=12
-
-Here we see that the system refcount is increating. If we specify a
-verbosity greater than one, we can get details broken out by object
-type (or class):
-
- >>> sys.argv = 'test --tests-pattern leak -N5 -r -v'.split()
- >>> _ = testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Iteration 1
- Running:
- .
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- Iteration 2
- Running:
- .
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sum detail refcount=95832 sys refcount=105668 change=16
- Leak details, changes in instances and refcounts by type/class:
- type/class insts refs
- ------------------------------------------------------- ----- ----
- classobj 0 1
- dict 2 2
- float 1 1
- int 2 2
- leak.ClassicLeakable 1 1
- leak.Leakable 1 1
- str 0 4
- tuple 1 1
- type 0 3
- ------------------------------------------------------- ----- ----
- total 8 16
- Iteration 3
- Running:
- .
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sum detail refcount=95844 sys refcount=105680 change=12
- Leak details, changes in instances and refcounts by type/class:
- type/class insts refs
- ------------------------------------------------------- ----- ----
- classobj 0 1
- dict 2 2
- float 1 1
- int -1 0
- leak.ClassicLeakable 1 1
- leak.Leakable 1 1
- str 0 4
- tuple 1 1
- type 0 1
- ------------------------------------------------------- ----- ----
- total 5 12
- Iteration 4
- Running:
- .
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sum detail refcount=95856 sys refcount=105692 change=12
- Leak details, changes in instances and refcounts by type/class:
- type/class insts refs
- ------------------------------------------------------- ----- ----
- classobj 0 1
- dict 2 2
- float 1 1
- leak.ClassicLeakable 1 1
- leak.Leakable 1 1
- str 0 4
- tuple 1 1
- type 0 1
- ------------------------------------------------------- ----- ----
- total 6 12
- Iteration 5
- Running:
- .
- Ran 1 tests with 0 failures and 0 errors in 0.000 seconds.
- sum detail refcount=95868 sys refcount=105704 change=12
- Leak details, changes in instances and refcounts by type/class:
- type/class insts refs
- ------------------------------------------------------- ----- ----
- classobj 0 1
- dict 2 2
- float 1 1
- leak.ClassicLeakable 1 1
- leak.Leakable 1 1
- str 0 4
- tuple 1 1
- type 0 1
- ------------------------------------------------------- ----- ----
- total 6 12
-
-It is instructive to analyze the results in some detail. The test
-being run was designed to intentionally leak:
-
- class ClassicLeakable:
- def __init__(self):
- self.x = 'x'
-
- class Leakable(object):
- def __init__(self):
- self.x = 'x'
-
- leaked = []
-
- class TestSomething(unittest.TestCase):
-
- def testleak(self):
- leaked.append((ClassicLeakable(), Leakable(), time.time()))
-
-Let's go through this by type.
-
-float, leak.ClassicLeakable, leak.Leakable, and tuple
- We leak one of these every time. This is to be expected because
- we are adding one of these to the list every time.
-
-str
- We don't leak any instances, but we leak 4 references. These are
- due to the instance attributes avd values.
-
-dict
- We leak 2 of these, one for each ClassicLeakable and Leakable
- instance.
-
-classobj
- We increase the number of classobj instance references by one each
- time because each ClassicLeakable instance has a reference to its
- class. This instances increases the references in it's class,
- which increases the total number of references to classic classes
- (clasobj instances).
-
-type
- For most interations, we increase the number of type references by
- one for the same reason we increase the number of clasobj
- references by one. The increase of the number of type references
- by 3 in the second iteration is puzzling, but illustrates that
- this sort of data is often puzzling.
-
-int
- The change in the number of int instances and references in this
- example is a side effect of the statistics being gathered. Lots
- of integers are created to keep the memory statistics used here.
-
-The summary statistics include the sum of the detail refcounts. (Note
-that this sum is less than the system refcount. This is because the
-detailed analysis doesn't inspect every object. Not all objects in the
-system are returned by sys.getobjects.)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-profiling-cprofiler.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-profiling-cprofiler.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-profiling-cprofiler.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,54 +0,0 @@
-Profiling
-=========
-
-The testrunner includes the ability to profile the test execution with cProfile
-via the `--profile=cProfile` option::
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> sys.path.append(directory_with_tests)
-
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = [testrunner_script, '--profile=cProfile']
-
-When the tests are run, we get profiling output::
-
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running unit tests:
- ...
- Running samplelayers.Layer1 tests:
- ...
- Running samplelayers.Layer11 tests:
- ...
- Total: ... tests, 0 failures, 0 errors in ... seconds.
- ...
- ncalls tottime percall cumtime percall filename:lineno(function)...
-
-Profiling also works across layers::
-
- >>> sys.argv = [testrunner_script, '-ssample2', '--profile=cProfile',
- ... '--tests-pattern', 'sampletests_ntd']
- >>> testrunner.run(defaults)
- Running...
- Tear down ... not supported...
- ncalls tottime percall cumtime percall filename:lineno(function)...
-
-The testrunner creates temnporary files containing cProfiler profiler
-data::
-
- >>> import glob
- >>> files = list(glob.glob('tests_profile.*.prof'))
- >>> files.sort()
- >>> files
- ['tests_profile.cZj2jt.prof', 'tests_profile.yHD-so.prof']
-
-It deletes these when rerun. We'll delete these ourselves::
-
- >>> import os
- >>> for f in files:
- ... os.unlink(f)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-profiling.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-profiling.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-profiling.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,54 +0,0 @@
-Profiling
-=========
-
-The testrunner includes the ability to profile the test execution with hotshot
-via the --profile option.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> sys.path.append(directory_with_tests)
-
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = [testrunner_script, '--profile=hotshot']
-
-When the tests are run, we get profiling output.
-
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running unit tests:
- ...
- Running samplelayers.Layer1 tests:
- ...
- Running samplelayers.Layer11 tests:
- ...
- Total: ... tests, 0 failures, 0 errors in ... seconds.
- ...
- ncalls tottime percall cumtime percall filename:lineno(function)...
-
-Profiling also works across layers.
-
- >>> sys.argv = [testrunner_script, '-ssample2', '--profile=hotshot',
- ... '--tests-pattern', 'sampletests_ntd']
- >>> testrunner.run(defaults)
- Running...
- Tear down ... not supported...
- ncalls tottime percall cumtime percall filename:lineno(function)...
-
-The testrunner creates temnporary files containing hotshot profiler
-data:
-
- >>> import glob
- >>> files = list(glob.glob('tests_profile.*.prof'))
- >>> files.sort()
- >>> files
- ['tests_profile.cZj2jt.prof', 'tests_profile.yHD-so.prof']
-
-It deletes these when rerun. We'll delete these ourselves:
-
- >>> import os
- >>> for f in files:
- ... os.unlink(f)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-progress.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-progress.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-progress.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,428 +0,0 @@
-Test Progress
-=============
-
-If the --progress (-p) option is used, progress information is printed and
-a carriage return (rather than a new-line) is printed between
-detail lines. Let's look at the effect of --progress (-p) at different
-levels of verbosity.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --layer 122 -p'.split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- 1/34 (2.9%)\r
- \r
- 2/34 (5.9%)\r
- \r
- 3/34 (8.8%)\r
- \r
- 4/34 (11.8%)\r
- \r
- 5/34 (14.7%)\r
- \r
- 6/34 (17.6%)\r
- \r
- 7/34 (20.6%)\r
- \r
- 8/34 (23.5%)\r
- \r
- 9/34 (26.5%)\r
- \r
- 10/34 (29.4%)\r
- \r
- 11/34 (32.4%)\r
- \r
- 12/34 (35.3%)\r
- \r
- 17/34 (50.0%)\r
- \r
- 18/34 (52.9%)\r
- \r
- 19/34 (55.9%)\r
- \r
- 20/34 (58.8%)\r
- \r
- 21/34 (61.8%)\r
- \r
- 22/34 (64.7%)\r
- \r
- 23/34 (67.6%)\r
- \r
- 24/34 (70.6%)\r
- \r
- 25/34 (73.5%)\r
- \r
- 26/34 (76.5%)\r
- \r
- 27/34 (79.4%)\r
- \r
- 28/34 (82.4%)\r
- \r
- 29/34 (85.3%)\r
- \r
- 34/34 (100.0%)\r
- \r
- <BLANKLINE>
- Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-(Note that, in the examples above and below, we show "\r" followed by
-new lines where carriage returns would appear in actual output.)
-
-Using a single level of verbosity causes test descriptions to be
-output, but only if they fit in the terminal width. The default
-width, when the terminal width can't be determined, is 80:
-
->>> sys.argv = 'test --layer 122 -pv'.split()
->>> testrunner.run(defaults)
-Running tests at level 1
-Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- 1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)\r
- \r
- 2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)\r
- \r
- 3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)\r
- \r
- 4/34 (11.8%) test_x0 (sample1.sampletests.test122.TestB)\r
- \r
- 5/34 (14.7%) test_y1 (sample1.sampletests.test122.TestB)\r
- \r
- 6/34 (17.6%) test_z0 (sample1.sampletests.test122.TestB)\r
- \r
- 7/34 (20.6%) test_1 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 8/34 (23.5%) test_2 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 9/34 (26.5%) test_3 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 10/34 (29.4%) test_x0 (sample1.sampletests.test122)\r
- \r
- 11/34 (32.4%) test_y0 (sample1.sampletests.test122)\r
- \r
- 12/34 (35.3%) test_z1 (sample1.sampletests.test122)\r
- \r
- 17/34 (50.0%) ... /testrunner-ex/sample1/sampletests/../../sampletestsl.txt\r
- \r
- 18/34 (52.9%) test_x1 (sampletests.test122.TestA)\r
- \r
- 19/34 (55.9%) test_y0 (sampletests.test122.TestA)\r
- \r
- 20/34 (58.8%) test_z0 (sampletests.test122.TestA)\r
- \r
- 21/34 (61.8%) test_x0 (sampletests.test122.TestB)\r
- \r
- 22/34 (64.7%) test_y1 (sampletests.test122.TestB)\r
- \r
- 23/34 (67.6%) test_z0 (sampletests.test122.TestB)\r
- \r
- 24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)\r
- \r
- 25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)\r
- \r
- 26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)\r
- \r
- 27/34 (79.4%) test_x0 (sampletests.test122)\r
- \r
- 28/34 (82.4%) test_y0 (sampletests.test122)\r
- \r
- 29/34 (85.3%) test_z1 (sampletests.test122)\r
- \r
- 34/34 (100.0%) ... pe/testing/testrunner-ex/sampletests/../sampletestsl.txt\r
- \r
-<BLANKLINE>
- Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
-Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
-False
-
-The terminal width is determined using the curses module. To see
-that, we'll provide a fake curses module:
-
- >>> class FakeCurses:
- ... def setupterm(self):
- ... pass
- ... def tigetnum(self, ignored):
- ... return 60
- >>> old_curses = sys.modules.get('curses')
- >>> sys.modules['curses'] = FakeCurses()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- 1/34 (2.9%) test_x1 (sample1.sampletests.test122.TestA)\r
- \r
- 2/34 (5.9%) test_y0 (sample1.sampletests.test122.TestA)\r
- \r
- 3/34 (8.8%) test_z0 (sample1.sampletests.test122.TestA)\r
- \r
- 4/34 (11.8%) test_x0 (...le1.sampletests.test122.TestB)\r
- \r
- 5/34 (14.7%) test_y1 (...le1.sampletests.test122.TestB)\r
- \r
- 6/34 (17.6%) test_z0 (...le1.sampletests.test122.TestB)\r
- \r
- 7/34 (20.6%) test_1 (...ampletests.test122.TestNotMuch)\r
- \r
- 8/34 (23.5%) test_2 (...ampletests.test122.TestNotMuch)\r
- \r
- 9/34 (26.5%) test_3 (...ampletests.test122.TestNotMuch)\r
- \r
- 10/34 (29.4%) test_x0 (sample1.sampletests.test122)\r
- \r
- 11/34 (32.4%) test_y0 (sample1.sampletests.test122)\r
- \r
- 12/34 (35.3%) test_z1 (sample1.sampletests.test122)\r
- \r
- 17/34 (50.0%) ... e1/sampletests/../../sampletestsl.txt\r
- \r
- 18/34 (52.9%) test_x1 (sampletests.test122.TestA)\r
- \r
- 19/34 (55.9%) test_y0 (sampletests.test122.TestA)\r
- \r
- 20/34 (58.8%) test_z0 (sampletests.test122.TestA)\r
- \r
- 21/34 (61.8%) test_x0 (sampletests.test122.TestB)\r
- \r
- 22/34 (64.7%) test_y1 (sampletests.test122.TestB)\r
- \r
- 23/34 (67.6%) test_z0 (sampletests.test122.TestB)\r
- \r
- 24/34 (70.6%) test_1 (sampletests.test122.TestNotMuch)\r
- \r
- 25/34 (73.5%) test_2 (sampletests.test122.TestNotMuch)\r
- \r
- 26/34 (76.5%) test_3 (sampletests.test122.TestNotMuch)\r
- \r
- 27/34 (79.4%) test_x0 (sampletests.test122)\r
- \r
- 28/34 (82.4%) test_y0 (sampletests.test122)\r
- \r
- 29/34 (85.3%) test_z1 (sampletests.test122)\r
- \r
- 34/34 (100.0%) ... r-ex/sampletests/../sampletestsl.txt\r
- \r
- <BLANKLINE>
- Ran 34 tests with 0 failures and 0 errors in 0.008 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
- >>> sys.modules['curses'] = old_curses
-
-If a second or third level of verbosity are added, we get additional
-information.
-
- >>> sys.argv = 'test --layer 122 -pvv -t !txt'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- 1/24 (4.2%) test_x1 (sample1.sampletests.test122.TestA)\r
- \r
- 2/24 (8.3%) test_y0 (sample1.sampletests.test122.TestA)\r
- \r
- 3/24 (12.5%) test_z0 (sample1.sampletests.test122.TestA)\r
- \r
- 4/24 (16.7%) test_x0 (sample1.sampletests.test122.TestB)\r
- \r
- 5/24 (20.8%) test_y1 (sample1.sampletests.test122.TestB)\r
- \r
- 6/24 (25.0%) test_z0 (sample1.sampletests.test122.TestB)\r
- \r
- 7/24 (29.2%) test_1 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 8/24 (33.3%) test_2 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 9/24 (37.5%) test_3 (sample1.sampletests.test122.TestNotMuch)\r
- \r
- 10/24 (41.7%) test_x0 (sample1.sampletests.test122)\r
- \r
- 11/24 (45.8%) test_y0 (sample1.sampletests.test122)\r
- \r
- 12/24 (50.0%) test_z1 (sample1.sampletests.test122)\r
- \r
- 13/24 (54.2%) test_x1 (sampletests.test122.TestA)\r
- \r
- 14/24 (58.3%) test_y0 (sampletests.test122.TestA)\r
- \r
- 15/24 (62.5%) test_z0 (sampletests.test122.TestA)\r
- \r
- 16/24 (66.7%) test_x0 (sampletests.test122.TestB)\r
- \r
- 17/24 (70.8%) test_y1 (sampletests.test122.TestB)\r
- \r
- 18/24 (75.0%) test_z0 (sampletests.test122.TestB)\r
- \r
- 19/24 (79.2%) test_1 (sampletests.test122.TestNotMuch)\r
- \r
- 20/24 (83.3%) test_2 (sampletests.test122.TestNotMuch)\r
- \r
- 21/24 (87.5%) test_3 (sampletests.test122.TestNotMuch)\r
- \r
- 22/24 (91.7%) test_x0 (sampletests.test122)\r
- \r
- 23/24 (95.8%) test_y0 (sampletests.test122)\r
- \r
- 24/24 (100.0%) test_z1 (sampletests.test122)\r
- \r
- <BLANKLINE>
- Ran 24 tests with 0 failures and 0 errors in 0.006 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-Note that, in this example, we used a test-selection pattern starting
-with '!' to exclude tests containing the string "txt".
-
- >>> sys.argv = 'test --layer 122 -pvvv -t!(txt|NotMuch)'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- 1/18 (5.6%) test_x1 (sample1.sampletests.test122.TestA) (0.000 s)\r
- \r
- 2/18 (11.1%) test_y0 (sample1.sampletests.test122.TestA) (0.000 s)\r
- \r
- 3/18 (16.7%) test_z0 (sample1.sampletests.test122.TestA) (0.000 s)\r
- \r
- 4/18 (22.2%) test_x0 (sample1.sampletests.test122.TestB) (0.000 s)\r
- \r
- 5/18 (27.8%) test_y1 (sample1.sampletests.test122.TestB) (0.000 s)\r
- \r
- 6/18 (33.3%) test_z0 (sample1.sampletests.test122.TestB) (0.000 s)\r
- \r
- 7/18 (38.9%) test_x0 (sample1.sampletests.test122) (0.001 s)\r
- \r
- 8/18 (44.4%) test_y0 (sample1.sampletests.test122) (0.001 s)\r
- \r
- 9/18 (50.0%) test_z1 (sample1.sampletests.test122) (0.001 s)\r
- \r
- 10/18 (55.6%) test_x1 (sampletests.test122.TestA) (0.000 s)\r
- \r
- 11/18 (61.1%) test_y0 (sampletests.test122.TestA) (0.000 s)\r
- \r
- 12/18 (66.7%) test_z0 (sampletests.test122.TestA) (0.000 s)\r
- \r
- 13/18 (72.2%) test_x0 (sampletests.test122.TestB) (0.000 s)\r
- \r
- 14/18 (77.8%) test_y1 (sampletests.test122.TestB) (0.000 s)\r
- \r
- 15/18 (83.3%) test_z0 (sampletests.test122.TestB) (0.000 s)\r
- \r
- 16/18 (88.9%) test_x0 (sampletests.test122) (0.001 s)\r
- \r
- 17/18 (94.4%) test_y0 (sampletests.test122) (0.001 s)\r
- \r
- 18/18 (100.0%) test_z1 (sampletests.test122) (0.001 s)\r
- \r
- <BLANKLINE>
- Ran 18 tests with 0 failures and 0 errors in 0.006 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-In this example, we also excluded tests with "NotMuch" in their names.
-
-Unfortunately, the time data above doesn't buy us much because, in
-practice, the line is cleared before there is time to see the
-times. :/
-
-
-Autodetecting progress
-----------------------
-
-The --auto-progress option will determine if stdout is a terminal, and only enable
-progress output if so.
-
-Let's pretend we have a terminal
-
- >>> class Terminal(object):
- ... def __init__(self, stream):
- ... self._stream = stream
- ... def __getattr__(self, attr):
- ... return getattr(self._stream, attr)
- ... def isatty(self):
- ... return True
- >>> real_stdout = sys.stdout
- >>> sys.stdout = Terminal(sys.stdout)
-
- >>> sys.argv = 'test -u -t test_one.TestNotMuch --auto-progress'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Running:
- 1/6 (16.7%)\r
- \r
- 2/6 (33.3%)\r
- \r
- 3/6 (50.0%)\r
- \r
- 4/6 (66.7%)\r
- \r
- 5/6 (83.3%)\r
- \r
- 6/6 (100.0%)\r
- \r
- <BLANKLINE>
- Ran 6 tests with 0 failures and 0 errors in 0.000 seconds.
- False
-
-Let's stop pretending
-
- >>> sys.stdout = real_stdout
-
- >>> sys.argv = 'test -u -t test_one.TestNotMuch --auto-progress'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 6 tests with 0 failures and 0 errors in 0.000 seconds.
- False
-
-
-Disabling progress indication
------------------------------
-
-If -p or --progress have been previously provided on the command line (perhaps by a
-wrapper script) but you do not desire progress indication, you can switch it off with
---no-progress:
-
- >>> sys.argv = 'test -u -t test_one.TestNotMuch -p --no-progress'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 6 tests with 0 failures and 0 errors in 0.000 seconds.
- False
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-repeat.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-repeat.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-repeat.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,46 +0,0 @@
-Repeating Tests
-===============
-
-The --repeat option can be used to repeat tests some number of times.
-Repeating tests is useful to help make sure that tests clean up after
-themselves.
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --layer 112 --layer unit --repeat 3'.split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running unit tests:
- Iteration 1
- Ran 192 tests with 0 failures and 0 errors in 0.054 seconds.
- Iteration 2
- Ran 192 tests with 0 failures and 0 errors in 0.054 seconds.
- Iteration 3
- Ran 192 tests with 0 failures and 0 errors in 0.052 seconds.
- Running samplelayers.Layer112 tests:
- Set up samplelayers.Layerx in 0.000 seconds.
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer11 in 0.000 seconds.
- Set up samplelayers.Layer112 in 0.000 seconds.
- Iteration 1
- Ran 34 tests with 0 failures and 0 errors in 0.010 seconds.
- Iteration 2
- Ran 34 tests with 0 failures and 0 errors in 0.010 seconds.
- Iteration 3
- Ran 34 tests with 0 failures and 0 errors in 0.010 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer112 in 0.000 seconds.
- Tear down samplelayers.Layerx in 0.000 seconds.
- Tear down samplelayers.Layer11 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- Total: 226 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-The tests are repeated by layer. Layers are set up and torn down only
-once.
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-simple.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-simple.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-simple.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,95 +0,0 @@
-Simple Usage
-============
-
-The test runner consists of an importable module. The test runner is
-used by providing scripts that import and invoke the `run` method from
-the module. The `testrunner` module is controlled via command-line
-options. Test scripts supply base and default options by supplying a
-list of default command-line options that are processed before the
-user-supplied command-line options are provided.
-
-Typically, a test script does 2 things:
-
-- Adds the directory containing the zope package to the Python
- path.
-
-- Calls the test runner with default arguments and arguments supplied
- to the script.
-
- Normally, it just passes default/setup arguments. The test runner
- uses `sys.argv` to get the user's input.
-
-This testrunner_ex subdirectory contains a number of sample packages
-with tests. Let's run the tests found here. First though, we'll set
-up our default options:
-
- >>> import os.path
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
-The default options are used by a script to customize the test runner
-for a particular application. In this case, we use two options:
-
-path
- Set the path where the test runner should look for tests. This path
- is also added to the Python path.
-
-tests-pattern
- Tell the test runner how to recognize modules or packages containing
- tests.
-
-Now, if we run the tests, without any other options:
-
- >>> from zope.testing import testrunner
- >>> import sys
- >>> sys.argv = ['test']
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer1 tests:
- Set up samplelayers.Layer1 in N.NNN seconds.
- Ran 9 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer11 tests:
- Set up samplelayers.Layer11 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer111 tests:
- Set up samplelayers.Layerx in N.NNN seconds.
- Set up samplelayers.Layer111 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer112 tests:
- Tear down samplelayers.Layer111 in N.NNN seconds.
- Set up samplelayers.Layer112 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer12 tests:
- Tear down samplelayers.Layer112 in N.NNN seconds.
- Tear down samplelayers.Layerx in N.NNN seconds.
- Tear down samplelayers.Layer11 in N.NNN seconds.
- Set up samplelayers.Layer12 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer121 tests:
- Set up samplelayers.Layer121 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Running samplelayers.Layer122 tests:
- Tear down samplelayers.Layer121 in N.NNN seconds.
- Set up samplelayers.Layer122 in N.NNN seconds.
- Ran 34 tests with 0 failures and 0 errors in N.NNN seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in N.NNN seconds.
- Tear down samplelayers.Layer12 in N.NNN seconds.
- Tear down samplelayers.Layer1 in N.NNN seconds.
- Total: 405 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-we see the normal testrunner output, which summarizes the tests run for
-each layer. For each layer, we see what layers had to be torn down or
-set up to run the layer and we see the number of tests run, with
-results.
-
-The test runner returns a boolean indicating whether there were
-errors. In this example, there were no errors, so it returned False.
-
-(Of course, the times shown in these examples are just examples.
-Times will vary depending on system speed.)
Deleted: zope.testing/trunk/src/zope/testing/testrunner-test-selection.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-test-selection.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-test-selection.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,564 +0,0 @@
-Test Selection
-==============
-
-We've already seen that we can select tests by layer. There are three
-other ways we can select tests. We can select tests by package:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
-
- >>> sys.argv = 'test --layer 122 -ssample1 -vv'.split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- test_x1 (sample1.sampletests.test122.TestA)
- test_y0 (sample1.sampletests.test122.TestA)
- test_z0 (sample1.sampletests.test122.TestA)
- test_x0 (sample1.sampletests.test122.TestB)
- test_y1 (sample1.sampletests.test122.TestB)
- test_z0 (sample1.sampletests.test122.TestB)
- test_1 (sample1.sampletests.test122.TestNotMuch)
- test_2 (sample1.sampletests.test122.TestNotMuch)
- test_3 (sample1.sampletests.test122.TestNotMuch)
- test_x0 (sample1.sampletests.test122)
- test_y0 (sample1.sampletests.test122)
- test_z1 (sample1.sampletests.test122)
- testrunner-ex/sample1/sampletests/../../sampletestsl.txt
- Ran 17 tests with 0 failures and 0 errors in 0.005 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-You can specify multiple packages:
-
- >>> sys.argv = 'test -u -vv -ssample1 -ssample2'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_x1 (sample1.sampletestsf.TestA)
- test_y0 (sample1.sampletestsf.TestA)
- test_z0 (sample1.sampletestsf.TestA)
- test_x0 (sample1.sampletestsf.TestB)
- test_y1 (sample1.sampletestsf.TestB)
- test_z0 (sample1.sampletestsf.TestB)
- test_1 (sample1.sampletestsf.TestNotMuch)
- test_2 (sample1.sampletestsf.TestNotMuch)
- test_3 (sample1.sampletestsf.TestNotMuch)
- test_x0 (sample1.sampletestsf)
- test_y0 (sample1.sampletestsf)
- test_z1 (sample1.sampletestsf)
- testrunner-ex/sample1/../sampletests.txt
- test_x1 (sample1.sample11.sampletests.TestA)
- test_y0 (sample1.sample11.sampletests.TestA)
- test_z0 (sample1.sample11.sampletests.TestA)
- test_x0 (sample1.sample11.sampletests.TestB)
- test_y1 (sample1.sample11.sampletests.TestB)
- test_z0 (sample1.sample11.sampletests.TestB)
- test_1 (sample1.sample11.sampletests.TestNotMuch)
- test_2 (sample1.sample11.sampletests.TestNotMuch)
- test_3 (sample1.sample11.sampletests.TestNotMuch)
- test_x0 (sample1.sample11.sampletests)
- test_y0 (sample1.sample11.sampletests)
- test_z1 (sample1.sample11.sampletests)
- testrunner-ex/sample1/sample11/../../sampletests.txt
- test_x1 (sample1.sample13.sampletests.TestA)
- test_y0 (sample1.sample13.sampletests.TestA)
- test_z0 (sample1.sample13.sampletests.TestA)
- test_x0 (sample1.sample13.sampletests.TestB)
- test_y1 (sample1.sample13.sampletests.TestB)
- test_z0 (sample1.sample13.sampletests.TestB)
- test_1 (sample1.sample13.sampletests.TestNotMuch)
- test_2 (sample1.sample13.sampletests.TestNotMuch)
- test_3 (sample1.sample13.sampletests.TestNotMuch)
- test_x0 (sample1.sample13.sampletests)
- test_y0 (sample1.sample13.sampletests)
- test_z1 (sample1.sample13.sampletests)
- testrunner-ex/sample1/sample13/../../sampletests.txt
- test_x1 (sample1.sampletests.test1.TestA)
- test_y0 (sample1.sampletests.test1.TestA)
- test_z0 (sample1.sampletests.test1.TestA)
- test_x0 (sample1.sampletests.test1.TestB)
- test_y1 (sample1.sampletests.test1.TestB)
- test_z0 (sample1.sampletests.test1.TestB)
- test_1 (sample1.sampletests.test1.TestNotMuch)
- test_2 (sample1.sampletests.test1.TestNotMuch)
- test_3 (sample1.sampletests.test1.TestNotMuch)
- test_x0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test1)
- test_z1 (sample1.sampletests.test1)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- test_x1 (sample1.sampletests.test_one.TestA)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_z0 (sample1.sampletests.test_one.TestA)
- test_x0 (sample1.sampletests.test_one.TestB)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_z0 (sample1.sampletests.test_one.TestB)
- test_1 (sample1.sampletests.test_one.TestNotMuch)
- test_2 (sample1.sampletests.test_one.TestNotMuch)
- test_3 (sample1.sampletests.test_one.TestNotMuch)
- test_x0 (sample1.sampletests.test_one)
- test_y0 (sample1.sampletests.test_one)
- test_z1 (sample1.sampletests.test_one)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- test_x1 (sample2.sample21.sampletests.TestA)
- test_y0 (sample2.sample21.sampletests.TestA)
- test_z0 (sample2.sample21.sampletests.TestA)
- test_x0 (sample2.sample21.sampletests.TestB)
- test_y1 (sample2.sample21.sampletests.TestB)
- test_z0 (sample2.sample21.sampletests.TestB)
- test_1 (sample2.sample21.sampletests.TestNotMuch)
- test_2 (sample2.sample21.sampletests.TestNotMuch)
- test_3 (sample2.sample21.sampletests.TestNotMuch)
- test_x0 (sample2.sample21.sampletests)
- test_y0 (sample2.sample21.sampletests)
- test_z1 (sample2.sample21.sampletests)
- testrunner-ex/sample2/sample21/../../sampletests.txt
- test_x1 (sample2.sampletests.test_1.TestA)
- test_y0 (sample2.sampletests.test_1.TestA)
- test_z0 (sample2.sampletests.test_1.TestA)
- test_x0 (sample2.sampletests.test_1.TestB)
- test_y1 (sample2.sampletests.test_1.TestB)
- test_z0 (sample2.sampletests.test_1.TestB)
- test_1 (sample2.sampletests.test_1.TestNotMuch)
- test_2 (sample2.sampletests.test_1.TestNotMuch)
- test_3 (sample2.sampletests.test_1.TestNotMuch)
- test_x0 (sample2.sampletests.test_1)
- test_y0 (sample2.sampletests.test_1)
- test_z1 (sample2.sampletests.test_1)
- testrunner-ex/sample2/sampletests/../../sampletests.txt
- test_x1 (sample2.sampletests.testone.TestA)
- test_y0 (sample2.sampletests.testone.TestA)
- test_z0 (sample2.sampletests.testone.TestA)
- test_x0 (sample2.sampletests.testone.TestB)
- test_y1 (sample2.sampletests.testone.TestB)
- test_z0 (sample2.sampletests.testone.TestB)
- test_1 (sample2.sampletests.testone.TestNotMuch)
- test_2 (sample2.sampletests.testone.TestNotMuch)
- test_3 (sample2.sampletests.testone.TestNotMuch)
- test_x0 (sample2.sampletests.testone)
- test_y0 (sample2.sampletests.testone)
- test_z1 (sample2.sampletests.testone)
- testrunner-ex/sample2/sampletests/../../sampletests.txt
- Ran 128 tests with 0 failures and 0 errors in 0.025 seconds.
- False
-
-You can specify directory names instead of packages (useful for
-tab-completion):
-
- >>> subdir = os.path.join(directory_with_tests, 'sample1')
- >>> sys.argv = ('test --layer 122 -s %s -vv' % subdir).split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- test_x1 (sample1.sampletests.test122.TestA)
- test_y0 (sample1.sampletests.test122.TestA)
- test_z0 (sample1.sampletests.test122.TestA)
- test_x0 (sample1.sampletests.test122.TestB)
- test_y1 (sample1.sampletests.test122.TestB)
- test_z0 (sample1.sampletests.test122.TestB)
- test_1 (sample1.sampletests.test122.TestNotMuch)
- test_2 (sample1.sampletests.test122.TestNotMuch)
- test_3 (sample1.sampletests.test122.TestNotMuch)
- test_x0 (sample1.sampletests.test122)
- test_y0 (sample1.sampletests.test122)
- test_z1 (sample1.sampletests.test122)
- testrunner-ex/sample1/sampletests/../../sampletestsl.txt
- Ran 17 tests with 0 failures and 0 errors in 0.005 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-We can select by test module name using the --module (-m) option:
-
- >>> sys.argv = 'test -u -vv -ssample1 -m_one -mtest1'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_x1 (sample1.sampletests.test1.TestA)
- test_y0 (sample1.sampletests.test1.TestA)
- test_z0 (sample1.sampletests.test1.TestA)
- test_x0 (sample1.sampletests.test1.TestB)
- test_y1 (sample1.sampletests.test1.TestB)
- test_z0 (sample1.sampletests.test1.TestB)
- test_1 (sample1.sampletests.test1.TestNotMuch)
- test_2 (sample1.sampletests.test1.TestNotMuch)
- test_3 (sample1.sampletests.test1.TestNotMuch)
- test_x0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test1)
- test_z1 (sample1.sampletests.test1)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- test_x1 (sample1.sampletests.test_one.TestA)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_z0 (sample1.sampletests.test_one.TestA)
- test_x0 (sample1.sampletests.test_one.TestB)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_z0 (sample1.sampletests.test_one.TestB)
- test_1 (sample1.sampletests.test_one.TestNotMuch)
- test_2 (sample1.sampletests.test_one.TestNotMuch)
- test_3 (sample1.sampletests.test_one.TestNotMuch)
- test_x0 (sample1.sampletests.test_one)
- test_y0 (sample1.sampletests.test_one)
- test_z1 (sample1.sampletests.test_one)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- Ran 32 tests with 0 failures and 0 errors in 0.008 seconds.
- False
-
-and by test within the module using the --test (-t) option:
-
- >>> sys.argv = 'test -u -vv -ssample1 -m_one -mtest1 -tx0 -ty0'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_y0 (sample1.sampletests.test1.TestA)
- test_x0 (sample1.sampletests.test1.TestB)
- test_x0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_x0 (sample1.sampletests.test_one.TestB)
- test_x0 (sample1.sampletests.test_one)
- test_y0 (sample1.sampletests.test_one)
- Ran 8 tests with 0 failures and 0 errors in 0.003 seconds.
- False
-
-
- >>> sys.argv = 'test -u -vv -ssample1 -ttxt'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- testrunner-ex/sample1/../sampletests.txt
- testrunner-ex/sample1/sample11/../../sampletests.txt
- testrunner-ex/sample1/sample13/../../sampletests.txt
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- Ran 20 tests with 0 failures and 0 errors in 0.004 seconds.
- False
-
-The --module and --test options take regular expressions. If the
-regular expressions specified begin with '!', then tests that don't
-match the regular expression are selected:
-
- >>> sys.argv = 'test -u -vv -ssample1 -m!sample1[.]sample1'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_x1 (sample1.sampletestsf.TestA)
- test_y0 (sample1.sampletestsf.TestA)
- test_z0 (sample1.sampletestsf.TestA)
- test_x0 (sample1.sampletestsf.TestB)
- test_y1 (sample1.sampletestsf.TestB)
- test_z0 (sample1.sampletestsf.TestB)
- test_1 (sample1.sampletestsf.TestNotMuch)
- test_2 (sample1.sampletestsf.TestNotMuch)
- test_3 (sample1.sampletestsf.TestNotMuch)
- test_x0 (sample1.sampletestsf)
- test_y0 (sample1.sampletestsf)
- test_z1 (sample1.sampletestsf)
- testrunner-ex/sample1/../sampletests.txt
- test_x1 (sample1.sampletests.test1.TestA)
- test_y0 (sample1.sampletests.test1.TestA)
- test_z0 (sample1.sampletests.test1.TestA)
- test_x0 (sample1.sampletests.test1.TestB)
- test_y1 (sample1.sampletests.test1.TestB)
- test_z0 (sample1.sampletests.test1.TestB)
- test_1 (sample1.sampletests.test1.TestNotMuch)
- test_2 (sample1.sampletests.test1.TestNotMuch)
- test_3 (sample1.sampletests.test1.TestNotMuch)
- test_x0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test1)
- test_z1 (sample1.sampletests.test1)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- test_x1 (sample1.sampletests.test_one.TestA)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_z0 (sample1.sampletests.test_one.TestA)
- test_x0 (sample1.sampletests.test_one.TestB)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_z0 (sample1.sampletests.test_one.TestB)
- test_1 (sample1.sampletests.test_one.TestNotMuch)
- test_2 (sample1.sampletests.test_one.TestNotMuch)
- test_3 (sample1.sampletests.test_one.TestNotMuch)
- test_x0 (sample1.sampletests.test_one)
- test_y0 (sample1.sampletests.test_one)
- test_z1 (sample1.sampletests.test_one)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- Ran 48 tests with 0 failures and 0 errors in 0.017 seconds.
- False
-
-Module and test filters can also be given as positional arguments:
-
-
- >>> sys.argv = 'test -u -vv -ssample1 !sample1[.]sample1'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_x1 (sample1.sampletestsf.TestA)
- test_y0 (sample1.sampletestsf.TestA)
- test_z0 (sample1.sampletestsf.TestA)
- test_x0 (sample1.sampletestsf.TestB)
- test_y1 (sample1.sampletestsf.TestB)
- test_z0 (sample1.sampletestsf.TestB)
- test_1 (sample1.sampletestsf.TestNotMuch)
- test_2 (sample1.sampletestsf.TestNotMuch)
- test_3 (sample1.sampletestsf.TestNotMuch)
- test_x0 (sample1.sampletestsf)
- test_y0 (sample1.sampletestsf)
- test_z1 (sample1.sampletestsf)
- testrunner-ex/sample1/../sampletests.txt
- test_x1 (sample1.sampletests.test1.TestA)
- test_y0 (sample1.sampletests.test1.TestA)
- test_z0 (sample1.sampletests.test1.TestA)
- test_x0 (sample1.sampletests.test1.TestB)
- test_y1 (sample1.sampletests.test1.TestB)
- test_z0 (sample1.sampletests.test1.TestB)
- test_1 (sample1.sampletests.test1.TestNotMuch)
- test_2 (sample1.sampletests.test1.TestNotMuch)
- test_3 (sample1.sampletests.test1.TestNotMuch)
- test_x0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test1)
- test_z1 (sample1.sampletests.test1)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- test_x1 (sample1.sampletests.test_one.TestA)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_z0 (sample1.sampletests.test_one.TestA)
- test_x0 (sample1.sampletests.test_one.TestB)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_z0 (sample1.sampletests.test_one.TestB)
- test_1 (sample1.sampletests.test_one.TestNotMuch)
- test_2 (sample1.sampletests.test_one.TestNotMuch)
- test_3 (sample1.sampletests.test_one.TestNotMuch)
- test_x0 (sample1.sampletests.test_one)
- test_y0 (sample1.sampletests.test_one)
- test_z1 (sample1.sampletests.test_one)
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- Ran 48 tests with 0 failures and 0 errors in 0.017 seconds.
- False
-
- >>> sys.argv = 'test -u -vv -ssample1 . txt'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- testrunner-ex/sample1/../sampletests.txt
- testrunner-ex/sample1/sample11/../../sampletests.txt
- testrunner-ex/sample1/sample13/../../sampletests.txt
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- testrunner-ex/sample1/sampletests/../../sampletests.txt
- Ran 20 tests with 0 failures and 0 errors in 0.004 seconds.
- False
-
-Sometimes, There are tests that you don't want to run by default.
-For example, you might have tests that take a long time. Tests can
-have a level attribute. If no level is specified, a level of 1 is
-assumed and, by default, only tests at level one are run. to run
-tests at a higher level, use the --at-level (-a) option to specify a higher
-level. For example, with the following options:
-
-
- >>> sys.argv = 'test -u -vv -t test_y1 -t test_y0'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test_y0 (sampletestsf.TestA)
- test_y1 (sampletestsf.TestB)
- test_y0 (sampletestsf)
- test_y0 (sample1.sampletestsf.TestA)
- test_y1 (sample1.sampletestsf.TestB)
- test_y0 (sample1.sampletestsf)
- test_y0 (sample1.sample11.sampletests.TestA)
- test_y1 (sample1.sample11.sampletests.TestB)
- test_y0 (sample1.sample11.sampletests)
- test_y0 (sample1.sample13.sampletests.TestA)
- test_y1 (sample1.sample13.sampletests.TestB)
- test_y0 (sample1.sample13.sampletests)
- test_y0 (sample1.sampletests.test1.TestA)
- test_y1 (sample1.sampletests.test1.TestB)
- test_y0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_y0 (sample1.sampletests.test_one)
- test_y0 (sample2.sample21.sampletests.TestA)
- test_y1 (sample2.sample21.sampletests.TestB)
- test_y0 (sample2.sample21.sampletests)
- test_y0 (sample2.sampletests.test_1.TestA)
- test_y1 (sample2.sampletests.test_1.TestB)
- test_y0 (sample2.sampletests.test_1)
- test_y0 (sample2.sampletests.testone.TestA)
- test_y1 (sample2.sampletests.testone.TestB)
- test_y0 (sample2.sampletests.testone)
- test_y0 (sample3.sampletests.TestA)
- test_y1 (sample3.sampletests.TestB)
- test_y0 (sample3.sampletests)
- test_y0 (sampletests.test1.TestA)
- test_y1 (sampletests.test1.TestB)
- test_y0 (sampletests.test1)
- test_y0 (sampletests.test_one.TestA)
- test_y1 (sampletests.test_one.TestB)
- test_y0 (sampletests.test_one)
- Ran 36 tests with 0 failures and 0 errors in 0.009 seconds.
- False
-
-
-We get run 36 tests. If we specify a level of 2, we get some
-additional tests:
-
- >>> sys.argv = 'test -u -vv -a 2 -t test_y1 -t test_y0'.split()
- >>> testrunner.run(defaults)
- Running tests at level 2
- Running unit tests:
- Running:
- test_y0 (sampletestsf.TestA)
- test_y0 (sampletestsf.TestA2)
- test_y1 (sampletestsf.TestB)
- test_y0 (sampletestsf)
- test_y0 (sample1.sampletestsf.TestA)
- test_y1 (sample1.sampletestsf.TestB)
- test_y0 (sample1.sampletestsf)
- test_y0 (sample1.sample11.sampletests.TestA)
- test_y1 (sample1.sample11.sampletests.TestB)
- test_y1 (sample1.sample11.sampletests.TestB2)
- test_y0 (sample1.sample11.sampletests)
- test_y0 (sample1.sample13.sampletests.TestA)
- test_y1 (sample1.sample13.sampletests.TestB)
- test_y0 (sample1.sample13.sampletests)
- test_y0 (sample1.sampletests.test1.TestA)
- test_y1 (sample1.sampletests.test1.TestB)
- test_y0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_y0 (sample1.sampletests.test_one)
- test_y0 (sample2.sample21.sampletests.TestA)
- test_y1 (sample2.sample21.sampletests.TestB)
- test_y0 (sample2.sample21.sampletests)
- test_y0 (sample2.sampletests.test_1.TestA)
- test_y1 (sample2.sampletests.test_1.TestB)
- test_y0 (sample2.sampletests.test_1)
- test_y0 (sample2.sampletests.testone.TestA)
- test_y1 (sample2.sampletests.testone.TestB)
- test_y0 (sample2.sampletests.testone)
- test_y0 (sample3.sampletests.TestA)
- test_y1 (sample3.sampletests.TestB)
- test_y0 (sample3.sampletests)
- test_y0 (sampletests.test1.TestA)
- test_y1 (sampletests.test1.TestB)
- test_y0 (sampletests.test1)
- test_y0 (sampletests.test_one.TestA)
- test_y1 (sampletests.test_one.TestB)
- test_y0 (sampletests.test_one)
- Ran 38 tests with 0 failures and 0 errors in 0.009 seconds.
- False
-
-We can use the --all option to run tests at all levels:
-
- >>> sys.argv = 'test -u -vv --all -t test_y1 -t test_y0'.split()
- >>> testrunner.run(defaults)
- Running tests at all levels
- Running unit tests:
- Running:
- test_y0 (sampletestsf.TestA)
- test_y0 (sampletestsf.TestA2)
- test_y1 (sampletestsf.TestB)
- test_y0 (sampletestsf)
- test_y0 (sample1.sampletestsf.TestA)
- test_y1 (sample1.sampletestsf.TestB)
- test_y0 (sample1.sampletestsf)
- test_y0 (sample1.sample11.sampletests.TestA)
- test_y0 (sample1.sample11.sampletests.TestA3)
- test_y1 (sample1.sample11.sampletests.TestB)
- test_y1 (sample1.sample11.sampletests.TestB2)
- test_y0 (sample1.sample11.sampletests)
- test_y0 (sample1.sample13.sampletests.TestA)
- test_y1 (sample1.sample13.sampletests.TestB)
- test_y0 (sample1.sample13.sampletests)
- test_y0 (sample1.sampletests.test1.TestA)
- test_y1 (sample1.sampletests.test1.TestB)
- test_y0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_y1 (sample1.sampletests.test_one.TestB)
- test_y0 (sample1.sampletests.test_one)
- test_y0 (sample2.sample21.sampletests.TestA)
- test_y1 (sample2.sample21.sampletests.TestB)
- test_y0 (sample2.sample21.sampletests)
- test_y0 (sample2.sampletests.test_1.TestA)
- test_y1 (sample2.sampletests.test_1.TestB)
- test_y0 (sample2.sampletests.test_1)
- test_y0 (sample2.sampletests.testone.TestA)
- test_y1 (sample2.sampletests.testone.TestB)
- test_y0 (sample2.sampletests.testone)
- test_y0 (sample3.sampletests.TestA)
- test_y1 (sample3.sampletests.TestB)
- test_y0 (sample3.sampletests)
- test_y0 (sampletests.test1.TestA)
- test_y1 (sampletests.test1.TestB)
- test_y0 (sampletests.test1)
- test_y0 (sampletests.test_one.TestA)
- test_y1 (sampletests.test_one.TestB)
- test_y0 (sampletests.test_one)
- Ran 39 tests with 0 failures and 0 errors in 0.009 seconds.
- False
-
-
-Listing Selected Tests
-----------------------
-
-When you're trying to figure out why the test you want is not matched by the
-pattern you specified, it is convenient to see which tests match your
-specifications.
-
- >>> sys.argv = 'test --all -m sample1 -t test_y0 --list-tests'.split()
- >>> testrunner.run(defaults)
- Listing unit tests:
- test_y0 (sample1.sampletestsf.TestA)
- test_y0 (sample1.sampletestsf)
- test_y0 (sample1.sample11.sampletests.TestA)
- test_y0 (sample1.sample11.sampletests.TestA3)
- test_y0 (sample1.sample11.sampletests)
- test_y0 (sample1.sample13.sampletests.TestA)
- test_y0 (sample1.sample13.sampletests)
- test_y0 (sample1.sampletests.test1.TestA)
- test_y0 (sample1.sampletests.test1)
- test_y0 (sample1.sampletests.test_one.TestA)
- test_y0 (sample1.sampletests.test_one)
- Listing samplelayers.Layer11 tests:
- test_y0 (sample1.sampletests.test11.TestA)
- test_y0 (sample1.sampletests.test11)
- Listing samplelayers.Layer111 tests:
- test_y0 (sample1.sampletests.test111.TestA)
- test_y0 (sample1.sampletests.test111)
- Listing samplelayers.Layer112 tests:
- test_y0 (sample1.sampletests.test112.TestA)
- test_y0 (sample1.sampletests.test112)
- Listing samplelayers.Layer12 tests:
- test_y0 (sample1.sampletests.test12.TestA)
- test_y0 (sample1.sampletests.test12)
- Listing samplelayers.Layer121 tests:
- test_y0 (sample1.sampletests.test121.TestA)
- test_y0 (sample1.sampletests.test121)
- Listing samplelayers.Layer122 tests:
- test_y0 (sample1.sampletests.test122.TestA)
- test_y0 (sample1.sampletests.test122)
- False
-
Deleted: zope.testing/trunk/src/zope/testing/testrunner-verbose.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-verbose.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-verbose.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,148 +0,0 @@
-Verbose Output
-==============
-
-Normally, we just get a summary. We can use the -v option to get
-increasingly more information.
-
-If we use a single --verbose (-v) option, we get a dot printed for each
-test:
-
- >>> import os.path, sys
- >>> directory_with_tests = os.path.join(this_directory, 'testrunner-ex')
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... ]
- >>> sys.argv = 'test --layer 122 -v'.split()
- >>> from zope.testing import testrunner
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- ..................................
- Ran 34 tests with 0 failures and 0 errors in 0.007 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-If there are more than 50 tests, the dots are printed in groups of
-50:
-
- >>> sys.argv = 'test -uv'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running unit tests:
- Running:
- ................................................................................................................................................................................................
- Ran 192 tests with 0 failures and 0 errors in 0.035 seconds.
- False
-
-If the --verbose (-v) option is used twice, then the name and location of
-each test is printed as it is run:
-
- >>> sys.argv = 'test --layer 122 -vv'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- test_x1 (sample1.sampletests.test122.TestA)
- test_y0 (sample1.sampletests.test122.TestA)
- test_z0 (sample1.sampletests.test122.TestA)
- test_x0 (sample1.sampletests.test122.TestB)
- test_y1 (sample1.sampletests.test122.TestB)
- test_z0 (sample1.sampletests.test122.TestB)
- test_1 (sample1.sampletests.test122.TestNotMuch)
- test_2 (sample1.sampletests.test122.TestNotMuch)
- test_3 (sample1.sampletests.test122.TestNotMuch)
- test_x0 (sample1.sampletests.test122)
- test_y0 (sample1.sampletests.test122)
- test_z1 (sample1.sampletests.test122)
- testrunner-ex/sample1/sampletests/../../sampletestsl.txt
- test_x1 (sampletests.test122.TestA)
- test_y0 (sampletests.test122.TestA)
- test_z0 (sampletests.test122.TestA)
- test_x0 (sampletests.test122.TestB)
- test_y1 (sampletests.test122.TestB)
- test_z0 (sampletests.test122.TestB)
- test_1 (sampletests.test122.TestNotMuch)
- test_2 (sampletests.test122.TestNotMuch)
- test_3 (sampletests.test122.TestNotMuch)
- test_x0 (sampletests.test122)
- test_y0 (sampletests.test122)
- test_z1 (sampletests.test122)
- testrunner-ex/sampletests/../sampletestsl.txt
- Ran 34 tests with 0 failures and 0 errors in 0.009 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-if the --verbose (-v) option is used three times, then individual
-test-execution times are printed:
-
- >>> sys.argv = 'test --layer 122 -vvv'.split()
- >>> testrunner.run(defaults)
- Running tests at level 1
- Running samplelayers.Layer122 tests:
- Set up samplelayers.Layer1 in 0.000 seconds.
- Set up samplelayers.Layer12 in 0.000 seconds.
- Set up samplelayers.Layer122 in 0.000 seconds.
- Running:
- test_x1 (sample1.sampletests.test122.TestA) (0.000 s)
- test_y0 (sample1.sampletests.test122.TestA) (0.000 s)
- test_z0 (sample1.sampletests.test122.TestA) (0.000 s)
- test_x0 (sample1.sampletests.test122.TestB) (0.000 s)
- test_y1 (sample1.sampletests.test122.TestB) (0.000 s)
- test_z0 (sample1.sampletests.test122.TestB) (0.000 s)
- test_1 (sample1.sampletests.test122.TestNotMuch) (0.000 s)
- test_2 (sample1.sampletests.test122.TestNotMuch) (0.000 s)
- test_3 (sample1.sampletests.test122.TestNotMuch) (0.000 s)
- test_x0 (sample1.sampletests.test122) (0.001 s)
- test_y0 (sample1.sampletests.test122) (0.001 s)
- test_z1 (sample1.sampletests.test122) (0.001 s)
- testrunner-ex/sample1/sampletests/../../sampletestsl.txt (0.001 s)
- test_x1 (sampletests.test122.TestA) (0.000 s)
- test_y0 (sampletests.test122.TestA) (0.000 s)
- test_z0 (sampletests.test122.TestA) (0.000 s)
- test_x0 (sampletests.test122.TestB) (0.000 s)
- test_y1 (sampletests.test122.TestB) (0.000 s)
- test_z0 (sampletests.test122.TestB) (0.000 s)
- test_1 (sampletests.test122.TestNotMuch) (0.000 s)
- test_2 (sampletests.test122.TestNotMuch) (0.000 s)
- test_3 (sampletests.test122.TestNotMuch) (0.000 s)
- test_x0 (sampletests.test122) (0.001 s)
- test_y0 (sampletests.test122) (0.001 s)
- test_z1 (sampletests.test122) (0.001 s)
- testrunner-ex/sampletests/../sampletestsl.txt (0.001 s)
- Ran 34 tests with 0 failures and 0 errors in 0.009 seconds.
- Tearing down left over layers:
- Tear down samplelayers.Layer122 in 0.000 seconds.
- Tear down samplelayers.Layer12 in 0.000 seconds.
- Tear down samplelayers.Layer1 in 0.000 seconds.
- False
-
-Quiet output
-------------
-
-The --quiet (-q) option cancels all verbose options. It's useful when
-the default verbosity is non-zero:
-
- >>> defaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^sampletestsf?$',
- ... '-v'
- ... ]
- >>> sys.argv = 'test -q -u'.split()
- >>> testrunner.run(defaults)
- Running unit tests:
- Ran 192 tests with 0 failures and 0 errors in 0.034 seconds.
- False
Deleted: zope.testing/trunk/src/zope/testing/testrunner-wo-source.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner-wo-source.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner-wo-source.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,89 +0,0 @@
-Running Without Source Code
-===========================
-
-The ``--usecompiled`` option allows running tests in a tree without .py
-source code, provided compiled .pyc or .pyo files exist (without
-``--usecompiled``, .py files are necessary).
-
-We have a very simple directory tree, under ``usecompiled/``, to test
-this. Because we're going to delete its .py files, we want to work
-in a copy of that:
-
- >>> import os.path, shutil, sys, tempfile
- >>> directory_with_tests = tempfile.mkdtemp()
-
- >>> NEWNAME = "unlikely_package_name"
- >>> src = os.path.join(this_directory, 'testrunner-ex', 'usecompiled')
- >>> os.path.isdir(src)
- True
- >>> dst = os.path.join(directory_with_tests, NEWNAME)
- >>> os.path.isdir(dst)
- False
-
-Have to use our own copying code, to avoid copying read-only SVN files that
-can't be deleted later.
-
- >>> n = len(src) + 1
- >>> for root, dirs, files in os.walk(src):
- ... dirs[:] = [d for d in dirs if d == "package"] # prune cruft
- ... os.mkdir(os.path.join(dst, root[n:]))
- ... for f in files:
- ... shutil.copy(os.path.join(root, f),
- ... os.path.join(dst, root[n:], f))
-
-Now run the tests in the copy:
-
- >>> from zope.testing import testrunner
-
- >>> mydefaults = [
- ... '--path', directory_with_tests,
- ... '--tests-pattern', '^compiletest$',
- ... '--package', NEWNAME,
- ... '-vv',
- ... ]
- >>> sys.argv = ['test']
- >>> testrunner.run(mydefaults)
- Running tests at level 1
- Running unit tests:
- Running:
- test1 (unlikely_package_name.compiletest.Test)
- test2 (unlikely_package_name.compiletest.Test)
- test1 (unlikely_package_name.package.compiletest.Test)
- test2 (unlikely_package_name.package.compiletest.Test)
- Ran 4 tests with 0 failures and 0 errors in N.NNN seconds.
- False
-
-If we delete the source files, it's normally a disaster: the test runner
-doesn't believe any test files, or even packages, exist. Note that we pass
-``--keepbytecode`` this time, because otherwise the test runner would
-delete the compiled Python files too:
-
- >>> for root, dirs, files in os.walk(dst):
- ... for f in files:
- ... if f.endswith(".py"):
- ... os.remove(os.path.join(root, f))
- >>> testrunner.run(mydefaults, ["test", "--keepbytecode"])
- Running tests at level 1
- Total: 0 tests, 0 failures, 0 errors in N.NNN seconds.
- False
-
-Finally, passing ``--usecompiled`` asks the test runner to treat .pyc
-and .pyo files as adequate replacements for .py files. Note that the
-output is the same as when running with .py source above. The absence
-of "removing stale bytecode ..." messages shows that ``--usecompiled``
-also implies ``--keepbytecode``:
-
- >>> testrunner.run(mydefaults, ["test", "--usecompiled"])
- Running tests at level 1
- Running unit tests:
- Running:
- test1 (unlikely_package_name.compiletest.Test)
- test2 (unlikely_package_name.compiletest.Test)
- test1 (unlikely_package_name.package.compiletest.Test)
- test2 (unlikely_package_name.package.compiletest.Test)
- Ran 4 tests with 0 failures and 0 errors in N.NNN seconds.
- False
-
-Remove the temporary directory:
-
- >>> shutil.rmtree(directory_with_tests)
Deleted: zope.testing/trunk/src/zope/testing/testrunner.py
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner.py 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner.py 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,2816 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004-2006 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.
-#
-##############################################################################
-"""Test runner
-
-$Id$
-"""
-
-# Too bad: For now, we depend on zope.testing. This is because
-# we want to use the latest, greatest doctest, which zope.testing
-# provides. Then again, zope.testing is generally useful.
-
-import gc
-import glob
-import logging
-import optparse
-import os
-import errno
-import pdb
-import re
-import cStringIO
-import sys
-import tempfile
-import threading
-import time
-import trace
-import traceback
-import types
-import unittest
-
-
-available_profilers = {}
-
-try:
- import cProfile
- import pstats
-except ImportError:
- pass
-else:
- class CProfiler(object):
- """cProfiler"""
- def __init__(self, filepath):
- self.filepath = filepath
- self.profiler = cProfile.Profile()
- self.enable = self.profiler.enable
- self.disable = self.profiler.disable
-
- def finish(self):
- self.profiler.dump_stats(self.filepath)
-
- def loadStats(self, prof_glob):
- stats = None
- for file_name in glob.glob(prof_glob):
- if stats is None:
- stats = pstats.Stats(file_name)
- else:
- stats.add(file_name)
- return stats
-
- available_profilers['cProfile'] = CProfiler
-
-# some Linux distributions don't include the profiler, which hotshot uses
-try:
- import hotshot
- import hotshot.stats
-except ImportError:
- pass
-else:
- class HotshotProfiler(object):
- """hotshot interface"""
-
- def __init__(self, filepath):
- self.profiler = hotshot.Profile(filepath)
- self.enable = self.profiler.start
- self.disable = self.profiler.stop
-
- def finish(self):
- self.profiler.close()
-
- def loadStats(self, prof_glob):
- stats = None
- for file_name in glob.glob(prof_glob):
- loaded = hotshot.stats.load(file_name)
- if stats is None:
- stats = loaded
- else:
- stats.add(loaded)
- return stats
-
- available_profilers['hotshot'] = HotshotProfiler
-
-
-real_pdb_set_trace = pdb.set_trace
-
-# 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.
-osettrace = sys.settrace
-def settrace(trace):
- if trace is None:
- return
- osettrace(trace)
-
-class TestIgnore:
-
- def __init__(self, options):
- self._test_dirs = [self._filenameFormat(d[0]) + os.path.sep
- for d in test_dirs(options, {})]
- self._ignore = {}
- self._ignored = self._ignore.get
-
- def names(self, filename, modulename):
- # Special case: Modules generated from text files; i.e. doctests
- if modulename == '<string>':
- return True
- filename = self._filenameFormat(filename)
- ignore = self._ignored(filename)
- if ignore is None:
- ignore = True
- if filename is not None:
- for d in self._test_dirs:
- if filename.startswith(d):
- ignore = False
- break
- self._ignore[filename] = ignore
- return ignore
-
- def _filenameFormat(self, filename):
- return os.path.abspath(filename)
-
-if sys.platform == 'win32':
- #on win32 drive name can be passed with different case to `names`
- #that lets e.g. the coverage profiler skip complete files
- #_filenameFormat will make sure that all drive and filenames get lowercased
- #albeit trace coverage has still problems with lowercase drive letters
- #when determining the dotted module name
- OldTestIgnore = TestIgnore
-
- class TestIgnore(OldTestIgnore):
- def _filenameFormat(self, filename):
- return os.path.normcase(os.path.abspath(filename))
-
-class TestTrace(trace.Trace):
- """Simple tracer.
-
- >>> tracer = TestTrace(None, count=False, trace=False)
-
- Simple rules for use: you can't stop the tracer if it not started
- and you can't start the tracer if it already started:
-
- >>> tracer.stop()
- Traceback (most recent call last):
- File 'testrunner.py'
- AssertionError: can't stop if not started
-
- >>> tracer.start()
- >>> tracer.start()
- Traceback (most recent call last):
- File 'testrunner.py'
- AssertionError: can't start if already started
-
- >>> tracer.stop()
- >>> tracer.stop()
- Traceback (most recent call last):
- File 'testrunner.py'
- AssertionError: can't stop if not started
- """
-
- def __init__(self, options, **kw):
- trace.Trace.__init__(self, **kw)
- if options is not None:
- self.ignore = TestIgnore(options)
- self.started = False
-
- def start(self):
- assert not self.started, "can't start if already started"
- if not self.donothing:
- sys.settrace = settrace
- sys.settrace(self.globaltrace)
- threading.settrace(self.globaltrace)
- self.started = True
-
- def stop(self):
- assert self.started, "can't stop if not started"
- if not self.donothing:
- sys.settrace = osettrace
- sys.settrace(None)
- threading.settrace(None)
- self.started = False
-
-class EndRun(Exception):
- """Indicate that the existing run call should stop
-
- Used to prevent additional test output after post-mortem debugging.
- """
-
-def strip_py_ext(options, path):
- """Return path without its .py (or .pyc or .pyo) extension, or None.
-
- If options.usecompiled is false:
- If path ends with ".py", the path without the extension is returned.
- Else None is returned.
-
- If options.usecompiled is true:
- If Python is running with -O, a .pyo extension is also accepted.
- If Python is running without -O, a .pyc extension is also accepted.
- """
- if path.endswith(".py"):
- return path[:-3]
- if options.usecompiled:
- if __debug__:
- # Python is running without -O.
- ext = ".pyc"
- else:
- # Python is running with -O.
- ext = ".pyo"
- if path.endswith(ext):
- return path[:-len(ext)]
- return None
-
-def contains_init_py(options, fnamelist):
- """Return true iff fnamelist contains a suitable spelling of __init__.py.
-
- If options.usecompiled is false, this is so iff "__init__.py" is in
- the list.
-
- If options.usecompiled is true, then "__init__.pyo" is also acceptable
- if Python is running with -O, and "__init__.pyc" is also acceptable if
- Python is running without -O.
- """
- if "__init__.py" in fnamelist:
- return True
- if options.usecompiled:
- if __debug__:
- # Python is running without -O.
- return "__init__.pyc" in fnamelist
- else:
- # Python is running with -O.
- return "__init__.pyo" in fnamelist
- return False
-
-
-doctest_template = """
-File "%s", line %s, in %s
-
-%s
-Want:
-%s
-Got:
-%s
-"""
-
-
-def tigetnum(attr, default=None):
- """Return a value from the terminfo database.
-
- Terminfo is used on Unix-like systems to report various terminal attributes
- (such as width, height or the number of supported colors).
-
- Returns ``default`` when the ``curses`` module is not available, or when
- sys.stdout is not a terminal.
- """
- try:
- import curses
- except ImportError:
- # avoid reimporting a broken module in python 2.3
- sys.modules['curses'] = None
- else:
- try:
- curses.setupterm()
- except (curses.error, TypeError):
- # You get curses.error when $TERM is set to an unknown name
- # You get TypeError when sys.stdout is not a real file object
- # (e.g. in unit tests that use various wrappers).
- pass
- else:
- return curses.tigetnum(attr)
- return default
-
-
-class OutputFormatter(object):
- """Test runner output formatter."""
-
- # Implementation note: be careful about printing stuff to sys.stderr.
- # It is used for interprocess communication between the parent and the
- # child test runner, when you run some test layers in a subprocess.
- # resume_layer() reasigns sys.stderr for this reason, but be careful
- # and don't store the original one in __init__ or something.
-
- max_width = 80
-
- def __init__(self, options):
- self.options = options
- self.last_width = 0
- self.compute_max_width()
-
- progress = property(lambda self: self.options.progress)
- verbose = property(lambda self: self.options.verbose)
-
- def compute_max_width(self):
- """Try to determine the terminal width."""
- # Note that doing this every time is more test friendly.
- self.max_width = tigetnum('cols', self.max_width)
-
- def getShortDescription(self, test, room):
- """Return a description of a test that fits in ``room`` characters."""
- room -= 1
- s = str(test)
- if len(s) > room:
- pos = s.find(" (")
- if pos >= 0:
- w = room - (pos + 5)
- if w < 1:
- # first portion (test method name) is too long
- s = s[:room-3] + "..."
- else:
- pre = s[:pos+2]
- post = s[-w:]
- s = "%s...%s" % (pre, post)
- else:
- w = room - 4
- s = '... ' + s[-w:]
-
- return ' ' + s[:room]
-
- def info(self, message):
- """Print an informative message."""
- print message
-
- def info_suboptimal(self, message):
- """Print an informative message about losing some of the features.
-
- For example, when you run some tests in a subprocess, you lose the
- ability to use the debugger.
- """
- print message
-
- def error(self, message):
- """Report an error."""
- print message
-
- def error_with_banner(self, message):
- """Report an error with a big ASCII banner."""
- print
- print '*'*70
- self.error(message)
- print '*'*70
- print
-
- def profiler_stats(self, stats):
- """Report profiler stats."""
- stats.print_stats(50)
-
- def import_errors(self, import_errors):
- """Report test-module import errors (if any)."""
- if import_errors:
- print "Test-module import failures:"
- for error in import_errors:
- self.print_traceback("Module: %s\n" % error.module,
- error.exc_info),
- print
-
- def tests_with_errors(self, errors):
- """Report names of tests with errors (if any)."""
- if errors:
- print
- print "Tests with errors:"
- for test, exc_info in errors:
- print " ", test
-
- def tests_with_failures(self, failures):
- """Report names of tests with failures (if any)."""
- if failures:
- print
- print "Tests with failures:"
- for test, exc_info in failures:
- print " ", test
-
- def modules_with_import_problems(self, import_errors):
- """Report names of modules with import problems (if any)."""
- if import_errors:
- print
- print "Test-modules with import problems:"
- for test in import_errors:
- print " " + test.module
-
- def format_seconds(self, n_seconds):
- """Format a time in seconds."""
- if n_seconds >= 60:
- n_minutes, n_seconds = divmod(n_seconds, 60)
- return "%d minutes %.3f seconds" % (n_minutes, n_seconds)
- else:
- return "%.3f seconds" % n_seconds
-
- def format_seconds_short(self, n_seconds):
- """Format a time in seconds (short version)."""
- return "%.3f s" % n_seconds
-
- def summary(self, n_tests, n_failures, n_errors, n_seconds):
- """Summarize the results of a single test layer."""
- print (" Ran %s tests with %s failures and %s errors in %s."
- % (n_tests, n_failures, n_errors,
- self.format_seconds(n_seconds)))
-
- def totals(self, n_tests, n_failures, n_errors, n_seconds):
- """Summarize the results of all layers."""
- print ("Total: %s tests, %s failures, %s errors in %s."
- % (n_tests, n_failures, n_errors,
- self.format_seconds(n_seconds)))
-
- def list_of_tests(self, tests, layer_name):
- """Report a list of test names."""
- print "Listing %s tests:" % layer_name
- for test in tests:
- print ' ', test
-
- def garbage(self, garbage):
- """Report garbage generated by tests."""
- if garbage:
- print "Tests generated new (%d) garbage:" % len(garbage)
- print garbage
-
- def test_garbage(self, test, garbage):
- """Report garbage generated by a test."""
- if garbage:
- print "The following test left garbage:"
- print test
- print garbage
-
- def test_threads(self, test, new_threads):
- """Report threads left behind by a test."""
- if new_threads:
- print "The following test left new threads behind:"
- print test
- print "New thread(s):", new_threads
-
- def refcounts(self, rc, prev):
- """Report a change in reference counts."""
- print " sys refcount=%-8d change=%-6d" % (rc, rc - prev)
-
- def detailed_refcounts(self, track, rc, prev):
- """Report a change in reference counts, with extra detail."""
- print (" sum detail refcount=%-8d"
- " sys refcount=%-8d"
- " change=%-6d"
- % (track.n, rc, rc - prev))
- track.output()
-
- def start_set_up(self, layer_name):
- """Report that we're setting up a layer.
-
- The next output operation should be stop_set_up().
- """
- print " Set up %s" % layer_name,
- sys.stdout.flush()
-
- def stop_set_up(self, seconds):
- """Report that we've set up a layer.
-
- Should be called right after start_set_up().
- """
- print "in %s." % self.format_seconds(seconds)
-
- def start_tear_down(self, layer_name):
- """Report that we're tearing down a layer.
-
- The next output operation should be stop_tear_down() or
- tear_down_not_supported().
- """
- print " Tear down %s" % layer_name,
- sys.stdout.flush()
-
- def stop_tear_down(self, seconds):
- """Report that we've tore down a layer.
-
- Should be called right after start_tear_down().
- """
- print "in %s." % self.format_seconds(seconds)
-
- def tear_down_not_supported(self):
- """Report that we could not tear down a layer.
-
- Should be called right after start_tear_down().
- """
- print "... not supported"
-
- def start_test(self, test, tests_run, total_tests):
- """Report that we're about to run a test.
-
- The next output operation should be test_success(), test_error(), or
- test_failure().
- """
- self.test_width = 0
- if self.progress:
- if self.last_width:
- sys.stdout.write('\r' + (' ' * self.last_width) + '\r')
-
- s = " %d/%d (%.1f%%)" % (tests_run, total_tests,
- tests_run * 100.0 / total_tests)
- sys.stdout.write(s)
- self.test_width += len(s)
- if self.verbose == 1:
- room = self.max_width - self.test_width - 1
- s = self.getShortDescription(test, room)
- sys.stdout.write(s)
- self.test_width += len(s)
-
- elif self.verbose == 1:
- sys.stdout.write('.' * test.countTestCases())
-
- if self.verbose > 1:
- s = str(test)
- sys.stdout.write(' ')
- sys.stdout.write(s)
- self.test_width += len(s) + 1
-
- sys.stdout.flush()
-
- def test_success(self, test, seconds):
- """Report that a test was successful.
-
- Should be called right after start_test().
-
- The next output operation should be stop_test().
- """
- if self.verbose > 2:
- s = " (%s)" % self.format_seconds_short(seconds)
- sys.stdout.write(s)
- self.test_width += len(s) + 1
-
- def test_error(self, test, seconds, exc_info):
- """Report that an error occurred while running a test.
-
- Should be called right after start_test().
-
- The next output operation should be stop_test().
- """
- if self.verbose > 2:
- print " (%s)" % self.format_seconds_short(seconds)
- print
- self.print_traceback("Error in test %s" % test, exc_info)
- self.test_width = self.last_width = 0
-
- def test_failure(self, test, seconds, exc_info):
- """Report that a test failed.
-
- Should be called right after start_test().
-
- The next output operation should be stop_test().
- """
- if self.verbose > 2:
- print " (%s)" % self.format_seconds_short(seconds)
- print
- self.print_traceback("Failure in test %s" % test, exc_info)
- self.test_width = self.last_width = 0
-
- def print_traceback(self, msg, exc_info):
- """Report an error with a traceback."""
- print
- print msg
- print self.format_traceback(exc_info)
-
- def format_traceback(self, exc_info):
- """Format the traceback."""
- v = exc_info[1]
- if isinstance(v, doctest.DocTestFailureException):
- tb = v.args[0]
- elif isinstance(v, doctest.DocTestFailure):
- tb = doctest_template % (
- v.test.filename,
- v.test.lineno + v.example.lineno + 1,
- v.test.name,
- v.example.source,
- v.example.want,
- v.got,
- )
- else:
- tb = "".join(traceback.format_exception(*exc_info))
- return tb
-
- def stop_test(self, test):
- """Clean up the output state after a test."""
- if self.progress:
- self.last_width = self.test_width
- elif self.verbose > 1:
- print
- sys.stdout.flush()
-
- def stop_tests(self):
- """Clean up the output state after a collection of tests."""
- if self.progress and self.last_width:
- sys.stdout.write('\r' + (' ' * self.last_width) + '\r')
- if self.verbose == 1 or self.progress:
- print
-
-
-class ColorfulOutputFormatter(OutputFormatter):
- """Output formatter that uses ANSI color codes.
-
- Like syntax highlighting in your text editor, colorizing
- test failures helps the developer.
- """
-
- # These colors are carefully chosen to have enough contrast
- # on terminals with both black and white background.
- colorscheme = {'normal': 'normal',
- 'default': 'default',
- 'info': 'normal',
- 'suboptimal-behaviour': 'magenta',
- 'error': 'brightred',
- 'number': 'green',
- 'slow-test': 'brightmagenta',
- 'ok-number': 'green',
- 'error-number': 'brightred',
- 'filename': 'lightblue',
- 'lineno': 'lightred',
- 'testname': 'lightcyan',
- 'failed-example': 'cyan',
- 'expected-output': 'green',
- 'actual-output': 'red',
- 'character-diffs': 'magenta',
- 'diff-chunk': 'magenta',
- 'exception': 'red'}
-
- # Map prefix character to color in diff output. This handles ndiff and
- # udiff correctly, but not cdiff. In cdiff we ought to highlight '!' as
- # expected-output until we see a '-', then highlight '!' as actual-output,
- # until we see a '*', then switch back to highlighting '!' as
- # expected-output. Nevertheless, coloried cdiffs are reasonably readable,
- # so I'm not going to fix this.
- # -- mgedmin
- diff_color = {'-': 'expected-output',
- '+': 'actual-output',
- '?': 'character-diffs',
- '@': 'diff-chunk',
- '*': 'diff-chunk',
- '!': 'actual-output',}
-
- prefixes = [('dark', '0;'),
- ('light', '1;'),
- ('bright', '1;'),
- ('bold', '1;'),]
-
- colorcodes = {'default': 0, 'normal': 0,
- 'black': 30,
- 'red': 31,
- 'green': 32,
- 'brown': 33, 'yellow': 33,
- 'blue': 34,
- 'magenta': 35,
- 'cyan': 36,
- 'grey': 37, 'gray': 37, 'white': 37}
-
- slow_test_threshold = 10.0 # seconds
-
- def color_code(self, color):
- """Convert a color description (e.g. 'lightgray') to a terminal code."""
- prefix_code = ''
- for prefix, code in self.prefixes:
- if color.startswith(prefix):
- color = color[len(prefix):]
- prefix_code = code
- break
- color_code = self.colorcodes[color]
- return '\033[%s%sm' % (prefix_code, color_code)
-
- def color(self, what):
- """Pick a named color from the color scheme"""
- return self.color_code(self.colorscheme[what])
-
- def colorize(self, what, message, normal='normal'):
- """Wrap message in color."""
- return self.color(what) + message + self.color(normal)
-
- def error_count_color(self, n):
- """Choose a color for the number of errors."""
- if n:
- return self.color('error-number')
- else:
- return self.color('ok-number')
-
- def info(self, message):
- """Print an informative message."""
- print self.colorize('info', message)
-
- def info_suboptimal(self, message):
- """Print an informative message about losing some of the features.
-
- For example, when you run some tests in a subprocess, you lose the
- ability to use the debugger.
- """
- print self.colorize('suboptimal-behaviour', message)
-
- def error(self, message):
- """Report an error."""
- print self.colorize('error', message)
-
- def error_with_banner(self, message):
- """Report an error with a big ASCII banner."""
- print
- print self.colorize('error', '*'*70)
- self.error(message)
- print self.colorize('error', '*'*70)
- print
-
- def tear_down_not_supported(self):
- """Report that we could not tear down a layer.
-
- Should be called right after start_tear_down().
- """
- print "...", self.colorize('suboptimal-behaviour', "not supported")
-
- def format_seconds(self, n_seconds, normal='normal'):
- """Format a time in seconds."""
- if n_seconds >= 60:
- n_minutes, n_seconds = divmod(n_seconds, 60)
- return "%s minutes %s seconds" % (
- self.colorize('number', '%d' % n_minutes, normal),
- self.colorize('number', '%.3f' % n_seconds, normal))
- else:
- return "%s seconds" % (
- self.colorize('number', '%.3f' % n_seconds, normal))
-
- def format_seconds_short(self, n_seconds):
- """Format a time in seconds (short version)."""
- if n_seconds >= self.slow_test_threshold:
- color = 'slow-test'
- else:
- color = 'number'
- return self.colorize(color, "%.3f s" % n_seconds)
-
- def summary(self, n_tests, n_failures, n_errors, n_seconds):
- """Summarize the results."""
- sys.stdout.writelines([
- self.color('info'), ' Ran ',
- self.color('number'), str(n_tests),
- self.color('info'), ' tests with ',
- self.error_count_color(n_failures), str(n_failures),
- self.color('info'), ' failures and ',
- self.error_count_color(n_errors), str(n_errors),
- self.color('info'), ' errors in ',
- self.format_seconds(n_seconds, 'info'), '.',
- self.color('normal'), '\n'])
-
- def totals(self, n_tests, n_failures, n_errors, n_seconds):
- """Report totals (number of tests, failures, and errors)."""
- sys.stdout.writelines([
- self.color('info'), 'Total: ',
- self.color('number'), str(n_tests),
- self.color('info'), ' tests, ',
- self.error_count_color(n_failures), str(n_failures),
- self.color('info'), ' failures, ',
- self.error_count_color(n_errors), str(n_errors),
- self.color('info'), ' errors in ',
- self.format_seconds(n_seconds, 'info'), '.',
- self.color('normal'), '\n'])
-
- def print_traceback(self, msg, exc_info):
- """Report an error with a traceback."""
- print
- print self.colorize('error', msg)
- v = exc_info[1]
- if isinstance(v, doctest.DocTestFailureException):
- self.print_doctest_failure(v.args[0])
- elif isinstance(v, doctest.DocTestFailure):
- # I don't think these are ever used... -- mgedmin
- tb = self.format_traceback(exc_info)
- print tb
- else:
- tb = self.format_traceback(exc_info)
- self.print_colorized_traceback(tb)
-
- def print_doctest_failure(self, formatted_failure):
- """Report a doctest failure.
-
- ``formatted_failure`` is a string -- that's what
- DocTestSuite/DocFileSuite gives us.
- """
- color_of_indented_text = 'normal'
- colorize_diff = False
- for line in formatted_failure.splitlines():
- if line.startswith('File '):
- m = re.match(r'File "(.*)", line (\d*), in (.*)$', line)
- if m:
- filename, lineno, test = m.groups()
- sys.stdout.writelines([
- self.color('normal'), 'File "',
- self.color('filename'), filename,
- self.color('normal'), '", line ',
- self.color('lineno'), lineno,
- self.color('normal'), ', in ',
- self.color('testname'), test,
- self.color('normal'), '\n'])
- else:
- print line
- elif line.startswith(' '):
- if colorize_diff and len(line) > 4:
- color = self.diff_color.get(line[4], color_of_indented_text)
- print self.colorize(color, line)
- else:
- print self.colorize(color_of_indented_text, line)
- else:
- colorize_diff = False
- if line.startswith('Failed example'):
- color_of_indented_text = 'failed-example'
- elif line.startswith('Expected:'):
- color_of_indented_text = 'expected-output'
- elif line.startswith('Got:'):
- color_of_indented_text = 'actual-output'
- elif line.startswith('Exception raised:'):
- color_of_indented_text = 'exception'
- elif line.startswith('Differences '):
- color_of_indented_text = 'normal'
- colorize_diff = True
- else:
- color_of_indented_text = 'normal'
- print line
- print
-
- def print_colorized_traceback(self, formatted_traceback):
- """Report a test failure.
-
- ``formatted_traceback`` is a string.
- """
- for line in formatted_traceback.splitlines():
- if line.startswith(' File'):
- m = re.match(r' File "(.*)", line (\d*), in (.*)$', line)
- if m:
- filename, lineno, test = m.groups()
- sys.stdout.writelines([
- self.color('normal'), ' File "',
- self.color('filename'), filename,
- self.color('normal'), '", line ',
- self.color('lineno'), lineno,
- self.color('normal'), ', in ',
- self.color('testname'), test,
- self.color('normal'), '\n'])
- else:
- print line
- elif line.startswith(' '):
- print self.colorize('failed-example', line)
- elif line.startswith('Traceback (most recent call last)'):
- print line
- else:
- print self.colorize('exception', line)
- print
-
-
-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(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
-
- Passing a list of suites using the found_suites parameter will cause
- that list of suites to be used instead of attempting to load them from
- the filesystem. This is useful for unit testing the test runner.
-
- Returns True if all tests passed, or False if there were any failures
- of any kind.
- """
-
- global _layer_name_cache
- _layer_name_cache = {} # Reset to enforce test isolation
-
- output = options.output
-
- if options.resume_layer:
- original_stderr = sys.stderr
- sys.stderr = sys.stdout
- elif options.verbose:
- if options.all:
- msg = "Running tests at all levels"
- else:
- msg = "Running tests at level %d" % options.at_level
- output.info(msg)
-
-
- old_threshold = gc.get_threshold()
- if options.gc:
- if len(options.gc) > 3:
- output.error("Too many --gc options")
- sys.exit(1)
- if options.gc[0]:
- output.info("Cyclic garbage collection threshold set to: %s" %
- repr(tuple(options.gc)))
- else:
- output.info("Cyclic garbage collection is disabled.")
-
- gc.set_threshold(*options.gc)
-
- old_flags = gc.get_debug()
- if options.gc_option:
- new_flags = 0
- for op in options.gc_option:
- new_flags |= getattr(gc, op)
- gc.set_debug(new_flags)
-
- old_reporting_flags = doctest.set_unittest_reportflags(0)
- reporting_flags = 0
- if options.ndiff:
- reporting_flags = doctest.REPORT_NDIFF
- if options.udiff:
- if reporting_flags:
- output.error("Can only give one of --ndiff, --udiff, or --cdiff")
- sys.exit(1)
- reporting_flags = doctest.REPORT_UDIFF
- if options.cdiff:
- if reporting_flags:
- output.error("Can only give one of --ndiff, --udiff, or --cdiff")
- sys.exit(1)
- reporting_flags = doctest.REPORT_CDIFF
- if options.report_only_first_failure:
- reporting_flags |= doctest.REPORT_ONLY_FIRST_FAILURE
-
- if reporting_flags:
- doctest.set_unittest_reportflags(reporting_flags)
- else:
- doctest.set_unittest_reportflags(old_reporting_flags)
-
-
- # Add directories to the path
- for path in options.path:
- if path not in sys.path:
- sys.path.append(path)
-
- remove_stale_bytecode(options)
-
- tests_by_layer_name = find_tests(options, found_suites)
-
- ran = 0
- failures = []
- errors = []
- nlayers = 0
- import_errors = tests_by_layer_name.pop(None, None)
-
- output.import_errors(import_errors)
-
- if 'unit' in tests_by_layer_name:
- tests = tests_by_layer_name.pop('unit')
- if (not options.non_unit) and not options.resume_layer:
- if options.layer:
- should_run = False
- for pat in options.layer:
- if pat('unit'):
- should_run = True
- break
- else:
- should_run = True
-
- if should_run:
- if options.list_tests:
- output.list_of_tests(tests, 'unit')
- else:
- output.info("Running unit tests:")
- nlayers += 1
- ran += run_tests(options, tests, 'unit', failures, errors)
-
- setup_layers = {}
-
- layers_to_run = list(ordered_layers(tests_by_layer_name))
- if options.resume_layer is not None:
- layers_to_run = [
- (layer_name, layer, tests)
- for (layer_name, layer, tests) in layers_to_run
- if layer_name == options.resume_layer
- ]
- elif options.layer:
- layers_to_run = [
- (layer_name, layer, tests)
- for (layer_name, layer, tests) in layers_to_run
- if filter(None, [pat(layer_name) for pat in options.layer])
- ]
-
-
- if options.list_tests:
- for layer_name, layer, tests in layers_to_run:
- output.list_of_tests(tests, layer_name)
- return True
-
- start_time = time.time()
-
- for layer_name, layer, tests in layers_to_run:
- nlayers += 1
- try:
- ran += run_layer(options, layer_name, layer, tests,
- setup_layers, failures, errors)
- except CanNotTearDown:
- setup_layers = None
- if not options.resume_layer:
- ran += resume_tests(options, layer_name, layers_to_run,
- failures, errors)
- break
-
- if setup_layers:
- if options.resume_layer == None:
- output.info("Tearing down left over layers:")
- tear_down_unneeded(options, (), setup_layers, True)
-
- total_time = time.time() - start_time
-
- if options.resume_layer:
- sys.stdout.close()
- # Communicate with the parent. The protocol is obvious:
- print >> original_stderr, ran, len(failures), len(errors)
- for test, exc_info in failures:
- print >> original_stderr, ' '.join(str(test).strip().split('\n'))
- for test, exc_info in errors:
- print >> original_stderr, ' '.join(str(test).strip().split('\n'))
-
- else:
- if options.verbose:
- output.tests_with_errors(errors)
- output.tests_with_failures(failures)
-
- if nlayers != 1:
- output.totals(ran, len(failures), len(errors), total_time)
-
- output.modules_with_import_problems(import_errors)
-
- doctest.set_unittest_reportflags(old_reporting_flags)
-
- if options.gc_option:
- gc.set_debug(old_flags)
-
- if options.gc:
- gc.set_threshold(*old_threshold)
-
- return not bool(import_errors or failures or errors)
-
-
-def run_tests(options, tests, name, failures, errors):
- repeat = options.repeat or 1
- repeat_range = iter(range(repeat))
- ran = 0
-
- output = options.output
-
- gc.collect()
- lgarbage = len(gc.garbage)
-
- sumrc = 0
- if options.report_refcounts:
- if options.verbose:
- track = TrackRefs()
- rc = sys.gettotalrefcount()
-
- for iteration in repeat_range:
- if repeat > 1:
- output.info("Iteration %d" % (iteration + 1))
-
- if options.verbose > 0 or options.progress:
- output.info(' Running:')
- result = TestResult(options, tests, layer_name=name)
-
- t = time.time()
-
- if options.post_mortem:
- # post-mortem debugging
- for test in tests:
- if result.shouldStop:
- break
- result.startTest(test)
- state = test.__dict__.copy()
- try:
- try:
- test.debug()
- except KeyboardInterrupt:
- raise
- except:
- result.addError(
- test,
- sys.exc_info()[:2] + (sys.exc_info()[2].tb_next, ),
- )
- else:
- result.addSuccess(test)
- finally:
- result.stopTest(test)
- test.__dict__.clear()
- test.__dict__.update(state)
-
- else:
- # normal
- for test in tests:
- if result.shouldStop:
- break
- state = test.__dict__.copy()
- test(result)
- test.__dict__.clear()
- test.__dict__.update(state)
-
- t = time.time() - t
- output.stop_tests()
- failures.extend(result.failures)
- errors.extend(result.errors)
- output.summary(result.testsRun, len(result.failures), len(result.errors), t)
- ran = result.testsRun
-
- gc.collect()
- if len(gc.garbage) > lgarbage:
- output.garbage(gc.garbage[lgarbage:])
- lgarbage = len(gc.garbage)
-
- if options.report_refcounts:
-
- # If we are being tested, we don't want stdout itself to
- # foul up the numbers. :)
- try:
- sys.stdout.getvalue()
- except AttributeError:
- pass
-
- prev = rc
- rc = sys.gettotalrefcount()
- if options.verbose:
- track.update()
- if iteration > 0:
- output.detailed_refcounts(track, rc, prev)
- else:
- track.delta = None
- elif iteration > 0:
- output.refcounts(rc, prev)
-
- return ran
-
-def run_layer(options, layer_name, layer, tests, setup_layers,
- failures, errors):
-
- output = options.output
- gathered = []
- gather_layers(layer, gathered)
- needed = dict([(l, 1) for l in gathered])
- if options.resume_number != 0:
- output.info("Running %s tests:" % layer_name)
- tear_down_unneeded(options, needed, setup_layers)
-
- if options.resume_layer != None:
- output.info_suboptimal( " Running in a subprocess.")
-
- try:
- setup_layer(options, layer, setup_layers)
- except EndRun:
- raise
- except Exception:
- f = cStringIO.StringIO()
- traceback.print_exc(file=f)
- output.error(f.getvalue())
- errors.append((SetUpLayerFailure(), sys.exc_info()))
- return 0
- else:
- return run_tests(options, tests, layer_name, failures, errors)
-
-class SetUpLayerFailure(unittest.TestCase):
- def runTest(self):
- "Layer set up failure."
-
-def resume_tests(options, layer_name, layers, failures, errors):
- output = options.output
- layers = [l for (l, _, _) in layers]
- layers = layers[layers.index(layer_name):]
- rantotal = 0
- resume_number = 0
- for layer_name in layers:
- args = [sys.executable,
- options.original_testrunner_args[0],
- '--resume-layer', layer_name, str(resume_number),
- ]
- resume_number += 1
- for d in options.testrunner_defaults:
- args.extend(['--default', d])
-
- args.extend(options.original_testrunner_args[1:])
-
- # this is because of a bug in Python (http://www.python.org/sf/900092)
- if (options.profile == 'hotshot'
- and sys.version_info[:3] <= (2,4,1)):
- args.insert(1, '-O')
-
- if sys.platform.startswith('win'):
- args = args[0] + ' ' + ' '.join([
- ('"' + a.replace('\\', '\\\\').replace('"', '\\"') + '"')
- for a in args[1:]
- ])
-
- subin, subout, suberr = os.popen3(args)
- while True:
- try:
- for l in subout:
- sys.stdout.write(l)
- except IOError, e:
- if e.errno == errno.EINTR:
- # If the subprocess dies before we finish reading its
- # output, a SIGCHLD signal can interrupt the reading.
- # The correct thing to to in that case is to retry.
- continue
- output.error("Error reading subprocess output for %s" % layer_name)
- output.info(str(e))
- else:
- break
-
- line = suberr.readline()
- try:
- ran, nfail, nerr = map(int, line.strip().split())
- except KeyboardInterrupt:
- raise
- except:
- raise SubprocessError(line+suberr.read())
-
- while nfail > 0:
- nfail -= 1
- failures.append((suberr.readline().strip(), None))
- while nerr > 0:
- nerr -= 1
- errors.append((suberr.readline().strip(), None))
-
- rantotal += ran
-
- return rantotal
-
-
-class SubprocessError(Exception):
- """An error occurred when running a subprocess
- """
-
-class CanNotTearDown(Exception):
- "Couldn't tear down a test"
-
-def tear_down_unneeded(options, needed, setup_layers, optional=False):
- # Tear down any layers not needed for these tests. The unneeded
- # layers might interfere.
- unneeded = [l for l in setup_layers if l not in needed]
- unneeded = order_by_bases(unneeded)
- unneeded.reverse()
- output = options.output
- for l in unneeded:
- output.start_tear_down(name_from_layer(l))
- t = time.time()
- try:
- if hasattr(l, 'tearDown'):
- l.tearDown()
- except NotImplementedError:
- output.tear_down_not_supported()
- if not optional:
- raise CanNotTearDown(l)
- else:
- output.stop_tear_down(time.time() - t)
- del setup_layers[l]
-
-
-cant_pm_in_subprocess_message = """
-Can't post-mortem debug when running a layer as a subprocess!
-Try running layer %r by itself.
-"""
-
-def setup_layer(options, layer, setup_layers):
- assert layer is not object
- output = options.output
- if layer not in setup_layers:
- for base in layer.__bases__:
- if base is not object:
- setup_layer(options, base, setup_layers)
- output.start_set_up(name_from_layer(layer))
- t = time.time()
- if hasattr(layer, 'setUp'):
- try:
- layer.setUp()
- except Exception:
- if options.post_mortem:
- if options.resume_layer:
- options.output.error_with_banner(
- cant_pm_in_subprocess_message
- % options.resume_layer)
- raise
- else:
- post_mortem(sys.exc_info())
- else:
- raise
-
- output.stop_set_up(time.time() - t)
- setup_layers[layer] = 1
-
-def dependencies(bases, result):
- for base in bases:
- result[base] = 1
- dependencies(base.__bases__, result)
-
-class TestResult(unittest.TestResult):
-
- def __init__(self, options, tests, layer_name=None):
- unittest.TestResult.__init__(self)
- self.options = options
- # Calculate our list of relevant layers we need to call testSetUp
- # and testTearDown on.
- if layer_name != 'unit':
- layers = []
- gather_layers(layer_from_name(layer_name), layers)
- self.layers = order_by_bases(layers)
- else:
- self.layers = []
- count = 0
- for test in tests:
- count += test.countTestCases()
- self.count = count
-
- def testSetUp(self):
- """A layer may define a setup method to be called before each
- individual test.
- """
- for layer in self.layers:
- if hasattr(layer, 'testSetUp'):
- layer.testSetUp()
-
- def testTearDown(self):
- """A layer may define a teardown method to be called after each
- individual test.
-
- This is useful for clearing the state of global
- resources or resetting external systems such as relational
- databases or daemons.
- """
- for layer in self.layers[-1::-1]:
- if hasattr(layer, 'testTearDown'):
- layer.testTearDown()
-
- def startTest(self, test):
- self.testSetUp()
- unittest.TestResult.startTest(self, test)
- testsRun = self.testsRun - 1 # subtract the one the base class added
- count = test.countTestCases()
- self.testsRun = testsRun + count
-
- self.options.output.start_test(test, self.testsRun, self.count)
-
- self._threads = threading.enumerate()
- self._start_time = time.time()
-
- def addSuccess(self, test):
- t = max(time.time() - self._start_time, 0.0)
- self.options.output.test_success(test, t)
-
- def addError(self, test, exc_info):
- self.options.output.test_error(test, time.time() - self._start_time,
- exc_info)
-
- unittest.TestResult.addError(self, test, exc_info)
-
- if self.options.post_mortem:
- if self.options.resume_layer:
- self.options.output.error_with_banner("Can't post-mortem debug"
- " when running a layer"
- " as a subprocess!")
- else:
- post_mortem(exc_info)
-
- def addFailure(self, test, exc_info):
- self.options.output.test_failure(test, time.time() - self._start_time,
- exc_info)
-
- unittest.TestResult.addFailure(self, test, exc_info)
-
- if self.options.post_mortem:
- # XXX: mgedmin: why isn't there a resume_layer check here like
- # in addError?
- post_mortem(exc_info)
-
- def stopTest(self, test):
- self.testTearDown()
- self.options.output.stop_test(test)
-
- if gc.garbage:
- self.options.output.test_garbage(test, gc.garbage)
- # TODO: Perhaps eat the garbage here, so that the garbage isn't
- # printed for every subsequent test.
-
- # Did the test leave any new threads behind?
- new_threads = [t for t in threading.enumerate()
- if (t.isAlive()
- and
- t not in self._threads)]
- if new_threads:
- self.options.output.test_threads(test, new_threads)
-
-
-class FakeInputContinueGenerator:
-
- def readline(self):
- print 'c\n'
- print '*'*70
- print ("Can't use pdb.set_trace when running a layer"
- " as a subprocess!")
- print '*'*70
- print
- return 'c\n'
-
-
-def post_mortem(exc_info):
- err = exc_info[1]
- if isinstance(err, (doctest.UnexpectedException, doctest.DocTestFailure)):
-
- if isinstance(err, doctest.UnexpectedException):
- exc_info = err.exc_info
-
- # Print out location info if the error was in a doctest
- if exc_info[2].tb_frame.f_code.co_filename == '<string>':
- print_doctest_location(err)
-
- else:
- print_doctest_location(err)
- # Hm, we have a DocTestFailure exception. We need to
- # generate our own traceback
- try:
- exec ('raise ValueError'
- '("Expected and actual output are different")'
- ) in err.test.globs
- except:
- exc_info = sys.exc_info()
-
- print "%s:" % (exc_info[0], )
- print exc_info[1]
- pdb.post_mortem(exc_info[2])
- raise EndRun
-
-def print_doctest_location(err):
- # This mimics pdb's output, which gives way cool results in emacs :)
- filename = err.test.filename
- if filename.endswith('.pyc'):
- filename = filename[:-1]
- print "> %s(%s)_()" % (filename, err.test.lineno+err.example.lineno+1)
-
-def ordered_layers(tests_by_layer_name):
- layer_names = dict([(layer_from_name(layer_name), layer_name)
- for layer_name in tests_by_layer_name])
- for layer in order_by_bases(layer_names):
- layer_name = layer_names[layer]
- yield layer_name, layer, tests_by_layer_name[layer_name]
-
-def gather_layers(layer, result):
- if layer is not object:
- result.append(layer)
- for b in layer.__bases__:
- gather_layers(b, result)
-
-def layer_from_name(layer_name):
- """Return the layer for the corresponding layer_name by discovering
- and importing the necessary module if necessary.
-
- Note that a name -> layer cache is maintained by name_from_layer
- to allow locating layers in cases where it would otherwise be
- impossible.
- """
- global _layer_name_cache
- if _layer_name_cache.has_key(layer_name):
- return _layer_name_cache[layer_name]
- layer_names = layer_name.split('.')
- layer_module, module_layer_name = layer_names[:-1], layer_names[-1]
- return getattr(import_name('.'.join(layer_module)), module_layer_name)
-
-def order_by_bases(layers):
- """Order the layers from least to most specific (bottom to top)
- """
- named_layers = [(name_from_layer(layer), layer) for layer in layers]
- named_layers.sort()
- named_layers.reverse()
- gathered = []
- for name, layer in named_layers:
- gather_layers(layer, gathered)
- gathered.reverse()
- seen = {}
- result = []
- for layer in gathered:
- if layer not in seen:
- seen[layer] = 1
- if layer in layers:
- result.append(layer)
- return result
-
-_layer_name_cache = {}
-
-def name_from_layer(layer):
- """Determine a name for the Layer using the namespace to avoid conflicts.
-
- We also cache a name -> layer mapping to enable layer_from_name to work
- in cases where the layer cannot be imported (such as layers defined
- in doctests)
- """
- if layer.__module__ == '__builtin__':
- name = layer.__name__
- else:
- name = layer.__module__ + '.' + layer.__name__
- _layer_name_cache[name] = layer
- return name
-
-def find_tests(options, found_suites=None):
- """Creates a dictionary mapping layer name to a suite of tests to be run
- in that layer.
-
- Passing a list of suites using the found_suites parameter will cause
- that list of suites to be used instead of attempting to load them from
- the filesystem. This is useful for unit testing the test runner.
- """
- suites = {}
- if found_suites is None:
- found_suites = find_suites(options)
- for suite in found_suites:
- for test, layer_name in tests_from_suite(suite, options):
- suite = suites.get(layer_name)
- if not suite:
- suite = suites[layer_name] = unittest.TestSuite()
- suite.addTest(test)
- return suites
-
-def tests_from_suite(suite, options, dlevel=1, dlayer='unit'):
- """Returns a sequence of (test, layer_name)
-
- The tree of suites is recursively visited, with the most specific
- layer taking precedence. So if a TestCase with a layer of 'foo' is
- contained in a TestSuite with a layer of 'bar', the test case would be
- returned with 'foo' as the layer.
-
- Tests are also filtered out based on the test level and test selection
- filters stored in the options.
- """
- level = getattr(suite, 'level', dlevel)
- layer = getattr(suite, 'layer', dlayer)
- if not isinstance(layer, basestring):
- layer = name_from_layer(layer)
-
- if isinstance(suite, unittest.TestSuite):
- for possible_suite in suite:
- for r in tests_from_suite(possible_suite, options, level, layer):
- yield r
- elif isinstance(suite, StartUpFailure):
- yield (suite, None)
- else:
- if level <= options.at_level:
- for pat in options.test:
- if pat(str(suite)):
- yield (suite, layer)
- break
-
-
-def find_suites(options):
- for fpath, package in find_test_files(options):
- for (prefix, prefix_package) in options.prefix:
- if fpath.startswith(prefix) and package == prefix_package:
- # strip prefix, strip .py suffix and convert separator to dots
- noprefix = fpath[len(prefix):]
- noext = strip_py_ext(options, noprefix)
- assert noext is not None
- module_name = noext.replace(os.path.sep, '.')
- if package:
- module_name = package + '.' + module_name
-
- for filter in options.module:
- if filter(module_name):
- break
- else:
- continue
-
- try:
- module = import_name(module_name)
- except KeyboardInterrupt:
- raise
- except:
- suite = StartUpFailure(
- options, module_name,
- sys.exc_info()[:2]
- + (sys.exc_info()[2].tb_next.tb_next,),
- )
- else:
- try:
- suite = getattr(module, options.suite_name)()
- if isinstance(suite, unittest.TestSuite):
- check_suite(suite, module_name)
- else:
- raise TypeError(
- "Invalid test_suite, %r, in %s"
- % (suite, module_name)
- )
- except KeyboardInterrupt:
- raise
- except:
- suite = StartUpFailure(
- options, module_name, sys.exc_info()[:2]+(None,))
-
-
- yield suite
- break
-
-
-def check_suite(suite, module_name):
- """Check for bad tests in a test suite.
-
- "Bad tests" are those that do not inherit from unittest.TestCase.
-
- Note that this function is pointless on Python 2.5, because unittest itself
- checks for this in TestSuite.addTest. It is, however, useful on earlier
- Pythons.
- """
- for x in suite:
- if isinstance(x, unittest.TestSuite):
- check_suite(x, module_name)
- elif not isinstance(x, unittest.TestCase):
- raise TypeError(
- "Invalid test, %r,\nin test_suite from %s"
- % (x, module_name)
- )
-
-
-
-
-class StartUpFailure(unittest.TestCase):
- """Empty test case added to the test suite to indicate import failures."""
-
- def __init__(self, options, module, exc_info):
- if options.post_mortem:
- post_mortem(exc_info)
- self.module = module
- self.exc_info = exc_info
-
-
-def find_test_files(options):
- found = {}
- for f, package in find_test_files_(options):
- if f not in found:
- found[f] = 1
- yield f, package
-
-identifier = re.compile(r'[_a-zA-Z]\w*$').match
-def find_test_files_(options):
- tests_pattern = options.tests_pattern
- test_file_pattern = options.test_file_pattern
-
- # If options.usecompiled, we can accept .pyc or .pyo files instead
- # of .py files. We'd rather use a .py file if one exists. `root2ext`
- # maps a test file path, sans extension, to the path with the best
- # extension found (.py if it exists, else .pyc or .pyo).
- # Note that "py" < "pyc" < "pyo", so if more than one extension is
- # found, the lexicographically smaller one is best.
-
- # Found a new test file, in directory `dirname`. `noext` is the
- # file name without an extension, and `withext` is the file name
- # with its extension.
- def update_root2ext(dirname, noext, withext):
- key = os.path.join(dirname, noext)
- new = os.path.join(dirname, withext)
- if key in root2ext:
- root2ext[key] = min(root2ext[key], new)
- else:
- root2ext[key] = new
-
- for (p, package) in test_dirs(options, {}):
- for dirname, dirs, files in walk_with_symlinks(options, p):
- if dirname != p and not contains_init_py(options, files):
- continue # not a plausible test directory
- root2ext = {}
- dirs[:] = filter(identifier, dirs)
- d = os.path.split(dirname)[1]
- if tests_pattern(d) and contains_init_py(options, files):
- # tests directory
- for file in files:
- noext = strip_py_ext(options, file)
- if noext and test_file_pattern(noext):
- update_root2ext(dirname, noext, file)
-
- for file in files:
- noext = strip_py_ext(options, file)
- if noext and tests_pattern(noext):
- update_root2ext(dirname, noext, file)
-
- winners = root2ext.values()
- winners.sort()
- for file in winners:
- yield file, package
-
-def walk_with_symlinks(options, dir):
- # TODO -- really should have test of this that uses symlinks
- # this is hard on a number of levels ...
- for dirpath, dirs, files in os.walk(dir):
- dirs.sort()
- files.sort()
- dirs[:] = [d for d in dirs if d not in options.ignore_dir]
- yield (dirpath, dirs, files)
- for d in dirs:
- p = os.path.join(dirpath, d)
- if os.path.islink(p):
- for sdirpath, sdirs, sfiles in walk_with_symlinks(options, p):
- yield (sdirpath, sdirs, sfiles)
-
-compiled_sufixes = '.pyc', '.pyo'
-def remove_stale_bytecode(options):
- if options.keepbytecode:
- return
- for (p, _) in options.test_path:
- for dirname, dirs, files in walk_with_symlinks(options, p):
- for file in files:
- if file[-4:] in compiled_sufixes and file[:-1] not in files:
- fullname = os.path.join(dirname, file)
- options.output.info("Removing stale bytecode file %s"
- % fullname)
- os.unlink(fullname)
-
-
-def test_dirs(options, seen):
- if options.package:
- for p in options.package:
- p = import_name(p)
- for p in p.__path__:
- p = os.path.abspath(p)
- if p in seen:
- continue
- for (prefix, package) in options.prefix:
- if p.startswith(prefix) or p == prefix[:-1]:
- seen[p] = 1
- yield p, package
- break
- else:
- for dpath in options.test_path:
- yield dpath
-
-
-def import_name(name):
- __import__(name)
- return sys.modules[name]
-
-def configure_logging():
- """Initialize the logging module."""
- import logging.config
-
- # Get the log.ini file from the current directory instead of
- # possibly buried in the build directory. TODO: This isn't
- # perfect because if log.ini specifies a log file, it'll be
- # relative to the build directory. Hmm... logini =
- # os.path.abspath("log.ini")
-
- logini = os.path.abspath("log.ini")
- if os.path.exists(logini):
- logging.config.fileConfig(logini)
- else:
- # If there's no log.ini, cause the logging package to be
- # silent during testing.
- root = logging.getLogger()
- root.addHandler(NullHandler())
- logging.basicConfig()
-
- if os.environ.has_key("LOGGING"):
- level = int(os.environ["LOGGING"])
- logging.getLogger().setLevel(level)
-
-class NullHandler(logging.Handler):
- """Logging handler that drops everything on the floor.
-
- We require silence in the test environment. Hush.
- """
-
- def emit(self, record):
- pass
-
-
-class TrackRefs(object):
- """Object to track reference counts across test runs."""
-
- def __init__(self):
- self.type2count = {}
- self.type2all = {}
- self.delta = None
- self.n = 0
- self.update()
- self.delta = None
-
- def update(self):
- gc.collect()
- obs = sys.getobjects(0)
- type2count = {}
- type2all = {}
- n = 0
- for o in obs:
- if type(o) is str and o == '<dummy key>':
- # avoid dictionary madness
- continue
-
- all = sys.getrefcount(o) - 3
- n += all
-
- t = type(o)
- if t is types.InstanceType:
- t = o.__class__
-
- if t in type2count:
- type2count[t] += 1
- type2all[t] += all
- else:
- type2count[t] = 1
- type2all[t] = all
-
-
- ct = [(
- type_or_class_title(t),
- type2count[t] - self.type2count.get(t, 0),
- type2all[t] - self.type2all.get(t, 0),
- )
- for t in type2count.iterkeys()]
- ct += [(
- type_or_class_title(t),
- - self.type2count[t],
- - self.type2all[t],
- )
- for t in self.type2count.iterkeys()
- if t not in type2count]
- ct.sort()
- self.delta = ct
- self.type2count = type2count
- self.type2all = type2all
- self.n = n
-
-
- def output(self):
- printed = False
- s1 = s2 = 0
- for t, delta1, delta2 in self.delta:
- if delta1 or delta2:
- if not printed:
- print (
- ' Leak details, changes in instances and refcounts'
- ' by type/class:')
- print " %-55s %6s %6s" % ('type/class', 'insts', 'refs')
- print " %-55s %6s %6s" % ('-' * 55, '-----', '----')
- printed = True
- print " %-55s %6d %6d" % (t, delta1, delta2)
- s1 += delta1
- s2 += delta2
-
- if printed:
- print " %-55s %6s %6s" % ('-' * 55, '-----', '----')
- print " %-55s %6s %6s" % ('total', s1, s2)
-
-
- self.delta = None
-
-def type_or_class_title(t):
- module = getattr(t, '__module__', '__builtin__')
- if module == '__builtin__':
- return t.__name__
- return "%s.%s" % (module, t.__name__)
-
-
-###############################################################################
-# Command-line UI
-
-parser = optparse.OptionParser("Usage: %prog [options] [MODULE] [TEST]")
-
-######################################################################
-# Searching and filtering
-
-searching = optparse.OptionGroup(parser, "Searching and filtering", """\
-Options in this group are used to define which tests to run.
-""")
-
-searching.add_option(
- '--package', '--dir', '-s', action="append", dest='package',
- help="""\
-Search the given package's directories for tests. This can be
-specified more than once to run tests in multiple parts of the source
-tree. For example, if refactoring interfaces, you don't want to see
-the way you have broken setups for tests in other packages. You *just*
-want to run the interface tests.
-
-Packages are supplied as dotted names. For compatibility with the old
-test runner, forward and backward slashed in package names are
-converted to dots.
-
-(In the special case of packages spread over multiple directories,
-only directories within the test search path are searched. See the
---path option.)
-
-""")
-
-searching.add_option(
- '--module', '-m', action="append", dest='module',
- help="""\
-Specify a test-module filter as a regular expression. This is a
-case-sensitive regular expression, used in search (not match) mode, to
-limit which test modules are searched for tests. The regular
-expressions are checked against dotted module names. In an extension
-of Python regexp notation, a leading "!" is stripped and causes the
-sense of the remaining regexp to be negated (so "!bc" matches any
-string that does not match "bc", and vice versa). The option can be
-specified multiple test-module filters. Test modules matching any of
-the test filters are searched. If no test-module filter is specified,
-then all test modules are used.
-""")
-
-searching.add_option(
- '--test', '-t', action="append", dest='test',
- help="""\
-Specify a test filter as a regular expression. This is a
-case-sensitive regular expression, used in search (not match) mode, to
-limit which tests are run. In an extension of Python regexp notation,
-a leading "!" is stripped and causes the sense of the remaining regexp
-to be negated (so "!bc" matches any string that does not match "bc",
-and vice versa). The option can be specified multiple test filters.
-Tests matching any of the test filters are included. If no test
-filter is specified, then all tests are run.
-""")
-
-searching.add_option(
- '--unit', '-u', action="store_true", dest='unit',
- help="""\
-Run only unit tests, ignoring any layer options.
-""")
-
-searching.add_option(
- '--non-unit', '-f', action="store_true", dest='non_unit',
- help="""\
-Run tests other than unit tests.
-""")
-
-searching.add_option(
- '--layer', action="append", dest='layer',
- help="""\
-Specify a test layer to run. The option can be given multiple times
-to specify more than one layer. If not specified, all layers are run.
-It is common for the running script to provide default values for this
-option. Layers are specified regular expressions, used in search
-mode, for dotted names of objects that define a layer. In an
-extension of Python regexp notation, a leading "!" is stripped and
-causes the sense of the remaining regexp to be negated (so "!bc"
-matches any string that does not match "bc", and vice versa). The
-layer named 'unit' is reserved for unit tests, however, take note of
-the --unit and non-unit options.
-""")
-
-searching.add_option(
- '-a', '--at-level', type='int', dest='at_level',
- help="""\
-Run the tests at the given level. Any test at a level at or below
-this is run, any test at a level above this is not run. Level 0
-runs all tests.
-""")
-
-searching.add_option(
- '--all', action="store_true", dest='all',
- help="Run tests at all levels.")
-
-searching.add_option(
- '--list-tests', action="store_true", dest='list_tests', default=False,
- help="List all tests that matched your filters. Do not run any tests.")
-
-parser.add_option_group(searching)
-
-######################################################################
-# Reporting
-
-reporting = optparse.OptionGroup(parser, "Reporting", """\
-Reporting options control basic aspects of test-runner output
-""")
-
-reporting.add_option(
- '--verbose', '-v', action="count", dest='verbose',
- help="""\
-Make output more verbose.
-Increment the verbosity level.
-""")
-
-reporting.add_option(
- '--quiet', '-q', action="store_true", dest='quiet',
- help="""\
-Make the output minimal, overriding any verbosity options.
-""")
-
-reporting.add_option(
- '--progress', '-p', action="store_true", dest='progress',
- help="""\
-Output progress status
-""")
-
-reporting.add_option(
- '--no-progress',action="store_false", dest='progress',
- help="""\
-Do not output progress status. This is the default, but can be used to
-counter a previous use of --progress or -p.
-""")
-
-# We use a noop callback because the actual processing will be done in the
-# get_options function, but we want optparse to generate appropriate help info
-# for us, so we add an option anyway.
-reporting.add_option(
- '--auto-progress', action="callback", callback=lambda *args: None,
- help="""\
-Output progress status, but only when stdout is a terminal.
-""")
-
-reporting.add_option(
- '--color', '-c', action="store_true", dest='color',
- help="""\
-Colorize the output.
-""")
-
-reporting.add_option(
- '--no-color', '-C', action="store_false", dest='color',
- help="""\
-Do not colorize the output. This is the default, but can be used to
-counter a previous use of --color or -c.
-""")
-
-# We use a noop callback because the actual processing will be done in the
-# get_options function, but we want optparse to generate appropriate help info
-# for us, so we add an option anyway.
-reporting.add_option(
- '--auto-color', action="callback", callback=lambda *args: None,
- help="""\
-Colorize the output, but only when stdout is a terminal.
-""")
-
-reporting.add_option(
- '--slow-test', type='float', dest='slow_test_threshold',
- metavar='N', default=10,
- help="""\
-With -c and -vvv, highlight tests that take longer than N seconds (default:
-%default).
-""")
-
-reporting.add_option(
- '-1', '--hide-secondary-failures',
- action="store_true", dest='report_only_first_failure',
- help="""\
-Report only the first failure in a doctest. (Examples after the
-failure are still executed, in case they do any cleanup.)
-""")
-
-reporting.add_option(
- '--show-secondary-failures',
- action="store_false", dest='report_only_first_failure',
- help="""\
-Report all failures in a doctest. This is the default, but can
-be used to counter a default use of -1 or --hide-secondary-failures.
-""")
-
-reporting.add_option(
- '--ndiff', action="store_true", dest="ndiff",
- help="""\
-When there is a doctest failure, show it as a diff using the ndiff.py utility.
-""")
-
-reporting.add_option(
- '--udiff', action="store_true", dest="udiff",
- help="""\
-When there is a doctest failure, show it as a unified diff.
-""")
-
-reporting.add_option(
- '--cdiff', action="store_true", dest="cdiff",
- help="""\
-When there is a doctest failure, show it as a context diff.
-""")
-
-parser.add_option_group(reporting)
-
-######################################################################
-# Analysis
-
-analysis = optparse.OptionGroup(parser, "Analysis", """\
-Analysis options provide tools for analysing test output.
-""")
-
-
-analysis.add_option(
- '--post-mortem', '-D', action="store_true", dest='post_mortem',
- help="Enable post-mortem debugging of test failures"
- )
-
-
-analysis.add_option(
- '--gc', '-g', action="append", dest='gc', type="int",
- help="""\
-Set the garbage collector generation threshold. This can be used
-to stress memory and gc correctness. Some crashes are only
-reproducible when the threshold is set to 1 (aggressive garbage
-collection). Do "--gc 0" to disable garbage collection altogether.
-
-The --gc option can be used up to 3 times to specify up to 3 of the 3
-Python gc_threshold settings.
-
-""")
-
-analysis.add_option(
- '--gc-option', '-G', action="append", dest='gc_option', type="choice",
- choices=['DEBUG_STATS', 'DEBUG_COLLECTABLE', 'DEBUG_UNCOLLECTABLE',
- 'DEBUG_INSTANCES', 'DEBUG_OBJECTS', 'DEBUG_SAVEALL',
- 'DEBUG_LEAK'],
- help="""\
-Set a Python gc-module debug flag. This option can be used more than
-once to set multiple flags.
-""")
-
-analysis.add_option(
- '--repeat', '-N', action="store", type="int", dest='repeat',
- help="""\
-Repeat the tests the given number of times. This option is used to
-make sure that tests leave their environment in the state they found
-it and, with the --report-refcounts option to look for memory leaks.
-""")
-
-analysis.add_option(
- '--report-refcounts', '-r', action="store_true", dest='report_refcounts',
- help="""\
-After each run of the tests, output a report summarizing changes in
-refcounts by object type. This option that requires that Python was
-built with the --with-pydebug option to configure.
-""")
-
-analysis.add_option(
- '--coverage', action="store", type='string', dest='coverage',
- help="""\
-Perform code-coverage analysis, saving trace data to the directory
-with the given name. A code coverage summary is printed to standard
-out.
-""")
-
-analysis.add_option(
- '--profile', action="store", dest='profile', type="choice",
- choices=available_profilers.keys(),
- help="""\
-Run the tests under cProfiler or hotshot and display the top 50 stats, sorted
-by cumulative time and number of calls.
-""")
-
-def do_pychecker(*args):
- if not os.environ.get("PYCHECKER"):
- os.environ["PYCHECKER"] = "-q"
- import pychecker.checker
-
-analysis.add_option(
- '--pychecker', action="callback", callback=do_pychecker,
- help="""\
-Run the tests under pychecker
-""")
-
-parser.add_option_group(analysis)
-
-######################################################################
-# Setup
-
-setup = optparse.OptionGroup(parser, "Setup", """\
-Setup options are normally supplied by the testrunner script, although
-they can be overridden by users.
-""")
-
-setup.add_option(
- '--path', action="append", dest='path',
- help="""\
-Specify a path to be added to Python's search path. This option can
-be used multiple times to specify multiple search paths. The path is
-usually specified by the test-runner script itself, rather than by
-users of the script, although it can be overridden by users. Only
-tests found in the path will be run.
-
-This option also specifies directories to be searched for tests.
-See the search_directory.
-""")
-
-setup.add_option(
- '--test-path', action="append", dest='test_path',
- help="""\
-Specify a path to be searched for tests, but not added to the Python
-search path. This option can be used multiple times to specify
-multiple search paths. The path is usually specified by the
-test-runner script itself, rather than by users of the script,
-although it can be overridden by users. Only tests found in the path
-will be run.
-""")
-
-setup.add_option(
- '--package-path', action="append", dest='package_path', nargs=2,
- help="""\
-Specify a path to be searched for tests, but not added to the Python
-search path. Also specify a package for files found in this path.
-This is used to deal with directories that are stitched into packages
-that are not otherwise searched for tests.
-
-This option takes 2 arguments. The first is a path name. The second is
-the package name.
-
-This option can be used multiple times to specify
-multiple search paths. The path is usually specified by the
-test-runner script itself, rather than by users of the script,
-although it can be overridden by users. Only tests found in the path
-will be run.
-""")
-
-setup.add_option(
- '--tests-pattern', action="store", dest='tests_pattern',
- help="""\
-The test runner looks for modules containing tests. It uses this
-pattern to identify these modules. The modules may be either packages
-or python files.
-
-If a test module is a package, it uses the value given by the
-test-file-pattern to identify python files within the package
-containing tests.
-""")
-
-setup.add_option(
- '--suite-name', action="store", dest='suite_name',
- help="""\
-Specify the name of the object in each test_module that contains the
-module's test suite.
-""")
-
-setup.add_option(
- '--test-file-pattern', action="store", dest='test_file_pattern',
- help="""\
-Specify a pattern for identifying python files within a tests package.
-See the documentation for the --tests-pattern option.
-""")
-
-setup.add_option(
- '--ignore_dir', action="append", dest='ignore_dir',
- help="""\
-Specifies the name of a directory to ignore when looking for tests.
-""")
-
-parser.add_option_group(setup)
-
-######################################################################
-# Other
-
-other = optparse.OptionGroup(parser, "Other", "Other options")
-
-other.add_option(
- '--keepbytecode', '-k', action="store_true", dest='keepbytecode',
- help="""\
-Normally, the test runner scans the test paths and the test
-directories looking for and deleting pyc or pyo files without
-corresponding py files. This is to prevent spurious test failures due
-to finding compiled modules where source modules have been deleted.
-This scan can be time consuming. Using this option disables this
-scan. If you know you haven't removed any modules since last running
-the tests, can make the test run go much faster.
-""")
-
-other.add_option(
- '--usecompiled', action="store_true", dest='usecompiled',
- help="""\
-Normally, a package must contain an __init__.py file, and only .py files
-can contain test code. When this option is specified, compiled Python
-files (.pyc and .pyo) can be used instead: a directory containing
-__init__.pyc or __init__.pyo is also considered to be a package, and if
-file XYZ.py contains tests but is absent while XYZ.pyc or XYZ.pyo exists
-then the compiled files will be used. This is necessary when running
-tests against a tree where the .py files have been removed after
-compilation to .pyc/.pyo. Use of this option implies --keepbytecode.
-""")
-
-other.add_option(
- '--exit-with-status', action="store_true", dest='exitwithstatus',
- help="""\
-Return an error exit status if the tests failed. This can be useful for
-an invoking process that wants to monitor the result of a test run.
-""")
-
-parser.add_option_group(other)
-
-######################################################################
-# Command-line processing
-
-def compile_filter(pattern):
- if pattern.startswith('!'):
- pattern = re.compile(pattern[1:]).search
- return (lambda s: not pattern(s))
- return re.compile(pattern).search
-
-def merge_options(options, defaults):
- odict = options.__dict__
- for name, value in defaults.__dict__.items():
- if (value is not None) and (odict[name] is None):
- odict[name] = value
-
-default_setup_args = [
- '--tests-pattern', '^tests$',
- '--at-level', '1',
- '--ignore', '.svn',
- '--ignore', 'CVS',
- '--ignore', '{arch}',
- '--ignore', '.arch-ids',
- '--ignore', '_darcs',
- '--test-file-pattern', '^test',
- '--suite-name', 'test_suite',
- ]
-
-
-def terminal_has_colors():
- """Determine whether the terminal supports colors.
-
- Some terminals (e.g. the emacs built-in one) don't.
- """
- return tigetnum('colors', -1) >= 8
-
-
-def get_options(args=None, defaults=None):
- # Because we want to inspect stdout and decide to colorize or not, we
- # replace the --auto-color option with the appropriate --color or
- # --no-color option. That way the subprocess doesn't have to decide (which
- # it would do incorrectly anyway because stdout would be a pipe).
- def apply_auto_color(args):
- if args and '--auto-color' in args:
- if sys.stdout.isatty() and terminal_has_colors():
- colorization = '--color'
- else:
- colorization = '--no-color'
-
- args[:] = [arg.replace('--auto-color', colorization)
- for arg in args]
-
- # The comment of apply_auto_color applies here as well
- def apply_auto_progress(args):
- if args and '--auto-progress' in args:
- if sys.stdout.isatty():
- progress = '--progress'
- else:
- progress = '--no-progress'
-
- args[:] = [arg.replace('--auto-progress', progress)
- for arg in args]
-
- apply_auto_color(args)
- apply_auto_color(defaults)
- apply_auto_progress(args)
- apply_auto_progress(defaults)
-
- default_setup, _ = parser.parse_args(default_setup_args)
- assert not _
- if defaults:
- defaults, _ = parser.parse_args(defaults)
- assert not _
- merge_options(defaults, default_setup)
- else:
- defaults = default_setup
-
- if args is None:
- args = sys.argv
-
- original_testrunner_args = args
- args = args[1:]
-
- options, positional = parser.parse_args(args)
- merge_options(options, defaults)
- options.original_testrunner_args = original_testrunner_args
-
- if options.color:
- options.output = ColorfulOutputFormatter(options)
- options.output.slow_test_threshold = options.slow_test_threshold
- else:
- options.output = OutputFormatter(options)
-
- options.fail = False
-
- if positional:
- module_filter = positional.pop(0)
- if module_filter != '.':
- if options.module:
- options.module.append(module_filter)
- else:
- options.module = [module_filter]
-
- if positional:
- test_filter = positional.pop(0)
- if options.test:
- options.test.append(test_filter)
- else:
- options.test = [test_filter]
-
- if positional:
- parser.error("Too many positional arguments")
-
- options.ignore_dir = dict([(d,1) for d in options.ignore_dir])
- options.test_file_pattern = re.compile(options.test_file_pattern).search
- options.tests_pattern = re.compile(options.tests_pattern).search
- options.test = map(compile_filter, options.test or ('.'))
- options.module = map(compile_filter, options.module or ('.'))
-
- options.path = map(os.path.abspath, options.path or ())
- options.test_path = map(os.path.abspath, options.test_path or ())
- options.test_path += options.path
-
- options.test_path = ([(path, '') for path in options.test_path]
- +
- [(os.path.abspath(path), package)
- for (path, package) in options.package_path or ()
- ])
-
- if options.package:
- pkgmap = dict(options.test_path)
- options.package = [normalize_package(p, pkgmap)
- for p in options.package]
-
- options.prefix = [(path + os.path.sep, package)
- for (path, package) in options.test_path]
- if options.all:
- options.at_level = sys.maxint
-
- if options.unit and options.non_unit:
- # The test runner interprets this as "run only those tests that are
- # both unit and non-unit at the same time". The user, however, wants
- # to run both unit and non-unit tests. Disable the filtering so that
- # the user will get what she wants:
- options.unit = options.non_unit = False
-
- if options.unit:
- options.layer = ['unit']
- if options.layer:
- options.layer = map(compile_filter, options.layer)
-
- options.layer = options.layer and dict([(l, 1) for l in options.layer])
-
- if options.usecompiled:
- options.keepbytecode = options.usecompiled
-
- if options.quiet:
- options.verbose = 0
-
- if options.report_refcounts and options.repeat < 2:
- print """\
- You must use the --repeat (-N) option to specify a repeat
- count greater than 1 when using the --report_refcounts (-r)
- option.
- """
- options.fail = True
- return options
-
-
- if options.report_refcounts and not hasattr(sys, "gettotalrefcount"):
- print """\
- The Python you are running was not configured
- with --with-pydebug. This is required to use
- the --report-refcounts option.
- """
- options.fail = True
- return options
-
- return options
-
-def normalize_package(package, package_map={}):
- r"""Normalize package name passed to the --package option.
-
- >>> normalize_package('zope.testing')
- 'zope.testing'
-
- Converts path names into package names for compatibility with the old
- test runner.
-
- >>> normalize_package('zope/testing')
- 'zope.testing'
- >>> normalize_package('zope/testing/')
- 'zope.testing'
- >>> normalize_package('zope\\testing')
- 'zope.testing'
-
- Can use a map of absolute pathnames to package names
-
- >>> a = os.path.abspath
- >>> normalize_package('src/zope/testing/',
- ... {a('src'): ''})
- 'zope.testing'
- >>> normalize_package('src/zope_testing/',
- ... {a('src/zope_testing'): 'zope.testing'})
- 'zope.testing'
- >>> normalize_package('src/zope_something/tests',
- ... {a('src/zope_something'): 'zope.something',
- ... a('src'): ''})
- 'zope.something.tests'
-
- """
- package = package.replace('\\', '/')
- if package.endswith('/'):
- package = package[:-1]
- bits = package.split('/')
- for n in range(len(bits), 0, -1):
- pkg = package_map.get(os.path.abspath('/'.join(bits[:n])))
- if pkg is not None:
- bits = bits[n:]
- if pkg:
- bits = [pkg] + bits
- return '.'.join(bits)
- return package.replace('/', '.')
-
-# Command-line UI
-###############################################################################
-
-###############################################################################
-# Install 2.4 TestSuite __iter__ into earlier versions
-
-if sys.version_info < (2, 4):
- def __iter__(suite):
- return iter(suite._tests)
- unittest.TestSuite.__iter__ = __iter__
- del __iter__
-
-# Install 2.4 TestSuite __iter__ into earlier versions
-###############################################################################
-
-###############################################################################
-# Test the testrunner
-
-def test_suite():
-
- import renormalizing
- checker = renormalizing.RENormalizing([
- # 2.5 changed the way pdb reports exceptions
- (re.compile(r"<class 'exceptions.(\w+)Error'>:"),
- r'exceptions.\1Error:'),
-
- (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
- (re.compile(r"<module>"),(r'?')),
- (re.compile(r"<type 'exceptions.(\w+)Error'>:"),
- r'exceptions.\1Error:'),
- (re.compile("'[A-Za-z]:\\\\"), "'"), # hopefully, we'll make Windows happy
- (re.compile(r'\\\\'), '/'), # more Windows happiness
- (re.compile(r'\\'), '/'), # even more Windows happiness
- (re.compile('/r'), '\\\\r'), # undo damage from previous
- (re.compile(r'\r'), '\\\\r\n'),
- (re.compile(r'\d+[.]\d\d\d seconds'), 'N.NNN seconds'),
- (re.compile(r'\d+[.]\d\d\d s'), 'N.NNN s'),
- (re.compile(r'\d+[.]\d\d\d{'), 'N.NNN{'),
- (re.compile('( |")[^\n]+testrunner-ex'), r'\1testrunner-ex'),
- (re.compile('( |")[^\n]+testrunner.py'), r'\1testrunner.py'),
- (re.compile(r'> [^\n]*(doc|unit)test[.]py\(\d+\)'),
- r'\1test.py(NNN)'),
- (re.compile(r'[.]py\(\d+\)'), r'.py(NNN)'),
- (re.compile(r'[.]py:\d+'), r'.py:NNN'),
- (re.compile(r' line \d+,', re.IGNORECASE), r' Line NNN,'),
- (re.compile(r' line {([a-z]+)}\d+{', re.IGNORECASE), r' Line {\1}NNN{'),
-
- # omit traceback entries for unittest.py or doctest.py from
- # output:
- (re.compile(r'^ +File "[^\n]*(doc|unit)test.py", [^\n]+\n[^\n]+\n',
- re.MULTILINE),
- r''),
- (re.compile(r'^{\w+} +File "{\w+}[^\n]*(doc|unit)test.py{\w+}", [^\n]+\n[^\n]+\n',
- re.MULTILINE),
- r''),
- (re.compile('^> [^\n]+->None$', re.M), '> ...->None'),
- (re.compile('import pdb; pdb'), 'Pdb()'), # Py 2.3
- ])
-
- def setUp(test):
- test.globs['saved-sys-info'] = (
- sys.path[:],
- sys.argv[:],
- sys.modules.copy(),
- gc.get_threshold(),
- )
- test.globs['this_directory'] = os.path.split(__file__)[0]
- test.globs['testrunner_script'] = __file__
-
- def tearDown(test):
- sys.path[:], sys.argv[:] = test.globs['saved-sys-info'][:2]
- gc.set_threshold(*test.globs['saved-sys-info'][3])
- sys.modules.clear()
- sys.modules.update(test.globs['saved-sys-info'][2])
-
- suites = [
- doctest.DocFileSuite(
- 'testrunner-arguments.txt',
- 'testrunner-coverage.txt',
- 'testrunner-debugging-layer-setup.test',
- 'testrunner-debugging.txt',
- 'testrunner-edge-cases.txt',
- 'testrunner-errors.txt',
- 'testrunner-layers-ntd.txt',
- 'testrunner-layers.txt',
- 'testrunner-layers-api.txt',
- 'testrunner-progress.txt',
- 'testrunner-colors.txt',
- 'testrunner-simple.txt',
- 'testrunner-test-selection.txt',
- 'testrunner-verbose.txt',
- 'testrunner-wo-source.txt',
- 'testrunner-repeat.txt',
- 'testrunner-gc.txt',
- 'testrunner-knit.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker=checker),
- doctest.DocTestSuite()
- ]
-
- if sys.platform == 'win32':
- suites.append(
- doctest.DocFileSuite(
- 'testrunner-coverage-win32.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker=checker))
-
- # Python <= 2.4.1 had a bug that prevented hotshot from running in
- # non-optimize mode
- if sys.version_info[:3] > (2,4,1) or not __debug__:
- # some Linux distributions don't include the profiling module (which
- # hotshot.stats depends on)
- try:
- import hotshot.stats
- except ImportError:
- pass
- else:
- suites.append(
- doctest.DocFileSuite(
- 'testrunner-profiling.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker = renormalizing.RENormalizing([
- (re.compile(r'tests_profile[.]\S*[.]prof'),
- 'tests_profile.*.prof'),
- ]),
- )
- )
- try:
- import cProfile
- import pstats
- except ImportError:
- pass
- else:
- suites.append(
- doctest.DocFileSuite(
- 'testrunner-profiling-cprofiler.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker = renormalizing.RENormalizing([
- (re.compile(r'tests_profile[.]\S*[.]prof'),
- 'tests_profile.*.prof'),
- ]),
- )
- )
-
-
- if hasattr(sys, 'gettotalrefcount'):
- suites.append(
- doctest.DocFileSuite(
- 'testrunner-leaks.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker = renormalizing.RENormalizing([
- (re.compile(r'\d+[.]\d\d\d seconds'), 'N.NNN seconds'),
- (re.compile(r'sys refcount=\d+ +change=\d+'),
- 'sys refcount=NNNNNN change=NN'),
- (re.compile(r'sum detail refcount=\d+ +'),
- 'sum detail refcount=NNNNNN '),
- (re.compile(r'total +\d+ +\d+'),
- 'total NNNN NNNN'),
- (re.compile(r"^ +(int|type) +-?\d+ +-?\d+ *\n", re.M),
- ''),
- ]),
-
- )
- )
- else:
- suites.append(
- doctest.DocFileSuite(
- 'testrunner-leaks-err.txt',
- setUp=setUp, tearDown=tearDown,
- optionflags=doctest.ELLIPSIS+doctest.NORMALIZE_WHITESPACE,
- checker=checker,
- )
- )
-
-
- return unittest.TestSuite(suites)
-
-def main():
- default = [
- '--path', os.path.split(sys.argv[0])[0],
- '--tests-pattern', '^testrunner$',
- ]
- run(default)
-
-if __name__ == '__main__':
-
- # if --resume_layer is in the arguments, we are being run from the
- # test runner's own tests. We need to adjust the path in hopes of
- # not getting a different version installed in the system python.
- if len(sys.argv) > 1 and sys.argv[1] == '--resume-layer':
- sys.path.insert(0,
- os.path.split(
- os.path.split(
- os.path.split(
- os.path.abspath(sys.argv[0])
- )[0]
- )[0]
- )[0]
- )
-
- # Hm, when run as a script, we need to import the testrunner under
- # its own name, so that there's the imported flavor has the right
- # real_pdb_set_trace.
- import zope.testing.testrunner
- from zope.testing import doctest
-
- main()
-
-# Test the testrunner
-###############################################################################
-
-# Delay import to give main an opportunity to fix up the path if
-# necessary
-from zope.testing import doctest
Deleted: zope.testing/trunk/src/zope/testing/testrunner.txt
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner.txt 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/testrunner.txt 2008-05-05 18:50:48 UTC (rev 86460)
@@ -1,69 +0,0 @@
-Test Runner
-===========
-
-The testrunner module is used to run automated tests defined using the
-unittest framework. Its primary feature is that it *finds* tests by
-searching directory trees. It doesn't require the manual
-concatenation of specific test suites. It is highly customizable and
-should be usable with any project. In addition to finding and running
-tests, it provides the following additional features:
-
-- Test filtering using specifications of:
-
- o test packages within a larger tree
-
- o regular expression patterns for test modules
-
- o regular expression patterns for individual tests
-
-- Organization of tests into levels and layers
-
- Sometimes, tests take so long to run that you don't want to run them
- on every run of the test runner. Tests can be defined at different
- levels. The test runner can be configured to only run tests at a
- specific level or below by default. Command-line options can be
- used to specify a minimum level to use for a specific run, or to run
- all tests. Individual tests or test suites can specify their level
- via a 'level' attribute. where levels are integers increasing from 1.
-
- Most tests are unit tests. They don't depend on other facilities, or
- set up whatever dependencies they have. For larger applications,
- it's useful to specify common facilities that a large number of
- tests share. Making each test set up and and tear down these
- facilities is both ineffecient and inconvenient. For this reason,
- we've introduced the concept of layers, based on the idea of layered
- application architectures. Software build for a layer should be
- able to depend on the facilities of lower layers already being set
- up. For example, Zope defines a component architecture. Much Zope
- software depends on that architecture. We should be able to treat
- the component architecture as a layer that we set up once and reuse.
- Similarly, Zope application software should be able to depend on the
- Zope application server without having to set it up in each test.
-
- The test runner introduces test layers, which are objects that can
- set up environments for tests within the layers to use. A layer is
- set up before running the tests in it. Individual tests or test
- suites can define a layer by defining a `layer` attribute, which is
- a test layer.
-
-- Reporting
-
- - progress meter
-
- - summaries of tests run
-
-- Analysis of test execution
-
- - post-mortem debugging of test failures
-
- - memory leaks
-
- - code coverage
-
- - source analysis using pychecker
-
- - memory errors
-
- - execution times
-
- - profiling
Modified: zope.testing/trunk/src/zope/testing/tests.py
===================================================================
--- zope.testing/trunk/src/zope/testing/tests.py 2008-05-05 18:40:37 UTC (rev 86459)
+++ zope.testing/trunk/src/zope/testing/tests.py 2008-05-05 18:50:48 UTC (rev 86460)
@@ -15,20 +15,18 @@
$Id$
"""
+
import os
import sys
import unittest
from zope.testing import doctest, testrunner
+
def test_suite():
return unittest.TestSuite((
doctest.DocTestSuite('zope.testing.renormalizing'),
doctest.DocFileSuite('formparser.txt'),
doctest.DocTestSuite('zope.testing.loggingsupport'),
doctest.DocTestSuite('zope.testing.server'),
- testrunner.test_suite(),
doctest.DocFileSuite('setupstack.txt'),
))
-
-if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')
More information about the Zope3-Checkins
mailing list