如果您可以在測試中添加__init__.py
文件,那麼您可以在其中添加一個load_tests
函數來處理髮現。
如果測試包的名稱(與__init__.py
目錄)的 圖案然後包將要「load_tests」函數來檢查匹配。如果 存在,那麼它將被加載器,測試,模式調用。
如果load_tests存在,則發現確實不是遞歸到包中, load_tests負責加載包中的所有測試。
我遠離相信這是最好的方式,但編寫函數的一種方法是:
import os
import pkgutil
import inspect
import unittest
# Add *all* subdirectories to this module's path
__path__ = [x[0] for x in os.walk(os.path.dirname(__file__))]
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for memname, memobj in inspect.getmembers(mod):
if inspect.isclass(memobj):
if issubclass(memobj, unittest.TestCase):
print("Found TestCase: {}".format(memobj))
for test in loader.loadTestsFromTestCase(memobj):
print(" Found Test: {}".format(test))
suite.addTest(test)
print("=" * 70)
return suite
很醜陋,我同意。
首先將所有子目錄添加到測試包的路徑(Docs)。
然後,您使用pkgutil
來尋找軟件包或模塊。
當它找到一個時,它會檢查模塊成員以查看它們是否是類,如果它們是類,那麼它們是否是unittest.TestCase
的子類。如果是,則類中的測試會加載到測試套件中。
所以,現在,從您的項目裏面的根,你可以鍵入
python -m unittest discover -p tests
使用-p
模式開關。如果一切順利的話,你會看到我所看到的,這是一樣的東西:
Found TestCase: <class 'test_tc.TestCase'>
Found Test: testBar (test_tc.TestCase)
Found Test: testFoo (test_tc.TestCase)
Found TestCase: <class 'test_employee.TestCase'>
Found Test: testBar (test_employee.TestCase)
Found Test: testFoo (test_employee.TestCase)
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
這是什麼預期,我的每一個兩個示例文件包含了兩個測試,testFoo
和testBar
每個。
編輯:一些更多的挖掘之後,它看起來像,你可以指定這個功能:
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for test in loader.loadTestsFromModule(mod):
print("Found Tests: {}".format(test._tests))
suite.addTests(test)
它使用loader.loadTestsFromModule()
方法,而不是我上面使用的loader.loadTestsFromTestCase()
方法。它仍然修改tests
軟件包路徑,並讓它尋找模塊,我認爲這是模塊的關鍵。
輸出現在看起來有點不同,因爲我們每次添加一個測試套件發現我們的主要測試套件suite
:
python -m unittest discover -p tests
Found Tests: [<test_tc.TestCase testMethod=testBar>, <test_tc.TestCase testMethod=testFoo>]
Found Tests: [<test_employee.TestCase testMethod=testBar>, <test_employee.TestCase testMethod=testFoo>]
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
但是,我們仍然獲得4次測試,我們預計,在這兩個班,在兩個子目錄中。
你看過http://stackoverflow.com/q/644821/3001761?我認爲其中的一些答案可能會適合您的目的。 – jonrsharpe