Add --deselect command line option

Fixes #3198
This commit is contained in:
Jordan Speicher 2018-02-09 17:44:03 -06:00
parent 063e2da967
commit 774c539f1a
5 changed files with 44 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
Add command line option ``--deselect`` to allow deselection of individual tests at collection time.

View File

@ -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
---------------------------------------------------- ----------------------------------------------------

View File

@ -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