2016-07-26 112 views
0

我寫了一個名爲Consumer.py的模塊,其中包含一個類(Consumer)。該類使用配置文件進行初始化,該文件包含用於計算的不同參數以及用於記錄的loq隊列的名稱。Python - 單元測試方法在不同類中的正確方法是什麼?

我想爲這個類編寫單元測試,所以我用名爲TestConsumerMethods(unittest.TestCase)的類創建了一個名爲test_Consumer.py的腳本。

現在,我所做的是創建一個名爲cons的Consumer類的新對象,然後使用它來調用類方法進行測試。例如,Consumer有一個簡單的方法來檢查給定目錄中是否存在文件。我做的測試看起來像這樣

import Consumer 
from Consumer import Consumer 

cons = Consumer('mockconfig.config', 'logque1') 

class TestConsumerMethods(unittest.TestCase): 

    def test_fileExists(self): 
     self.assertEqual(cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(cons.file_exists('./dir/', thisDoesExist.config), True) 

這是測試我的班級的正確方法嗎?我的意思是,理想情況下,我想只使用類方法,而不必實例化類,因爲要「隔離」代碼,對吧?

回答

0

我不知道如果這就是你要搜索的內容,但你可以在你的文件這樣的末尾添加你的測試:

#!/usr/bin/python 

... 

class TestConsumerMethods(...): 
    ... 

if __name__ == "__main__": 
    # add your tests here. 

這種方式,通過執行包含類文件定義,您執行您在if聲明中輸入的測試。

這種方式只有在您直接執行文件本身時纔會執行測試,但如果您從中導入類,則不會執行測試。

+1

這個問題是,那麼這就是你可以運行測試的唯一方法。你不能用unittest發現它們,或者在CI設置中很容易地運行它們 – SpoonMeiser

+0

@SpoonMeiser確實如此,但是如果你需要一種簡單的方法來實現一些測試(例如沒有單元測試知識),這可能是一個好方法, 。 但是,這仍然是實施測試的簡單而快捷的方式,它有一定的侷限性。 我認爲這取決於你需要什麼,這是一種方式。 – vmonteco

2

不要讓一個全局對象進行測試,因爲它打開了一個狀態可能會被一個測試設置並影響另一個狀態的可能性。

每個測試應該單獨運行並且完全獨立於其他測試。

取而代之的是,無論是在您的測試創建對象,或者它會自動爲每個測試創建,將其置於設置方法:

import Consumer 
from Consumer import Consumer 


class TestConsumerMethods(unittest.TestCase): 
    def setUp(self): 
     self.cons = Consumer('mockconfig.config', 'logque1') 

    def test_fileExists(self): 
     self.assertEqual(self.cons.file_exists('./dir/', 'thisDoesntExist.config), False) 
     self. assertEqual(self.cons.file_exists('./dir/', thisDoesExist.config), True) 

至於你是否真的需要在所有實例類,這取決於班級的實施情況。我想通常你會希望實例化一個類來測試它的方法。

+0

這很有道理,謝謝!是否有必要刪除tearDown()中的對象? – Zazz

+0

@Zazz通常,沒有。 TestConsumerMethods將爲每個測試實例化,每次構建一個新的Consumer。舊消費者只會像其他任何超出範圍的垃圾一樣收集垃圾。如果你需要明確釋放一些資源或其他資源,你只需要在'tearDown'中執行一些操作。 – SpoonMeiser

相關問題