2013-09-28 70 views
8

我是新來的Python,並試圖做我經常在Ruby中做的事情。也就是說,迭代一組索引,使用它們作爲參數,並將其結果與一系列燈具輸出進行比較。如何在循環中運行多個Python測試用例?

因此,我把它寫成像我通常在Ruby中做的那樣,但是這隻導致了一個測試用例。

def test_output(self): 
    for i in range(1,11): 
     .... 
     self.assertEqual(fn(i),output[i]) 

我試圖讓範圍內的每個項目的測試。我怎樣才能做到這一點?

+1

你想生成10個不同的測試案例?你已經顯示的代碼有效,它只是在一個測試用例中執行所有十個斷言。 – delnan

回答

8

使用unittest,您可以在一個測試用例中顯示兩個序列之間的差異。

seq1 = range(1, 11) 
seq2 = (fn(j) for j in seq1) 
assertSequenceEqual(seq1, seq2) 

如果這不夠靈活,使用unittest,可以生成多個測試,但它有點棘手。

鼻子使上述更容易通過test generators

import nose.tools 

def test_fn(): 
    for i in range(1, 11): 
     yield nose.tools.assert_equals, output[i], fn(i) 

類似的問題:

+1

這很有道理,謝謝你的解釋。我會去更新它。 –

+0

可能不應該將測試方法生成放在if __name__ =='__main__'子句中,因爲它正在修改模塊。沒有生成代碼,測試序列代碼就沒有意義。 –

+1

好點@JappieKerk,我刪除了這個子句。 –

5

在蟒蛇世界兩個最流行的選擇編寫測試:

在pytest你參數化的測試非常伊斯利:

@pytest.mark.parametrize(('param1', 'param2'),[ 
         (1, 'go'), 
         (2, 'do not go')]) 
def test_me(param1, param2): 
    # write test 

這也將產生不錯的輸出,同時運行測試:

go.py:2: test_me[1-go] PASSED 
go.py:2: test_me[2-do not go] PASSED 

我使用pytest兩年現在,這是非常好的工具。你有很多功能。除了參數化之外,還有固定裝置,非常非常好的斷言(你不需要寫assertEqual,只需要assert a==b,pytest可以爲它產生非常好的和有用的輸出。)

相關問題