У меня есть несколько проектов, в которых я использую маркер pytest.mark.xfail
, чтобы пометить тесты, которые завершились неудачей, но не должны завершаться ошибкой, чтобы можно было добавить неудачный тестовый пример до того, как проблема будет устранена. Я не хочу пропускать эти тесты, потому что если что-то, что я делаю, заставляет их начать проходить, я хочу быть проинформирован об этом, чтобы я мог удалить маркер xfail
, чтобы избежать регрессии.
Проблема в том, что, поскольку xfail
тесты на самом деле выполняются до тех пор, пока не завершатся сбоем, любые строки, которые привели к сбою, считаются "пройденными", даже если они являются частью непройденного теста, что дает мне вводящие в заблуждение показатели. о том, какая часть моего кода на самом деле проверена как работающая. Минимальный пример этого:
pkg.py
def f(fail):
if fail:
print("This line should not be covered")
return "wrong answer"
return "right answer"
test_pkg.py
import pytest
from pkg import f
def test_success():
assert f(fail=False) == "right answer"
@pytest.mark.xfail
def test_failure():
assert f(fail=True) == "right answer"
Запустив python -m pytest --cov=pkg
, я получаю:
platform linux -- Python 3.7.1, pytest-3.10.0, py-1.7.0, pluggy-0.8.0
rootdir: /tmp/cov, inifile:
plugins: cov-2.6.0
collected 2 items
tests/test_pkg.py .x [100%]
----------- coverage: platform linux, python 3.7.1-final-0 -----------
Name Stmts Miss Cover
----------------------------
pkg.py 5 0 100%
Как видите, все пять строк покрыты, но строки 3 и 4 затрагиваются только во время теста xfail
.
Сейчас я справляюсь с этим, настраивая tox
для запуска чего-то вроде pytest -m "not xfail" --cov && pytest -m xfail
, но в дополнение к тому, что это немного громоздко, это отфильтровывает только вещи с отметкой xfail
, что означает, что условный xfails также отфильтровываются вне зависимости от того, выполняется условие или нет.
Есть ли способ сделать так, чтобы coverage
или pytest
не учитывали охват от неудачных тестов? В качестве альтернативы я бы согласился с механизмом игнорирования покрытия из xfail
тестов, который игнорирует условные xfail
тесты только в том случае, если условие выполнено.