2015-12-16 101 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