2017-08-06 71 views
0

我有一個Python單元測試像下面,我想運行的時間如何運行單元測試蟒蛇N多的時間

class Test(TestCase) 

    def test_0(self): 
      ......... 
      ......... 
      ......... 

Test.Run(name=__name__) 

任何建議,因此整個試驗N號碼?

+2

好問題是爲什麼你想要那個?單元測試框架詞意圖允許測試方法的結果,所以多次運行相同的測試並不合理。如果你想控制執行時間,要使用的模塊是'timeit'。 –

+0

爲什麼?因爲... test_0方法包含一個隨機選項..所以每次運行它時都會根據這些配置選擇隨機數的配置和測試。所以我不會多次測試相同的東西。 – ulta

+1

即使對隨機值運行多個測試也很奇怪。當你想控制進化沒有帶來回歸的時候,測試的目的是再次運行,總是有相同的結果。選擇一些*有趣的*配置並測試它們。如果你想了解參數化測試,你可以看看https://stackoverflow.com/q/32899/3545273 –

回答

0

您可以使用參數化測試。有不同的模塊可以做到這一點。我使用鼻子來運行我的unittests(比默認的unittest模塊更強大),並且有一個名爲nose-parameterized的包,它允許您編寫一個工廠測試,並使用不同的值運行多次,以獲得所需的變量。 如果您不想使用鼻子,還有其他幾種運行參數化測試的選項。

或者,您可以在單個測試中執行任意數量的測試條件(只要一次測試失敗,測試將報告錯誤)。在你的特定情況下,這可能比參數化測試更有意義,因爲實際上它只是一個測試,只是需要大量的函數運行才能達到某種程度的信心,以確保它正常工作。所以,你可以這樣做:

import random 
class Test(TestCase) 

    def test_myfunc(self): 
     for _ in range(100): 
      input = random.random() 
      self.assertEquals(input, input + 2) 


Test.Run(name=__name__) 
0

爲什麼?因爲...的test_0方法中包含一個隨機選擇..所以每次運行時,它選擇的配置和測試,對這些配置的隨機數。所以我不是多次測試相同的東西..

測試中的隨機性使其不可重現。有一天,你可能會失敗100次,當你再次運行它時,它已經消失了。

使用新型測試工具有一個序列號,參數化測試,然後使用random.seed有一個隨機但重複性測試用例序列中的每個號碼。

portusato暗示的鼻子,但pytest是一個更現代和流行的工具:

import random, pytest 

@pytest.mark.parametrize('i', range(100)) 
def test_random(i): 
    orig_state = random.getstate() 
    try: 
     random.seed(i) 
     data = generate_random_data() 
     assert my_algorithm(data) == works 
    finally: 
     random.setstate(orig_state) 

pytest.mark.parametrize「爆炸」的單一test_random到100個獨立的測試 - test_random[0]通過test_random[99]

$ pytest -q test.py 
.................................................................................................... 
100 passed in 0.14 seconds 

每這些測試會爲您的算法生成不同的隨機但可重現的輸入data。如果test_random[56]失敗,則每次都會失敗,因此您將能夠對其進行調試。