簡體   English   中英

Python運行連續測試或每次測試多次

[英]Python run unittests continuously or each test multiple times

我編寫了單元測試用例來測試我的應用程序。 它正在按預期工作,沒有問題。

下面是一些示例測試用例

import os
import unittest

class CreateUser(unittest.TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
    def test_send_message(self):
        #my script goes here
        print "success"
if __name__ == '__main__':
    unittest.main()

如果我運行此測試它按預期執行但我想要運行此測試用例'N'沒有時間

因為我在main函數中添加了for循環,也只運行了一次,代碼我使用如下

 if __name__ == '__main__':
    for i in range(1, 5):
         unittest.main()  

我還使用schedule lib每10分鍾運行一次測試,但沒有運氣

有沒有辦法多次運行這個測試用例或任何其他我缺少的工作或任何其他連續構建工具來實現這個?

提前致謝

首先,一點點謹慎。

為什么要運行相同的測試五次? 我不想在沒有看到你的代碼的情況下做出假設,但這是一個非常嚴重的代碼味道。 單元測試必須是可重復的 ,如果連續運行五次並不會產生與運行一次相同的結果,那么測試中的某些內容是不可重復的。 特別是,如果測試的早期運行會產生后續運行所使用的副作用,或者如果涉及某種隨機數,則這兩種情況都是非常糟糕的情況需要修復而不是多次運行測試。 鑒於我們在這里提供的信息,最好的建議似乎不是多次運行該測試!

話雖如此,你有幾個不同的選擇。

  1. 把循環放在測試中

假設有五次調用函數有一些有意義的事情,那么執行以下操作是完全合理的:

def test_function_calls(self):
    for _ in xrange(1, 5):
        self.assertTrue(f())
  1. 由於您提到了nose標記,因此您有一些參數化測試選項,通常包括對不同的輸入值運行相同的(代碼)測試。 如果你使用像https://github.com/wolever/nose-parameterized這樣的東西,那么你的結果可能是這樣的:
@parameterized.expand([('atest', 'a', 1), ('btest', 'b', 2)])
def test_function_calls(self, name, input, expected):
    self.assertEqual(expected, f(input))

顧名思義,參數化測試通常用於檢查具有多個數據的一個代碼測試。 如果您只想讓測試運行幾次,那么您可以擁有一個包含虛擬數據的列表,但這是另一個可疑的代碼結構,可以追溯到我的原始點。

附加說明:幾乎所有“連續”構建工具都設置為觸發構建/測試/等。 在特定條件或事件上,例如將代碼提交到存儲庫時。 他們只是不斷地進行測試是非常不尋常的。

我已盡力在這里回答你的問題,但我覺得缺少了一些東西。 您可能想要明確說明您要完成的工作以獲得最佳答案。

我喜歡在一個簡單的bash循環中運行這種東西。 當然,這只適用於你使用bash:

while true; do python setup.py test ; done

道歉,作為新用戶,我無法評論。 我只想回應GrandOpener對你想要重新執行測試的擔憂。 我本人處於類似的情況,我有'不可靠'的測試。 我用不可靠或不確定的測試看到的問題是,很難證明你已經修復它們,因為它們可能只會失敗1/100次。

我的想法是,我將執行有問題的測試X次,建立一個在失敗之前發生了多少次測試迭代的分布。 有了這個我認為我要么能夠a)使用失敗前的最大迭代次數作為檢查后不可靠性'修復'的迭代次數或b)使用一些花哨的統計方法來證明可靠性'修復'可能是Y%解決了這個問題。

沒有惡意或屈尊俯就,GrandOpener如何證明他想象中的不可靠測試已被修復?

暫無
暫無

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

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