Pytest - 跳过(xfail)与参数化混合

Pytest - skip (xfail) mixed with parametrize

有没有办法使用 @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_checktest_process_check 被标记为 "xfail"。 我期望的行为是,在我的参数化数据集的每个新 "input" 处,测试将以增量方式进行。

例如:数据 = [0,1,2]

如果仅 test_preprocess_check(0) 失败:

我收到以下报告: 1 次失败,5 次失败

但我希望报告: 1 次失败,1 次失败,4 次通过

谢谢

经过一些实验,我找到了一种方法来概括@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 变量。

希望这对我以外的人有帮助。