5

py.test を使用して、一部のテスト ケースが失敗すると予想されるテストを生成することがよくあります。それらを xfail としてマークするにはどうすればよいですか? テスト関数に置くと、@py.test.mark.xfailそのすべてのインスタンスが xfail であることを意味します。テスト内で行うpy.test.xfail()と、xfail としてマークするだけでなく、実際にテストに失敗します。このマーカーを追加するために metafunc でできることはありますか?

例えば

# code - function with a bug :)

def evenHigherThanSquare(n):
    return n**2


# test file

def pytest_generate_tests(metafunc):
    data = [
        (2, 4),
        (3, 10), # should be xfail
        (4, 16),
        (5, 26), # should be xfail
        ]
    for input, expected in data:
        if metafunc.function is test_evenHigherThanSquare:
            metafunc.addcall(funcargs=dict(input=input, expected=expected))


def test_evenHigherThanSquare(input, expected):
    assert evenHigherThanSquare(input) == expected
4

2 に答える 2

4

もちろん、 funcarg ファクトリを使用して xfail マーカーを適用できます ( 1.3.2 以降) :

def pytest_generate_tests(metafunc):
    data = [
        # input # output # is expected to fail?
        (2, 4, False),
        (3, 10, True),
        (4, 16, False),
        (5, 26, True),
        ]
    for input, expected, xfail in data:
        if metafunc.function is test_evenHigherThanSquare:
            metafunc.addcall(funcargs=dict(input=input, expected=expected),
                             param=xfail)


def pytest_funcarg__xfail(request):
    if request.param:
        request.applymarker(py.test.mark.xfail)


def test_evenHigherThanSquare(input, expected, xfail):
    assert evenHigherThanSquare(input) == expected

ここでは、各テスト項目での呼び出しをトリガーするために、未使用のxfailパラメーターを使用しています。に提供された を使用して、テストに xfail するかどうかを決定します。test_evenHigherThanSquarepytest_funcarg__xfailparammetafunc.addcall

Funcarg ファクトリは、コレクション時に作成するのにコストがかかる引数を生成するためにより一般的に使用されますが、マーカーの適用も完全にサポートされている使用法です。

于 2012-09-11T11:10:32.423 に答える