Merge pull request #823 from nicoddemus/testdirs-option
Add new testdirs ini option
This commit is contained in:
commit
40ec0ec97d
|
@ -6,6 +6,13 @@
|
||||||
or no tests were run at all (this is a partial fix for issue500).
|
or no tests were run at all (this is a partial fix for issue500).
|
||||||
Thanks Eric Siegerman.
|
Thanks Eric Siegerman.
|
||||||
|
|
||||||
|
- New `testdirs` ini option: list of directories to search for tests
|
||||||
|
when executing pytest from the root directory. This can be used
|
||||||
|
to speed up test collection when a project has well specified directories
|
||||||
|
for tests, being usually more practical than configuring norecursedirs for
|
||||||
|
all directories that do not contain tests.
|
||||||
|
Thanks to Adrian for idea (#694) and Bruno Oliveira for the PR.
|
||||||
|
|
||||||
- fix issue713: JUnit XML reports for doctest failures.
|
- fix issue713: JUnit XML reports for doctest failures.
|
||||||
Thanks Punyashloka Biswal.
|
Thanks Punyashloka Biswal.
|
||||||
|
|
||||||
|
|
|
@ -917,7 +917,11 @@ class Config(object):
|
||||||
self.hook.pytest_cmdline_preparse(config=self, args=args)
|
self.hook.pytest_cmdline_preparse(config=self, args=args)
|
||||||
args = self._parser.parse_setoption(args, self.option)
|
args = self._parser.parse_setoption(args, self.option)
|
||||||
if not args:
|
if not args:
|
||||||
args.append(os.getcwd())
|
cwd = os.getcwd()
|
||||||
|
if cwd == self.rootdir:
|
||||||
|
args = self.getini('testpaths')
|
||||||
|
if not args:
|
||||||
|
args = [cwd]
|
||||||
self.args = args
|
self.args = args
|
||||||
|
|
||||||
def addinivalue_line(self, name, line):
|
def addinivalue_line(self, name, line):
|
||||||
|
|
|
@ -25,6 +25,8 @@ name_re = re.compile("^[a-zA-Z_]\w*$")
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
parser.addini("norecursedirs", "directory patterns to avoid for recursion",
|
parser.addini("norecursedirs", "directory patterns to avoid for recursion",
|
||||||
type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg'])
|
type="args", default=['.*', 'CVS', '_darcs', '{arch}', '*.egg'])
|
||||||
|
parser.addini("testpaths", "directories to search for tests when no files or directories are given in the command line.",
|
||||||
|
type="args", default=[])
|
||||||
#parser.addini("dirpatterns",
|
#parser.addini("dirpatterns",
|
||||||
# "patterns specifying possible locations of test files",
|
# "patterns specifying possible locations of test files",
|
||||||
# type="linelist", default=["**/test_*.txt",
|
# type="linelist", default=["**/test_*.txt",
|
||||||
|
|
|
@ -157,6 +157,25 @@ Builtin configuration file options
|
||||||
This would tell ``pytest`` to not look into typical subversion or
|
This would tell ``pytest`` to not look into typical subversion or
|
||||||
sphinx-build directories or into any ``tmp`` prefixed directory.
|
sphinx-build directories or into any ``tmp`` prefixed directory.
|
||||||
|
|
||||||
|
.. confval:: testpaths
|
||||||
|
|
||||||
|
.. versionadded:: 2.8
|
||||||
|
|
||||||
|
Sets list of directories that should be searched for tests when
|
||||||
|
no specific directories or files are given in the command line when
|
||||||
|
executing pytest from the :ref:`rootdir <rootdir>` directory.
|
||||||
|
Useful when all project tests are in a known location to speed up
|
||||||
|
test collection and to avoid picking up undesired tests by accident.
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
# content of pytest.ini
|
||||||
|
[pytest]
|
||||||
|
testpaths = testing doc
|
||||||
|
|
||||||
|
This tells pytest to only look for tests in ``testing`` and ``doc``
|
||||||
|
directories when executing from the root directory.
|
||||||
|
|
||||||
.. confval:: python_files
|
.. confval:: python_files
|
||||||
|
|
||||||
One or more Glob-style file patterns determining which python files
|
One or more Glob-style file patterns determining which python files
|
||||||
|
|
|
@ -282,8 +282,11 @@ Conventions for Python test discovery
|
||||||
|
|
||||||
``pytest`` implements the following standard test discovery:
|
``pytest`` implements the following standard test discovery:
|
||||||
|
|
||||||
* collection starts from the initial command line arguments
|
* collection starts from paths specified in :confval:`testpaths` if configured,
|
||||||
which may be directories, filenames or test ids.
|
otherwise from initial command line arguments which may be directories,
|
||||||
|
filenames or test ids. If :confval:`testpaths` is not configured and no
|
||||||
|
directories or files were given in the command line, start collection from
|
||||||
|
the current directory.
|
||||||
* recurse into directories, unless they match :confval:`norecursedirs`
|
* recurse into directories, unless they match :confval:`norecursedirs`
|
||||||
* ``test_*.py`` or ``*_test.py`` files, imported by their `test package name`_.
|
* ``test_*.py`` or ``*_test.py`` files, imported by their `test package name`_.
|
||||||
* ``Test`` prefixed test classes (without an ``__init__`` method)
|
* ``Test`` prefixed test classes (without an ``__init__`` method)
|
||||||
|
|
|
@ -116,6 +116,35 @@ class TestCollectFS:
|
||||||
rec = testdir.inline_run("xyz123/test_2.py")
|
rec = testdir.inline_run("xyz123/test_2.py")
|
||||||
rec.assertoutcome(failed=1)
|
rec.assertoutcome(failed=1)
|
||||||
|
|
||||||
|
def test_testpaths_ini(self, testdir, monkeypatch):
|
||||||
|
testdir.makeini("""
|
||||||
|
[pytest]
|
||||||
|
testpaths = gui uts
|
||||||
|
""")
|
||||||
|
tmpdir = testdir.tmpdir
|
||||||
|
tmpdir.ensure("env", "test_1.py").write("def test_env(): pass")
|
||||||
|
tmpdir.ensure("gui", "test_2.py").write("def test_gui(): pass")
|
||||||
|
tmpdir.ensure("uts", "test_3.py").write("def test_uts(): pass")
|
||||||
|
|
||||||
|
# executing from rootdir only tests from `testpaths` directories
|
||||||
|
# are collected
|
||||||
|
items, reprec = testdir.inline_genitems('-v')
|
||||||
|
assert [x.name for x in items] == ['test_gui', 'test_uts']
|
||||||
|
|
||||||
|
# check that explicitly passing directories in the command-line
|
||||||
|
# collects the tests
|
||||||
|
for dirname in ('env', 'gui', 'uts'):
|
||||||
|
items, reprec = testdir.inline_genitems(tmpdir.join(dirname))
|
||||||
|
assert [x.name for x in items] == ['test_%s' % dirname]
|
||||||
|
|
||||||
|
# changing cwd to each subdirectory and running pytest without
|
||||||
|
# arguments collects the tests in that directory normally
|
||||||
|
for dirname in ('env', 'gui', 'uts'):
|
||||||
|
monkeypatch.chdir(testdir.tmpdir.join(dirname))
|
||||||
|
items, reprec = testdir.inline_genitems()
|
||||||
|
assert [x.name for x in items] == ['test_%s' % dirname]
|
||||||
|
|
||||||
|
|
||||||
class TestCollectPluginHookRelay:
|
class TestCollectPluginHookRelay:
|
||||||
def test_pytest_collect_file(self, testdir):
|
def test_pytest_collect_file(self, testdir):
|
||||||
wascalled = []
|
wascalled = []
|
||||||
|
|
Loading…
Reference in New Issue