как добавить дюжину тестовых сценариев к набору тестов автоматически в Python

у меня есть дюжина тестовых сценариев в различных папках. В корневом каталоге существует исполнитель тестов.

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)
8
задан stanleyxu2005 1 July 2010 в 10:06
поделиться

2 ответа

Вышеупомянутые модули хороши, но 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()
8
ответ дан 5 December 2019 в 09:24
поделиться

На мой взгляд, вам следует переключиться на unittest2 или другие тестовые среды с функциями обнаружения. Discovery-тесты - действительно разумный способ их запустить.

Наиболее известные из них:

Например, с nodetest достаточно запустить nodetests из корневого каталога проекта, и он обнаружит и запустит все модульные тесты. это найти. Довольно просто.

Обратите внимание, что unittest2 будет включен в python 2.7 (и, как мне кажется, будет перенесен на версию 2.4).

10
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: