enable doctest plugin by default, add a --doctest-glob option and some documentation, regen plugin docs.

--HG--
branch : trunk
This commit is contained in:
holger krekel 2010-01-02 23:30:46 +01:00
parent 56a936993c
commit eebeb1b257
8 changed files with 66 additions and 28 deletions

View File

@ -44,6 +44,9 @@ Changes between 1.X and 1.1.1
on by default (requires the 'figleaf' package though). Change on by default (requires the 'figleaf' package though). Change
long command line options to be a bit shorter (see py.test -h). long command line options to be a bit shorter (see py.test -h).
- change: pytest doctest plugin is now enabled by default and has a
new option --doctest-glob to set a pattern for file matches.
- robustify capturing to survive if custom pytest_runtest_setup - robustify capturing to survive if custom pytest_runtest_setup
code failed and prevented the capturing setup code from running. code failed and prevented the capturing setup code from running.

View File

@ -10,20 +10,31 @@ collect and execute doctests from modules and test files.
Usage Usage
------------- -------------
By default all files matching the ``test_*.txt`` pattern will By default all files matching the ``test*.txt`` pattern will
be run with the ``doctest`` module. If you issue:: be run through the python standard ``doctest`` module. Issue::
py.test --doctest-glob='*.rst'
to change the pattern. Additionally you can trigger running of
tests in all python modules (including regular python test modules)::
py.test --doctest-modules py.test --doctest-modules
all python files in your projects will be doctest-run You can also make these changes permanent in your project by
as well. putting them into a conftest.py file like this::
# content of conftest.py
option_doctestmodules = True
option_doctestglob = "*.rst"
command line options command line options
-------------------- --------------------
``--doctest-modules`` ``--doctest-modules``
search all python files for doctests run doctests in all .py modules
``--doctest-glob=pat``
doctests file matching pattern, default: test*.txt
Start improving this plugin in 30 seconds Start improving this plugin in 30 seconds
========================================= =========================================

View File

@ -13,12 +13,12 @@ command line options
-------------------- --------------------
``-F`` ``--figleaf``
trace python coverage with figleaf and write HTML for files below the current working dir trace python coverage with figleaf and write HTML for files below the current working dir
``--figleaf-data=FIGLEAFDATA`` ``--fig-data=dir``
path to coverage tracing file. set tracing file, default: ".figleaf".
``--figleaf-html=FIGLEAFHTML`` ``--fig-html=dir``
path to the coverage html dir. set html reporting dir, default "html").
Start improving this plugin in 30 seconds Start improving this plugin in 30 seconds
========================================= =========================================

View File

@ -32,6 +32,7 @@ hook specification sourcecode
def pytest_collect_directory(path, parent): def pytest_collect_directory(path, parent):
""" return Collection node or None for the given path. """ """ return Collection node or None for the given path. """
pytest_collect_directory.firstresult = True
def pytest_collect_file(path, parent): def pytest_collect_file(path, parent):
""" return Collection node or None for the given path. """ """ return Collection node or None for the given path. """

View File

@ -9,7 +9,7 @@ from py.impl.test.outcome import Skipped
default_plugins = ( default_plugins = (
"default runner capture terminal mark skipping tmpdir monkeypatch " "default runner capture terminal mark skipping tmpdir monkeypatch "
"recwarn pdb pastebin unittest helpconfig nose assertion genscript " "recwarn pdb pastebin unittest helpconfig nose assertion genscript "
"logxml figleaf").split() "logxml figleaf doctest").split()
def check_old_use(mod, modname): def check_old_use(mod, modname):
clsname = modname[len('pytest_'):].capitalize() + "Plugin" clsname = modname[len('pytest_'):].capitalize() + "Plugin"

View File

@ -4,13 +4,22 @@ collect and execute doctests from modules and test files.
Usage Usage
------------- -------------
By default all files matching the ``test_*.txt`` pattern will By default all files matching the ``test*.txt`` pattern will
be run with the ``doctest`` module. If you issue:: be run through the python standard ``doctest`` module. Issue::
py.test --doctest-glob='*.rst'
to change the pattern. Additionally you can trigger running of
tests in all python modules (including regular python test modules)::
py.test --doctest-modules py.test --doctest-modules
all python files in your projects will be doctest-run You can also make these changes permanent in your project by
as well. putting them into a conftest.py file like this::
# content of conftest.py
option_doctestmodules = True
option_doctestglob = "*.rst"
""" """
import py import py
@ -20,15 +29,20 @@ import doctest
def pytest_addoption(parser): def pytest_addoption(parser):
group = parser.getgroup("general") group = parser.getgroup("general")
group.addoption("--doctest-modules", group.addoption("--doctest-modules",
action="store_true", default=False, action="store_true", default=False,
help="search all python files for doctests", help="run doctests in all .py modules",
dest="doctestmodules") dest="doctestmodules")
group.addoption("--doctest-glob",
action="store", default="test*.txt", metavar="pat",
help="doctests file matching pattern, default: test*.txt",
dest="doctestglob")
def pytest_collect_file(path, parent): def pytest_collect_file(path, parent):
config = parent.config
if path.ext == ".py": if path.ext == ".py":
if parent.config.getvalue("doctestmodules"): if config.getvalue("doctestmodules"):
return DoctestModule(path, parent) return DoctestModule(path, parent)
if path.check(fnmatch="test_*.txt"): elif path.check(fnmatch=config.getvalue("doctestglob")):
return DoctestTextfile(path, parent) return DoctestTextfile(path, parent)
class ReprFailDoctest(TerminalRepr): class ReprFailDoctest(TerminalRepr):

View File

@ -17,7 +17,7 @@ def pytest_addoption(parser):
help='set tracing file, default: ".figleaf".') help='set tracing file, default: ".figleaf".')
group.addoption('--fig-html', action='store', default='html', group.addoption('--fig-html', action='store', default='html',
dest='figleafhtml', metavar="dir", dest='figleafhtml', metavar="dir",
help='set html reporting dir, default "html").') help='set html reporting dir, default "html".')
def pytest_configure(config): def pytest_configure(config):
if config.getvalue("figleaf"): if config.getvalue("figleaf"):

View File

@ -14,14 +14,14 @@ class TestDoctests:
""") """)
for x in (testdir.tmpdir, checkfile): for x in (testdir.tmpdir, checkfile):
#print "checking that %s returns custom items" % (x,) #print "checking that %s returns custom items" % (x,)
items, reprec = testdir.inline_genitems(x, '-p', 'doctest') items, reprec = testdir.inline_genitems(x)
assert len(items) == 1 assert len(items) == 1
assert isinstance(items[0], DoctestTextfile) assert isinstance(items[0], DoctestTextfile)
def test_collect_module(self, testdir): def test_collect_module(self, testdir):
path = testdir.makepyfile(whatever="#") path = testdir.makepyfile(whatever="#")
for p in (path, testdir.tmpdir): for p in (path, testdir.tmpdir):
items, reprec = testdir.inline_genitems(p, '-p', 'doctest', items, reprec = testdir.inline_genitems(p,
'--doctest-modules') '--doctest-modules')
assert len(items) == 1 assert len(items) == 1
assert isinstance(items[0], DoctestModule) assert isinstance(items[0], DoctestModule)
@ -32,7 +32,16 @@ class TestDoctests:
>>> x == 1 >>> x == 1
False False
""") """)
reprec = testdir.inline_run(p, '-p', 'doctest') reprec = testdir.inline_run(p, )
reprec.assertoutcome(failed=1)
def test_new_pattern(self, testdir):
p = testdir.maketxtfile(xdoc ="""
>>> x = 1
>>> x == 1
False
""")
reprec = testdir.inline_run(p, "--doctest-glob=x*.txt")
reprec.assertoutcome(failed=1) reprec.assertoutcome(failed=1)
def test_doctest_unexpected_exception(self, testdir): def test_doctest_unexpected_exception(self, testdir):
@ -44,7 +53,7 @@ class TestDoctests:
>>> x >>> x
2 2
""") """)
reprec = testdir.inline_run(p, '-p', 'doctest') reprec = testdir.inline_run(p)
call = reprec.getcall("pytest_runtest_logreport") call = reprec.getcall("pytest_runtest_logreport")
assert call.report.failed assert call.report.failed
assert call.report.longrepr assert call.report.longrepr
@ -63,7 +72,7 @@ class TestDoctests:
''' '''
""") """)
reprec = testdir.inline_run(p, '-p', 'doctest', "--doctest-modules") reprec = testdir.inline_run(p, "--doctest-modules")
reprec.assertoutcome(failed=1) reprec.assertoutcome(failed=1)
def test_doctestmodule_external(self, testdir): def test_doctestmodule_external(self, testdir):
@ -76,7 +85,7 @@ class TestDoctests:
2 2
''' '''
""") """)
result = testdir.runpytest(p, '-p', 'doctest', "--doctest-modules") result = testdir.runpytest(p, "--doctest-modules")
result.stdout.fnmatch_lines([ result.stdout.fnmatch_lines([
'004 *>>> i = 0', '004 *>>> i = 0',
'005 *>>> i + 1', '005 *>>> i + 1',
@ -94,7 +103,7 @@ class TestDoctests:
>>> i + 1 >>> i + 1
2 2
""") """)
result = testdir.runpytest(p, '-p', 'doctest') result = testdir.runpytest(p)
result.stdout.fnmatch_lines([ result.stdout.fnmatch_lines([
'001 >>> i = 0', '001 >>> i = 0',
'002 >>> i + 1', '002 >>> i + 1',