問題が修正される前に失敗したテストケースを追加できるように、マーカーを使用して失敗するが失敗してはならない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%
ご覧のとおり、5 行すべてがカバーされていますが、3 行目と 4 行目はxfail
テスト中にヒットしただけです。
tox
私が今これを処理する方法は、 のようなものを実行するようにセットアップすることですpytest -m "not xfail" --cov && pytest -m xfail
が、少し面倒であることに加えて、それはxfail
マークが付いたものを除外するだけです。つまり、条件付きの xfails も、条件が満たされます。
失敗したテストからのカバレッジをカウントする方法とカウントしない方法はありますcoverage
か? または、条件が満たされた場合にのみ条件付きテストを無視するテストpytest
からのカバレッジを無視するメカニズムで問題ありません。xfail
xfail