簡體   English   中英

如何運行python unittest N次

[英]How to run the python unittest N number of times

我有一個像下面這樣的 python unittest,我想運行整個測試 N 次

class Test(TestCase)

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

Test.Run(name=__name__)

有什么建議嗎?

您可以使用參數化測試。 有不同的模塊可以做到這一點。 我使用nose 來運行我的單元測試(比默認的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__) 

為什么因為...... test_0 方法包含一個隨機選項......所以每次運行它都會選擇隨機數量的配置並針對這些配置進行測試。 所以我不會多次測試同一件事。

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

使用現代測試工具用序列號參數化您的測試,然后使用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_randompytest.mark.parametrize ”為 100 個單獨的測試 — test_random[0]test_random[99]

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

這些測試中的每一個都會為您的算法生成不同的、隨機的但可重現的輸入data 如果test_random[56]失敗,它每次都會失敗,這樣你就可以調試它了。

如果您不希望您的測試在第一次失敗后停止,您可以使用subTest

class Test(TestCase):
    def test_0(self):
        for i in [1, 2, 3]:
            with self.subTest(i=i):
                self.assertEqual(squared(i), i**2)

文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM