@ mark.incrementalの目的は、1つのテストが失敗した場合、その後のテストで失敗すると予想されることです。pytestテストクラスで@ mark.incrementalとmetafunc.parametrizeを使用する
しかし、これをパラメータ化と組み合わせて使用すると、私は望ましくない動作をします。
たとえば、この偽のコードの場合:
//conftest.py:
def pytest_generate_tests(metafunc):
metafunc.parametrize("input", [True, False, None, False, True])
def pytest_runtest_makereport(item, call):
if "incremental" in item.keywords:
if call.excinfo is not None:
parent = item.parent
parent._previousfailed = item
def pytest_runtest_setup(item):
if "incremental" in item.keywords:
previousfailed = getattr(item.parent, "_previousfailed", None)
if previousfailed is not None:
pytest.xfail("previous test failed (%s)" %previousfailed.name)
//test.py:
@pytest.mark.incremental
class TestClass:
def test_input(self, input):
assert input is not None
def test_correct(self, input):
assert input==True
私はテストクラスがTrueに
test_input、test_correct続い
を実行するために期待しますon True、
次に、Falseの場合はtest_input、なしに(xfailed)test_correct、などなどが続く
が
代わりに、何が起こる
なしにtest_inputによってfolowed、偽のtest_correct続い
、それはテストクラスです。
- test_input o 、
- は、その後、(test_corrects含む)xfailedとして
- はその後、その時点からすべてをマークし、なしにtest_input走る
- 、偽の上にnは真test_input実行されます。
私が想定していることは、クラス内の関数を処理することよりもパラメータ化が優先されるということです。問題は、現在の状況ではクラスをインクリメンタルなものとして完全に役に立たないとマークするため、何らかの形でこの振る舞いをオーバーライドしたり、回避したりすることが可能かどうかです。
(異なるパラメータで毎回、コピー&ペーストして何度もクラスのコードをこれに対処する唯一の方法です?考えは私に反発です)
プレーンリンクの代わりにソリューションの主なポイントを追加してください。 – pirho
このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](レビュー/低品質の投稿/ 17864634) – nvoigt
これは実際に関数の順番をうまく変更することはできますが、増分的な問題は解決しません。一度関数呼び出しが失敗すると、新しいシナリオを含め、その後の呼び出しにはxfailedとマークされます。まだ、これは答えの半分なので、私はもう半分に新しい質問をします – dWitty