2015-12-16 57 views
1

混合跳过(xfail)是有使用@incremental插件等中描述的att Pytest: how to skip the rest of tests in the class if one has failed?混合@ pytest.mark.parametrize像下面的方式:Pytest - 与参数多态

@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 

i是所遇到的问题,在test_preprocess_check与我的数据集的给定输入的第一次失败,以下test_preprocess_checktest_process_check被标记为“xfail”。 我期望的行为将会是,在我参数化数据集的每个新“输入”处,测试都将以增量方式进行。

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

如果只test_preprocess_check(0)失败:

我得到以下报告: 1失败,5 xfailed

但我预计报告: 1失败,1 xfailed,4传递

感谢

回答

2

经过一些实验后,我找到了一种方法来推广@incremental以与参数化注释一起使用。只需重写_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变量。

希望这可以帮助别人比我。

+0

小心_genid是由您的“输入”数据集组成的,因此可能导致无效的变量名称,将其映射到100%有效的变量名称可以避免一些问题 – Floghi