Pytest - skip(xfail)与参数化混合

时间:2015-12-16 09:18:33

标签: pytest skip

有没有办法使用@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次传递

由于

1 个答案:

答案 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变量。

希望这可以帮助别人而不是我。