有没有办法使用@incremental插件,比如描述att Pytest: how to skip the rest of tests in the class if one has failed?与@ pytest.mark.parametrize混合,如下所示:
@pytest.mark.incremental
Class TestClass:
@pytest.mark.parametrize("input", data)
def test_preprocess_check(self,input):
# prerequisite for test
@pytest.mark.parametrize("input",data)
def test_process_check(self,input):
# test only if test_preprocess_check succeed
我遇到的问题是,在 test_preprocess_check 的第一次失败时,我的数据集的给定输入,以下 test_preprocess_check 和 test_process_check 标有" xfail"。 我期望的行为将在每个新的"输入"对于我的参数化数据集,测试将以递增的方式进行。
ex:data = [0,1,2]
如果只有 test_preprocess_check (0)失败:
我收到了以下报告: 1失败,5 xfailed
但我希望报告: 1次失败,1次失败,4次传递
由于
答案 0 :(得分:2)
经过一些实验,我找到了一种方法来概括@incremental以使用 parametrize 注释。只需重写 _previousfailed 参数,使其对每个输入都是唯一的。 _genid 这个论点完全是需要的。
我添加了@ pytest.mark.incrementalparam来实现这一目标。
代码成为:
def pytest_runtest_setup(item):
previousfailed_attr = getattr(item, "_genid",None)
if previousfailed_attr is not None:
previousfailed = getattr(item.parent, previousfailed_attr, None)
if previousfailed is not None:
pytest.xfail("previous test failed (%s)" %previousfailed.name)
previousfailed = getattr(item.parent, "_previousfailed", None)
if previousfailed is not None:
pytest.xfail("previous test failed (%s)" %previousfailed.name)
def pytest_runtest_makereport(item, call):
if "incrementalparam" in item.keywords:
if call.excinfo is not None:
previousfailed_attr = item._genid
setattr(item.parent,previousfailed_attr, item)
if "incremental" in item.keywords:
if call.excinfo is not None:
parent = item.parent
parent._previousfailed = item
有趣的是,如果没有参数化,它就无法使用,因为参数化注释会自动创建_genid变量。
希望这可以帮助别人而不是我。