Kaydet (Commit) 1976d9bf authored tarafından R David Murray's avatar R David Murray

#15916: if there are no docstrings, make empty suite, not an error.

This makes doctest work like unittest: if the test case is empty, that
just means there are zero tests run, it's not an error.  The existing
behavior was broken, since it only gave an error if there were *no*
docstrings, and zero tests run if there were docstrings but none of them
contained tests.  So this makes it self-consistent as well.

Patch by Glenn Jones.
üst 865d23d1
...@@ -1058,15 +1058,9 @@ from text files and modules with doctests: ...@@ -1058,15 +1058,9 @@ from text files and modules with doctests:
This function uses the same search technique as :func:`testmod`. This function uses the same search technique as :func:`testmod`.
.. note:: .. versionchanged:: 3.5
Unlike :func:`testmod` and :class:`DocTestFinder`, this function raises :func:`DocTestSuite` returns an empty :class:`unittest.TestSuite` if *module*
a :exc:`ValueError` if *module* contains no docstrings. You can prevent contains no docstrings instead of raising :exc:`ValueError`.
this error by passing a :class:`DocTestFinder` instance as the
*test_finder* argument with its *exclude_empty* keyword argument set
to ``False``::
>>> finder = doctest.DocTestFinder(exclude_empty=False)
>>> suite = doctest.DocTestSuite(test_finder=finder)
Under the covers, :func:`DocTestSuite` creates a :class:`unittest.TestSuite` out Under the covers, :func:`DocTestSuite` creates a :class:`unittest.TestSuite` out
......
...@@ -154,6 +154,10 @@ Improved Modules ...@@ -154,6 +154,10 @@ Improved Modules
applications where startup time is paramount (contributed by Brett Cannon in applications where startup time is paramount (contributed by Brett Cannon in
:issue:`17621`). :issue:`17621`).
* :func:`doctest.DocTestSuite` returns an empty :class:`unittest.TestSuite` if
*module* contains no docstrings instead of raising :exc:`ValueError`
(contributed by Glenn Jones in :issue:`15916`).
Optimizations Optimizations
============= =============
......
...@@ -2376,15 +2376,6 @@ def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None, ...@@ -2376,15 +2376,6 @@ def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
suite = _DocTestSuite() suite = _DocTestSuite()
suite.addTest(SkipDocTestCase(module)) suite.addTest(SkipDocTestCase(module))
return suite return suite
elif not tests:
# Why do we want to do this? Because it reveals a bug that might
# otherwise be hidden.
# It is probably a bug that this exception is not also raised if the
# number of doctest examples in tests is zero (i.e. if no doctest
# examples were found). However, we should probably not be raising
# an exception at all here, though it is too late to make this change
# for a maintenance release. See also issue #14649.
raise ValueError(module, "has no docstrings")
tests.sort() tests.sort()
suite = _DocTestSuite() suite = _DocTestSuite()
......
...@@ -2096,22 +2096,9 @@ def test_DocTestSuite(): ...@@ -2096,22 +2096,9 @@ 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>
However, if DocTestSuite finds no docstrings, it raises an error: The module need not contain any docstrings either:
>>> try: >>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings')
... doctest.DocTestSuite('test.sample_doctest_no_docstrings')
... except ValueError as e:
... error = e
>>> print(error.args[1])
has no docstrings
You can prevent this error by passing a DocTestFinder instance with
the `exclude_empty` keyword argument set to False:
>>> finder = doctest.DocTestFinder(exclude_empty=False)
>>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings',
... test_finder=finder)
>>> 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>
...@@ -2121,6 +2108,22 @@ def test_DocTestSuite(): ...@@ -2121,6 +2108,22 @@ def test_DocTestSuite():
>>> suite.run(unittest.TestResult()) >>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=9 errors=0 failures=4> <unittest.result.TestResult run=9 errors=0 failures=4>
We can also provide a DocTestFinder:
>>> finder = doctest.DocTestFinder()
>>> suite = doctest.DocTestSuite('test.sample_doctest',
... test_finder=finder)
>>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=9 errors=0 failures=4>
The DocTestFinder need not return any tests:
>>> finder = doctest.DocTestFinder()
>>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings',
... test_finder=finder)
>>> suite.run(unittest.TestResult())
<unittest.result.TestResult run=0 errors=0 failures=0>
We can supply global variables. If we pass globs, they will be We can supply global variables. If we pass globs, they will be
used instead of the module globals. Here we'll pass an empty used instead of the module globals. Here we'll pass an empty
globals, triggering an extra error: globals, triggering an extra error:
......
...@@ -630,6 +630,7 @@ Thomas Jollans ...@@ -630,6 +630,7 @@ Thomas Jollans
Nicolas Joly Nicolas Joly
Brian K. Jones Brian K. Jones
Evan Jones Evan Jones
Glenn Jones
Jeremy Jones Jeremy Jones
Richard Jones Richard Jones
Irmen de Jong Irmen de Jong
......
...@@ -203,6 +203,9 @@ Library ...@@ -203,6 +203,9 @@ Library
- Issue #20334: inspect.Signature and inspect.Parameter are now hashable. - Issue #20334: inspect.Signature and inspect.Parameter are now hashable.
- Issue #15916: doctest.DocTestSuite returns an empty unittest.TestSuite instead
of raising ValueError if it finds no tests
IDLE IDLE
---- ----
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment