pfc*_*ise 6 python testing pytest
使用 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
Run Code Online (Sandbox Code Playgroud)
当然,您可以使用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
Run Code Online (Sandbox Code Playgroud)
这里我们使用未使用的xfail
参数来触发每个测试项test_evenHigherThanSquare
的调用;pytest_funcarg__xfail
它使用param
提供的 来metafunc.addcall
决定是否使测试失败。
Funcarg 工厂更常用于生成在收集时创建成本高昂的参数,但应用标记也是完全支持的用法。