How to make pytest run doctests as well as normal tests directory?
Question:
We currently have pytest
with the coverage plugin running over our tests in a tests
directory.
What’s the simplest way to also run doctests extracted from our main code? --doctest-modules
doesn’t work (probably since it just runs doctests from tests
). Note that we want to include doctests in the same process (and not simply run a separate invocation of py.test
) because we want to account for doctest in code coverage.
Answers:
Could you try with the repo version of pytest and paste a session log? I’d think --doctest-modules
should pick up any .py files.
Now it is implemented :-).
To use, either run py.test --doctest-modules
command, or set your configuration with pytest.ini
:
$ cat pytest.ini
# content of pytest.ini
[pytest]
addopts = --doctest-modules
Man page: PyTest: doctest integration for modules and test files.
worked with doctest as well as with plain tests in one module. for a non-doctest test to be picked up, standard py.test discovery mechanism applies: a module name with test prefix, test function with test prefix.
Looks old question but put my answer here just in case.
- pytest only run tests in /*test*.py AFAIK and you need to customze with this behavior by the configurations, testpaths and python_files to run doctest in your python code files. seealso: https://docs.pytest.org/en/latest/example/pythoncollection.html#changing-naming-conventions and so on.
- pytest does not run doctest by default and you have to give the option –doctest-modules when running pytest. seealso: https://docs.pytest.org/en/stable/doctest.html
This is how I integrate doctest
in a pytest
test file:
import doctest
from mylib import mymodule
def test_something():
"""some regular pytest"""
foo = mymodule.MyClass()
assert foo.does_something() is True
def test_docstring():
doctest_results = doctest.testmod(m=mymodule)
assert doctest_results.failed == 0
pytest
will fail if doctest
fails and the terminal will show you the doctest
report.
We currently have pytest
with the coverage plugin running over our tests in a tests
directory.
What’s the simplest way to also run doctests extracted from our main code? --doctest-modules
doesn’t work (probably since it just runs doctests from tests
). Note that we want to include doctests in the same process (and not simply run a separate invocation of py.test
) because we want to account for doctest in code coverage.
Could you try with the repo version of pytest and paste a session log? I’d think --doctest-modules
should pick up any .py files.
Now it is implemented :-).
To use, either run py.test --doctest-modules
command, or set your configuration with pytest.ini
:
$ cat pytest.ini
# content of pytest.ini
[pytest]
addopts = --doctest-modules
Man page: PyTest: doctest integration for modules and test files.
worked with doctest as well as with plain tests in one module. for a non-doctest test to be picked up, standard py.test discovery mechanism applies: a module name with test prefix, test function with test prefix.
Looks old question but put my answer here just in case.
- pytest only run tests in /*test*.py AFAIK and you need to customze with this behavior by the configurations, testpaths and python_files to run doctest in your python code files. seealso: https://docs.pytest.org/en/latest/example/pythoncollection.html#changing-naming-conventions and so on.
- pytest does not run doctest by default and you have to give the option –doctest-modules when running pytest. seealso: https://docs.pytest.org/en/stable/doctest.html
This is how I integrate doctest
in a pytest
test file:
import doctest
from mylib import mymodule
def test_something():
"""some regular pytest"""
foo = mymodule.MyClass()
assert foo.does_something() is True
def test_docstring():
doctest_results = doctest.testmod(m=mymodule)
assert doctest_results.failed == 0
pytest
will fail if doctest
fails and the terminal will show you the doctest
report.