Merge pull request #3201 from uSpike/deselect_cli
Add "--deselect" command line option
This commit is contained in:
commit
b1abe5db23
1
AUTHORS
1
AUTHORS
|
@ -97,6 +97,7 @@ Jon Sonesen
|
||||||
Jonas Obrist
|
Jonas Obrist
|
||||||
Jordan Guymon
|
Jordan Guymon
|
||||||
Jordan Moldow
|
Jordan Moldow
|
||||||
|
Jordan Speicher
|
||||||
Joshua Bronson
|
Joshua Bronson
|
||||||
Jurko Gospodnetić
|
Jurko Gospodnetić
|
||||||
Justyna Janczyszyn
|
Justyna Janczyszyn
|
||||||
|
|
|
@ -66,6 +66,8 @@ def pytest_addoption(parser):
|
||||||
help="try to interpret all arguments as python packages.")
|
help="try to interpret all arguments as python packages.")
|
||||||
group.addoption("--ignore", action="append", metavar="path",
|
group.addoption("--ignore", action="append", metavar="path",
|
||||||
help="ignore path during collection (multi-allowed).")
|
help="ignore path during collection (multi-allowed).")
|
||||||
|
group.addoption("--deselect", action="append", metavar="nodeid_prefix",
|
||||||
|
help="deselect item during collection (multi-allowed).")
|
||||||
# when changing this to --conf-cut-dir, config.py Conftest.setinitial
|
# when changing this to --conf-cut-dir, config.py Conftest.setinitial
|
||||||
# needs upgrading as well
|
# needs upgrading as well
|
||||||
group.addoption('--confcutdir', dest="confcutdir", default=None,
|
group.addoption('--confcutdir', dest="confcutdir", default=None,
|
||||||
|
@ -208,6 +210,24 @@ def pytest_ignore_collect(path, config):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_collection_modifyitems(items, config):
|
||||||
|
deselect_prefixes = tuple(config.getoption("deselect") or [])
|
||||||
|
if not deselect_prefixes:
|
||||||
|
return
|
||||||
|
|
||||||
|
remaining = []
|
||||||
|
deselected = []
|
||||||
|
for colitem in items:
|
||||||
|
if colitem.nodeid.startswith(deselect_prefixes):
|
||||||
|
deselected.append(colitem)
|
||||||
|
else:
|
||||||
|
remaining.append(colitem)
|
||||||
|
|
||||||
|
if deselected:
|
||||||
|
config.hook.pytest_deselected(items=deselected)
|
||||||
|
items[:] = remaining
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def _patched_find_module():
|
def _patched_find_module():
|
||||||
"""Patch bug in pkgutil.ImpImporter.find_module
|
"""Patch bug in pkgutil.ImpImporter.find_module
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Add command line option ``--deselect`` to allow deselection of individual tests at collection time.
|
|
@ -39,6 +39,14 @@ you will see that ``pytest`` only collects test-modules, which do not match the
|
||||||
|
|
||||||
======= 5 passed in 0.02 seconds =======
|
======= 5 passed in 0.02 seconds =======
|
||||||
|
|
||||||
|
Deselect tests during test collection
|
||||||
|
-------------------------------------
|
||||||
|
|
||||||
|
Tests can individually be deselected during collection by passing the ``--deselect=item`` option.
|
||||||
|
For example, say ``tests/foobar/test_foobar_01.py`` contains ``test_a`` and ``test_b``.
|
||||||
|
You can run all of the tests within ``tests/`` *except* for ``tests/foobar/test_foobar_01.py::test_a``
|
||||||
|
by invoking ``pytest`` with ``--deselect tests/foobar/test_foobar_01.py::test_a``.
|
||||||
|
``pytest`` allows multiple ``--deselect`` options.
|
||||||
|
|
||||||
Keeping duplicate paths specified from command line
|
Keeping duplicate paths specified from command line
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
|
|
|
@ -240,6 +240,20 @@ def test_exclude(testdir):
|
||||||
result.stdout.fnmatch_lines(["*1 passed*"])
|
result.stdout.fnmatch_lines(["*1 passed*"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_deselect(testdir):
|
||||||
|
testdir.makepyfile(test_a="""
|
||||||
|
import pytest
|
||||||
|
def test_a1(): pass
|
||||||
|
@pytest.mark.parametrize('b', range(3))
|
||||||
|
def test_a2(b): pass
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest("-v", "--deselect=test_a.py::test_a2[1]", "--deselect=test_a.py::test_a2[2]")
|
||||||
|
assert result.ret == 0
|
||||||
|
result.stdout.fnmatch_lines(["*2 passed, 2 deselected*"])
|
||||||
|
for line in result.stdout.lines:
|
||||||
|
assert not line.startswith(('test_a.py::test_a2[1]', 'test_a.py::test_a2[2]'))
|
||||||
|
|
||||||
|
|
||||||
def test_sessionfinish_with_start(testdir):
|
def test_sessionfinish_with_start(testdir):
|
||||||
testdir.makeconftest("""
|
testdir.makeconftest("""
|
||||||
import os
|
import os
|
||||||
|
|
Loading…
Reference in New Issue