changeset: 90309:57fb5441a4aa parent: 90305:14e874736d3a user: R David Murray date: Mon Apr 14 20:28:36 2014 -0400 files: Doc/library/doctest.rst Doc/whatsnew/3.5.rst Lib/doctest.py Lib/test/test_doctest.py Misc/ACKS Misc/NEWS description: #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. diff -r 14e874736d3a -r 57fb5441a4aa Doc/library/doctest.rst --- a/Doc/library/doctest.rst Mon Apr 14 18:54:21 2014 -0400 +++ b/Doc/library/doctest.rst Mon Apr 14 20:28:36 2014 -0400 @@ -1058,15 +1058,9 @@ This function uses the same search technique as :func:`testmod`. - .. note:: - Unlike :func:`testmod` and :class:`DocTestFinder`, this function raises - a :exc:`ValueError` if *module* contains no docstrings. You can prevent - 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) + .. versionchanged:: 3.5 + :func:`DocTestSuite` returns an empty :class:`unittest.TestSuite` if *module* + contains no docstrings instead of raising :exc:`ValueError`. Under the covers, :func:`DocTestSuite` creates a :class:`unittest.TestSuite` out diff -r 14e874736d3a -r 57fb5441a4aa Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst Mon Apr 14 18:54:21 2014 -0400 +++ b/Doc/whatsnew/3.5.rst Mon Apr 14 20:28:36 2014 -0400 @@ -154,6 +154,10 @@ applications where startup time is paramount (contributed by Brett Cannon in :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 ============= diff -r 14e874736d3a -r 57fb5441a4aa Lib/doctest.py --- a/Lib/doctest.py Mon Apr 14 18:54:21 2014 -0400 +++ b/Lib/doctest.py Mon Apr 14 20:28:36 2014 -0400 @@ -2376,15 +2376,6 @@ suite = _DocTestSuite() suite.addTest(SkipDocTestCase(module)) 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() suite = _DocTestSuite() diff -r 14e874736d3a -r 57fb5441a4aa Lib/test/test_doctest.py --- a/Lib/test/test_doctest.py Mon Apr 14 18:54:21 2014 -0400 +++ b/Lib/test/test_doctest.py Mon Apr 14 20:28:36 2014 -0400 @@ -2096,22 +2096,9 @@ >>> suite.run(unittest.TestResult()) - However, if DocTestSuite finds no docstrings, it raises an error: - - >>> try: - ... 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) + The module need not contain any docstrings either: + + >>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings') >>> suite.run(unittest.TestResult()) @@ -2121,6 +2108,22 @@ >>> suite.run(unittest.TestResult()) + We can also provide a DocTestFinder: + + >>> finder = doctest.DocTestFinder() + >>> suite = doctest.DocTestSuite('test.sample_doctest', + ... test_finder=finder) + >>> suite.run(unittest.TestResult()) + + + 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()) + + We can supply global variables. If we pass globs, they will be used instead of the module globals. Here we'll pass an empty globals, triggering an extra error: diff -r 14e874736d3a -r 57fb5441a4aa Misc/ACKS --- a/Misc/ACKS Mon Apr 14 18:54:21 2014 -0400 +++ b/Misc/ACKS Mon Apr 14 20:28:36 2014 -0400 @@ -630,6 +630,7 @@ Nicolas Joly Brian K. Jones Evan Jones +Glenn Jones Jeremy Jones Richard Jones Irmen de Jong diff -r 14e874736d3a -r 57fb5441a4aa Misc/NEWS --- a/Misc/NEWS Mon Apr 14 18:54:21 2014 -0400 +++ b/Misc/NEWS Mon Apr 14 20:28:36 2014 -0400 @@ -203,6 +203,9 @@ - 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 ----