2012-03-15 78 views
1

我有我的所有unittests文件夾。它們都包括:爲什麼導入*不運行導入的代碼?

if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(suite()) 

所以對它們進行測試我只需要導入測試腳本。我有一個test_all腳本,通過逐個導入它們來完成所有的單元測試。目前,這看起來像這樣:

from pyMS.test import test_baseFunctions 
from pyMS.test import test_compareFeatureXMLmzML 
from pyMS.test import test_config 
from pyMS.test import test_featureFunctions 
from pyMS.test import test_fileHandling 
from pyMS.test import test_mzmlFunctions 
from pyMS.test import test_output 
from pyMS.test import test_parseFeatureXML 
from pyMS.test import test_rFunctions 
from pyMS.test import test_rPlots 
[...] 

這意味着每次添加或刪除新測試時,我都需要更改導入。因此,我想使用

from pyMS.test import * 

但是,這不會運行任何代碼。我很好奇導入*不運行代碼的原因。 此外,如果有人知道一個解決方案(即筆記鼻子)來運行所有的單元測試,而不必一個一個地導入它們會很好。

感謝
NIEK

+5

'if __name__ == __name __:'?我希望你的意思是'if __name__ =='__main __':'? – 2012-03-15 11:24:21

+0

這看起來不是一種運行所有測試的好方法。 – 2012-03-15 11:31:35

+0

woops呀,這就是我的意思 – 2012-03-15 11:32:14

回答

1

如果您使用Python 2.7,你可以使用命令行:

python -m unittest discover 

這會自動查找並在所有子目錄執行所有測試。有關更多選項,請參閱:

python -m unittest -h 

該模塊已經被移植到Python 2.3及以上版本,可以下載here。如果您使用的反向移植有一個附帶的命令行腳本稱爲UNIT2或unit2.py(你的選擇),調用像這樣:

unit2.py discover 

至於from XXX import *,這實際上是在文件的命名空間進口一切XXX/__init__.py。將下面的代碼__init__.py自動加載任何直接的子模塊:

import os 

all_files = os.listdir(os.path.dirname(__file__)) 
modules = [x for x in all_files if x.endswith(".py") and not x.startswith("_")] 
__all__ = [x.rpartition(".")[0] for x in modules] 

如何工作可以在python docs for the __all__ global variable可以找到詳細的解釋。

+0

我知道,可惜必須使用2.6。不過謝謝。 – 2012-03-15 11:34:11

+0

@Niek看到我更新的答案。 – 2012-03-15 11:36:20

1

運行所有測試的最簡單方法(無需使用外部工具)可能使用TestLoader.discover

+1

供參考:這是在python 2.7中添加的。 – 2012-03-15 11:37:43

1

__name__僅設置爲"__main__",以供解釋器讀取的初始python文件。這允許模塊在執行if __name__ == "__main__":之後由其他模塊導入而無需代碼。

任何未受if __name__ == "__main__":保護的代碼都將被執行。因此,您可以在每個文件中刪除它,然後執行導入unittest.TextTestRunner(verbosity=2).run(suite())

更好的方法是使用unittest.TestLoader()中的方法將測試加載到套件中,然後將該套件加載到unittest.TextTestRunner。然後可以使加載程序自動化,而無需更改測試文件中的導入。將測試文件添加到目錄結構中,測試將自動執行。