如何在python中自动将测试用例添加到测试套件中

sta*_*005 8 python unit-testing testcase

我在不同的文件夹中有十几个测试用例.在根目录中有一个测试运行器.

unittest\
  package1\
    test1.py
    test2.py
  package2\
    test3.py
    test4.py
  testrunner.py
Run Code Online (Sandbox Code Playgroud)

目前,我手动将四个测试用例添加到测试套件中

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)
Run Code Online (Sandbox Code Playgroud)

如何让测试运行器自动测试所有测试用例?如:

for testCase in findTestCases():
  suite.addTests(testCase)
Run Code Online (Sandbox Code Playgroud)

pyg*_*iel 10

在我看来,你应该切换到unittest2或其他具有发现功能的测试框架.发现测试是运行它们的一种非常理智的方式.

最知名的是:

例如,nosetest足以nosetests从项目根目录运行,它将发现并运行它找到的所有单元测试.很简单.

另请注意,unittest2将包含在python 2.7中(并且我估计会向后移植到2.4).


chr*_*ley 8

上面的模块很好,但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')
Run Code Online (Sandbox Code Playgroud)

如果要将结果添加到日志文件,请在最后添加:

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)
Run Code Online (Sandbox Code Playgroud)

同样在模块的底部,您正在测试这样的地方代码:

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()
Run Code Online (Sandbox Code Playgroud)