2015-05-10 41 views
2

我是pytest的新手,我正在尋求澄清一些關於參數化測試的混亂。pytest:paramaterized測試vs顯式測試

使用單個參數化測試函數或多個顯式測試僅在「輸入」方面有所不同,是否更好(即更清晰,更幹,更易維護)?

讓我舉一個例子,希望能夠更好地解釋我的觀點:

說我們寫了一個簡單的功能,merge_sort,我們要利用各種輸入,例如包括負數,重複的數字,花車進行測試等

寫多個明確的測試:

def test_merge_sort(): 
    unsorted = [2, 1, 3] 
    expected = [1, 2, 3] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_negative(): 
    unsorted = [-2, -1, -3] 
    expected = [-3, -2, -1] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_including_zero(): 
    unsorted = [2, 0, 1] 
    expected = [0, 1, 2] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_repeated_number(): 
    unsorted = [0, 1, 0] 
    expected = [0, 0, 1] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_float(): 
    unsorted = [0.1, 0.3, 0.2] 
    expected = [0.1, 0.2, 0.3] 

    assert merge_sort(unsorted) == expected 

OR,寫一個,paramaterized測試:

@pytest.mark.parametrize("unsorted,expected", [ 
    ([2,1,3], [1,2,3]), 
    ([-2,-1,-3], [-3,-2,-1]), 
    ([2,0,1], [0,1,2]), 
    ([0,1,0], [0,0,1]), 
    ([0.1,0.3,0.2], [0.1,0.2,0.3]), 
]) 
def test_merge_sort(unsorted, expected): 
    assert merge_sort(unsorted) == expected 

我最初的想法是,多個顯式測試更清晰,更易於維護,就好像出現故障一樣,您將得到一個描述性函數名稱,指示待測試的特定案例。然而,參數化測試更加乾燥,並且可能更容易提取測試數據作爲其他測試的固定裝置(即使用相同的數據來測試功能)。

也許有什麼我在pytest文檔中錯過了哪些答案?

在此先感謝您的幫助!

+1

如果有故障,預期/實際清單將包括在輸出中。唯一沒有得到的是自然語言描述,甚至可以通過將其包含在參數數據中來獲得。 – delnan

+0

@delnan你可以舉一個例子來說明參數化測試的一部分嗎?這聽起來完全像我在找的東西。謝謝! – luggzy

回答

4

失敗消息將包括所有的參數化值,這樣你就可以描述文本添加到參數:

@pytest.mark.parametrize("description,unsorted,expected", [ 
    ("positive", [2,1,3], [1,2,3]), 
    ("negative", [-2,-1,-3], [-3,-2,-1]), 
    ("including zero", [2,0,1], [0,1,2]), 
    ("duplicate values", [0,1,0], [0,0,1]), 
    ("floats", [0.1,0.3,0.2], [0.1,0.2,0.3]), 
]) 
def test_merge_sort(description, unsorted, expected): 
    assert merge_sort(unsorted) == expected