[英]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_random
“ pytest.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.