2012-07-22 27 views
6

我正在使用帶有數百個測試用例的套接字的模塊。這很好。除了現在,我需要測試所有的情況下有沒有socket.setdefaulttimeout(60)...請不要告訴我剪切和粘貼所有的測試,並設置/刪除默認超時設置/拆解。python unittests多個設置?

老實說,我得到的是讓每個測試用例在它自己的佈局是很好的做法,但我也不喜歡重複自己。這實際上只是在不同的測試環境下進行測試。

我看到,單元測試支持模塊級安裝/拆卸燈具,但並不明顯,我怎麼我的一個測試模塊轉換成具有兩種不同的設置測試本身的兩倍。

任何幫助,將不勝感激。

回答

4

在這個問題上有其他的答案儘可能有效地實現在多種環境下實際執行測試,但是在玩弄選項時我認爲我更喜歡自我包容的方法。我使用套件和結果來組織和顯示測試結果。爲了用兩個環境而不是兩個測試運行一個測試,我採用了這種方法 - 創建一個TestSuite子類。

class FixtureSuite(unittest.TestSuite): 
    def run(self, result, debug=False): 
     socket.setdefaulttimeout(30) 
     super().run(result, debug) 
     socket.setdefaulttimeout(None) 
... 
suite1 = unittest.TestSuite(testCases) 
suite2 = FixtureSuite(testCases) 
fullSuite = unittest.TestSuite([suite1,suite2]) 
unittest.TextTestRunner(verbosity=2).run(fullSuite) 
4

我會做這樣的:

  1. 使您的所有測試從您自己的TestCase類派生,我們稱之爲SynapticTestCase。

  2. 在SynapticTestCase.setUp(),檢查環境變量,以確定是否設置套接字超時或沒有。

  3. 運行整個測試套件兩次,一次是與環境變量設置的一種方式,然後再次將其設置的其他方式。

  4. 寫一個小的shell腳本調用測試套件兩種方式。

+0

這聽起來不錯,但它必須在有或沒有默認超時時自動運行。 – underrun 2012-07-23 12:58:23

+0

更新:使用shell腳本或小Python腳本兩種方式運行測試。 – 2012-07-23 13:01:29

1

如果你的代碼不調用socket.setdefaulttimeout那麼你可以運行測試方式如下:

import socket 
socket.setdeaulttimeout(60) 
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None 
unittest.main() 
socket.setdefaulttimeout = old_setdefaulttimeout 

這是一個黑客,但它可以工作

+0

這可以用默認超時測試它,但不是沒有它。我需要測試所有的測試 – underrun 2012-07-23 14:47:41

+0

然後只需添加'socket.setdefaulttimeout(OTHER_VALUE); unittest.main()'到最後。 – 2012-07-23 14:58:02