2013-02-08 46 views
0

我有一堆不同的對象具有類似的預期行爲,因此我想對它們運行類似的測試,但不一定對它們進行相同的測試。在python中參數化測試的最簡單方法是什麼?

具體而言,可以說我有一些排序函數,並且檢查排序函數是否實際排序。一些排序功能旨在處理一些輸入,而不是其他輸入。

我想寫一些接近下面的代碼。但是,鼻子不能很好地告訴我測試失敗的位置以及輸入數據。如果check_sort在case2上的sort2失敗,我將無法看到。

def check_sort(sortalg, vals): 
    assert sortalg(vals) == sort(vals) 


def test_sorts(): 
    case1 = [1,3,2] 
    case2 = [2,31,1] 

    check_sort(sort1, case1) 

    for c in [case1, case2]: 
     check_sort(sort2, c) 

我想能夠簡單地添加一個裝飾器到check_sort來告訴鼻子它是一個嵌套測試。像

@nested_test 
def check_sort(sortalg, vals): 
    assert sortalg(vals) == sort(vals) 

的想法是什麼,當它被調用時,它本身註冊的鼻子,如果失敗將報告其輸入。

它看起來像pytest提供pytest.mark.parameterized,但這對我來說似乎相當尷尬。我必須將所有參數放在函數的上方,所以在測試中我不能重複調用它。我也不認爲這支持多層嵌套。

鼻子也提供test generators,這似乎更接近,但仍然沒有我希望的那麼清楚。

回答

2

使用提供的generative test功能可能是通過nose和py.test來完成的。

也就是說,您可以在創建類之後動態添加函數(測試)。這是標準庫中Lib/test/test_decimal.py代碼使用的技術。

2

您可以使用nose-ittr,它是一個支持參數化測試的機頭擴展。

例如:

@ittr(case1=[1,3,2],case2=[2,31,1]) 
def test_sorts(): 

check_sort(sort1, self.case1) 
check_sort(sort2, self.case2) 
相關問題