gh-117294: Report DocTestCase as skipped if all examples in the doctest are skipped (GH-117297)

This commit is contained in:
Malcolm Smith 2024-03-28 19:59:12 +00:00 committed by GitHub
parent efcc96844e
commit 29829b58a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 87 additions and 7 deletions

View file

@ -1021,7 +1021,8 @@ from text files and modules with doctests:
and runs the interactive examples in each file. If an example in any file 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` 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 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. Pass one or more paths (as strings) to text files to be examined.
@ -1087,7 +1088,8 @@ from text files and modules with doctests:
and runs each doctest in the module. If any of the doctests fail, then the 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 synthesized unit test fails, and a :exc:`failureException` exception is raised
showing the name of the file containing the test and a (sometimes approximate) 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 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 object or a (possibly dotted) module name. If not specified, the module calling

View file

@ -2281,12 +2281,13 @@ class DocTestCase(unittest.TestCase):
try: try:
runner.DIVIDER = "-"*70 runner.DIVIDER = "-"*70
failures, tries = runner.run( results = runner.run(test, out=new.write, clear_globs=False)
test, out=new.write, clear_globs=False) if results.skipped == results.attempted:
raise unittest.SkipTest("all examples were skipped")
finally: finally:
sys.stdout = old sys.stdout = old
if failures: if results.failed:
raise self.failureException(self.format_failure(new.getvalue())) raise self.failureException(self.format_failure(new.getvalue()))
def format_failure(self, err): def format_failure(self, err):

View file

@ -0,0 +1,49 @@
"""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."""

View file

@ -2247,6 +2247,16 @@ def test_DocTestSuite():
>>> suite.run(unittest.TestResult()) >>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=0 errors=0 failures=0> <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: We can use the current module:
>>> suite = test.test_doctest.sample_doctest.test_suite() >>> suite = test.test_doctest.sample_doctest.test_suite()
@ -2418,6 +2428,18 @@ def test_DocFileSuite():
Traceback (most recent call last): Traceback (most recent call last):
ValueError: Package may only be specified for module-relative paths. 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: You can specify initial global variables:
>>> suite = doctest.DocFileSuite('test_doctest.txt', >>> suite = doctest.DocFileSuite('test_doctest.txt',

View file

@ -0,0 +1,4 @@
This is a sample doctest in a text file, in which all examples are skipped.
>>> 2 + 2 # doctest: +SKIP
5

View file

@ -31,7 +31,7 @@ verbose = test.support.verbose
# Retrieve some helpers from other test cases # Retrieve some helpers from other test cases
from test.test_doctest import (test_doctest, from test.test_doctest import (test_doctest,
sample_doctest, sample_doctest_no_doctests, sample_doctest, sample_doctest_no_doctests,
sample_doctest_no_docstrings) sample_doctest_no_docstrings, sample_doctest_skip)
def _run_object_doctest(obj, module): def _run_object_doctest(obj, module):
@ -110,7 +110,7 @@ class ZipSupportTests(unittest.TestCase):
# The sample doctest files rewritten to include in the zipped version. # The sample doctest files rewritten to include in the zipped version.
sample_sources = {} sample_sources = {}
for mod in [sample_doctest, sample_doctest_no_doctests, 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 = inspect.getsource(mod)
src = src.replace("test.test_doctest.test_doctest", "test_zipped_doctest") src = src.replace("test.test_doctest.test_doctest", "test_zipped_doctest")
# Rewrite the module name so that, for example, # Rewrite the module name so that, for example,

View file

@ -0,0 +1,2 @@
A ``DocTestCase`` now reports as skipped if all examples in the doctest are
skipped.