у меня есть дюжина тестовых сценариев в различных папках. В корневом каталоге существует исполнитель тестов.
unittest\
package1\
test1.py
test2.py
package2\
test3.py
test4.py
testrunner.py
В настоящее время я добавлял эти четыре тестовых сценария вручную в набор тестов
import unittest
from package1.test1 import Test1
from package1.test2 import Test2
from package2.test3 import Test3
from package2.test4 import Test4
suite = unittest.TestSuite()
suite.addTests(unittest.makeSuite(Test1))
suite.addTests(unittest.makeSuite(Test2))
suite.addTests(unittest.makeSuite(Test3))
suite.addTests(unittest.makeSuite(Test4))
result = unittest.TextTestRunner(verbosity=2).run(suite)
if not result.wasSuccessful():
sys.exit(1)
Как позволить исполнителю тестов протестировать все тестовые сценарии автоматически? Такой как:
for testCase in findTestCases():
suite.addTests(testCase)
Вышеупомянутые модули хороши, но NoseTests может быть забавным при попытке ввести параметры, и это также быстрее и хорошо вписывается в другой модуль.
import os, unittest
class Tests():
def suite(self): #Function stores all the modules to be tested
modules_to_test = []
test_dir = os.listdir('.')
for test in test_dir:
if test.startswith('test') and test.endswith('.py'):
modules_to_test.append(test.rstrip('.py'))
alltests = unittest.TestSuite()
for module in map(__import__, modules_to_test):
module.testvars = ["variables you want to pass through"]
alltests.addTest(unittest.findTestCases(module))
return alltests
if __name__ == '__main__':
MyTests = Tests()
unittest.main(defaultTest='MyTests.suite')
Если вы хотите добавить результаты в файл журнала, вместо этого добавьте это в конце:
if __name__ == '__main__':
MyTests = Tests()
log_file = 'log_file.txt'
f = open(log_file, "w")
runner = unittest.TextTestRunner(f)
unittest.main(defaultTest='MyTests.suite', testRunner=runner)
Также в нижней части тестируемых модулей разместите следующий код:
class SomeTestSuite(unittest.TestSuite):
# Tests to be tested by test suite
def makeRemoveAudioSource():
suite = unittest.TestSuite()
suite.AddTest(TestSomething("TestSomeClass"))
return suite
def suite():
return unittest.makeSuite(TestSomething)
if __name__ == '__main__':
unittest.main()
На мой взгляд, вам следует переключиться на unittest2 или другие тестовые среды с функциями обнаружения. Discovery-тесты - действительно разумный способ их запустить.
Наиболее известные из них:
Например, с nodetest достаточно запустить nodetests
из корневого каталога проекта, и он обнаружит и запустит все модульные тесты. это найти. Довольно просто.
Обратите внимание, что unittest2 будет включен в python 2.7 (и, как мне кажется, будет перенесен на версию 2.4).