2017-08-08 51 views
0

我想要編寫單元測試使用unittest一些代碼:編寫單元測試:我可以在課堂級別導入我需要的所有模塊,還是必須在每次測試中再次導入它們?

https://docs.python.org/3/library/unittest.html

假設每個測試我寫需要導入mathosdatetime模塊。現在,我輸入他們在每個我寫的測試:

#...code for which I'm writing the unit tests... 
import unittest 

class TestMyCode(unittest.TestCase): 

    def test_method_1(self): 
     # unit test for method 1 
     import math 
     import os 
     import datetime 
     . 
     . 

    def test_method_2(self): 
     # unit test for method 2 
     import math 
     import os 
     import datetime 
     . 
     . 

if __name__ == "__main__": 
    unittest.main() 

爲了避免重複代碼,是不是有可能在類級別只導入一次?這:

#...code for which I'm writing the unit tests... 
import unittest 

class TestMyCode(unittest.TestCase): 

    import math 
    import os 
    import datetime 

    def test_method_1(self): 
     # unit test for method 1 
     . 
     . 

    def test_method_2(self): 
     # unit test for method 2 
     . 
     . 

if __name__ == "__main__": 
    unittest.main() 

導致錯誤

NameError: name 'math' is not defined 

因此,這顯然不是正確的做法。爲了清楚起見,我正在編寫單元測試(實際上由兩個方法組成)和(兩個)單元測試的代碼都在同一個模塊中,我們稱之爲MyCode.py

+1

你爲什麼不在* module *級別導入它們? – BrenBarn

+0

@BrenBarn好主意!事實是,我將單元測試放在包含要測試的代碼的模塊中(我不知道這是否正確:我今天剛開始這項工作,而且我不是專業程序員)。 'math'沒有被主代碼使用,但是隻能通過單元測試。所以在我看來,通過添加僅供測試使用的導入來修改我正在編寫測試的代碼時,有點「髒」。在實踐中,爲了編寫測試,我正在修改我應該測試的代碼。你怎麼看? – DeltaIV

+1

如果您將測試代碼包含在正在測試的代碼中,那麼您已經通過向其添加了測試代碼來修改主代碼,所以我認爲不必擔心太多。如果你想讓東西在視覺上分開,你可以把單元測試導入放在模塊級別,但是在文件末尾(就在你的單元測試代碼之前,還有'import unittest')。如果您的測試代碼變得足夠大,以至於難以在同一個文件中包含所有這些代碼,那麼您應該將其移至單獨的文件中。 – BrenBarn

回答

1

鑑於您想要擺脫的重複代碼包含導入,我完全同意BrenBarn的迴應,因爲您不需要多次導入模塊。 對於要在類中的每個測試之前或之後運行相同代碼的一般情況,您應該使用class unittest.TestCase的setUp()和tearDown()方法。

+0

嘿,太棒了!我不知道這些方法。謝謝!只是澄清一下:你說沒有必要多次導入一個模塊。它會甚至有害嗎?我有一個印象,即導入'pandas'模塊兩次,一次在* module *級別,然後在'test_method_2(self)'內部產生很多警告。也許這是因爲這是創建重複的命名空間?很抱歉沒有向您展示測試用例,但今天我正在度假,而且我無法訪問我的工作代碼。 – DeltaIV

+0

PS如果你想知道爲什麼在地球上會導入相同的模塊兩次,那麼這只是一個錯誤:PI在* module *級別添加了導入,然後從所有測試中刪除它,除了我忘記刪除的一個它。 – DeltaIV

+1

我不知道爲什麼在這個例子中你第二次看到很多警告;它按照我的預期工作。如果您想更多地瞭解導入時發生的情況,可以使用選項-v運行python。它會轉儲出大量信息。例如,第一次導入熊貓時,它會顯示大量有關正在導入的其他模塊的信息。第二次導入時,沒有任何反應。即使您導入另一個導入熊貓的模塊,解釋器也會跟蹤導入的模塊並且不會重新導入。更多信息:https://docs.python.org/3/reference/import.html – portusato

相關問題