and runs the interactive examples in each file. If an example in any file
fails, then the synthesized unit test fails, and a :exc:`failureException`
exception is raised showing the name of the file containing the test and a
- (sometimes approximate) line number.
+ (sometimes approximate) line number. If all the examples in a file are
+ skipped, then the synthesized unit test is also marked as skipped.
Pass one or more paths (as strings) to text files to be examined.
and runs each doctest in the module. If any of the doctests fail, then the
synthesized unit test fails, and a :exc:`failureException` exception is raised
showing the name of the file containing the test and a (sometimes approximate)
- line number.
+ line number. If all the examples in a docstring are skipped, then the
+ synthesized unit test is also marked as skipped.
Optional argument *module* provides the module to be tested. It can be a module
object or a (possibly dotted) module name. If not specified, the module calling
try:
runner.DIVIDER = "-"*70
- failures, tries = runner.run(
- test, out=new.write, clear_globs=False)
+ results = runner.run(test, out=new.write, clear_globs=False)
+ if results.skipped == results.attempted:
+ raise unittest.SkipTest("all examples were skipped")
finally:
sys.stdout = old
- if failures:
+ if results.failed:
raise self.failureException(self.format_failure(new.getvalue()))
def format_failure(self, err):
--- /dev/null
+"""This is a sample module used for testing doctest.
+
+This module includes various scenarios involving skips.
+"""
+
+def no_skip_pass():
+ """
+ >>> 2 + 2
+ 4
+ """
+
+def no_skip_fail():
+ """
+ >>> 2 + 2
+ 5
+ """
+
+def single_skip():
+ """
+ >>> 2 + 2 # doctest: +SKIP
+ 4
+ """
+
+def double_skip():
+ """
+ >>> 2 + 2 # doctest: +SKIP
+ 4
+ >>> 3 + 3 # doctest: +SKIP
+ 6
+ """
+
+def partial_skip_pass():
+ """
+ >>> 2 + 2 # doctest: +SKIP
+ 4
+ >>> 3 + 3
+ 6
+ """
+
+def partial_skip_fail():
+ """
+ >>> 2 + 2 # doctest: +SKIP
+ 4
+ >>> 2 + 2
+ 5
+ """
+
+def no_examples():
+ """A docstring with no examples should not be counted as run or skipped."""
>>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=0 errors=0 failures=0>
+ If all examples in a docstring are skipped, unittest will report it as a
+ skipped test:
+
+ >>> suite = doctest.DocTestSuite('test.test_doctest.sample_doctest_skip')
+ >>> result = suite.run(unittest.TestResult())
+ >>> result
+ <unittest.result.TestResult run=6 errors=0 failures=2>
+ >>> len(result.skipped)
+ 2
+
We can use the current module:
>>> suite = test.test_doctest.sample_doctest.test_suite()
Traceback (most recent call last):
ValueError: Package may only be specified for module-relative paths.
+ If all examples in a file are skipped, unittest will report it as a
+ skipped test:
+
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest4.txt',
+ ... 'test_doctest_skip.txt')
+ >>> result = suite.run(unittest.TestResult())
+ >>> result
+ <unittest.result.TestResult run=3 errors=0 failures=1>
+ >>> len(result.skipped)
+ 1
+
You can specify initial global variables:
>>> suite = doctest.DocFileSuite('test_doctest.txt',
--- /dev/null
+This is a sample doctest in a text file, in which all examples are skipped.
+
+ >>> 2 + 2 # doctest: +SKIP
+ 5
# Retrieve some helpers from other test cases
from test.test_doctest import (test_doctest,
sample_doctest, sample_doctest_no_doctests,
- sample_doctest_no_docstrings)
+ sample_doctest_no_docstrings, sample_doctest_skip)
def _run_object_doctest(obj, module):
# The sample doctest files rewritten to include in the zipped version.
sample_sources = {}
for mod in [sample_doctest, sample_doctest_no_doctests,
- sample_doctest_no_docstrings]:
+ sample_doctest_no_docstrings, sample_doctest_skip]:
src = inspect.getsource(mod)
src = src.replace("test.test_doctest.test_doctest", "test_zipped_doctest")
# Rewrite the module name so that, for example,
--- /dev/null
+A ``DocTestCase`` now reports as skipped if all examples in the doctest are
+skipped.