Обходной путь, позволяющий игнорировать пропущенные метки, заключается в их программном удалении. Создайте conftest.py
со следующим содержимым:
def pytest_collection_modifyitems(items):
for item in items:
for node in reversed(item.listchain()):
node.own_markers = [m for m in node.own_markers if m.name not in ('skip', 'skipif')]
Однако, это портит pytest
внутренности и может легко сломаться при pytest
обновлениях; правильный способ игнорирования пропусков должен определять ваш собственный механизм пропуска, например:
@pytest.hookimpl(tryfirst=True)
def pytest_runtest_setup(item):
mark = item.get_closest_marker(name='myskip')
if mark:
condition = next(iter(mark.args), True)
reason = mark.kwargs.get('reason', 'custom skipping mechanism')
item.add_marker(pytest.mark.skipif(not os.getenv('PYTEST_RUN_FORCE_SKIPS', False) and condition, reason=reason), append=False)
Аннотируйте тесты с помощью @pytest.mark.myskip
вместо @pytest.mark.skip
и @pytest.mark.myskip(condition, reason)
вместо @pytest.mark.skipif(condition, reason)
:
@pytest.mark.myskip
def test_skip():
assert True
@pytest.mark.myskip(1 == 1, reason='my skip')
def test_skipif():
assert True
При регулярном запуске myskip
будет вести себя так же, как и pytest.mark.skip
/ pytest.mark.skipif
. Настройка PYTEST_RUN_FORCE_SKIPS
отключит его:
$ PYTEST_RUN_FORCE_SKIPS=1 pytest -v
...
test_spam.py::test_skip PASSED
test_spam.py::test_skipif PASSED
...
Конечно, вы не должны больше использовать pytest.mark.skip
/ pytest.mark.skipif
, поскольку они не будут зависеть от PYTEST_RUN_FORCE_SKIPS
env var.