测试套件 unittest

1 投票
4 回答
4535 浏览
提问于 2025-04-15 18:19

我有一个测试套件,我想让它和我创建的测试一起工作。单独运行这些测试是没问题的,但我想把它们都放在一个测试套件里一起运行。下面的代码展示了我创建的测试套件:

import unittest

def suite():
    modules_to_test = ('TestAbsoluteMove', 'TestContinuousMove') # and so on
    alltests = unittest.TestSuite()
    for module in map(__import__, modules_to_test):
        alltests.addTest(unittest.findTestCases(module))
    return alltests

if __name__ == '__main__':
    unittest.main(defaultTest='suite')

我把这段代码放进我的测试代码里,以便和套件连接起来:

class AbsoluteMoveTestSuite(unittest.TestSuite):

def makeAbsoluteMoveTestSuite():
    suite = unittest.TestSuite()
    suite.addTest(TestAbsoluteMove("BasicAbsolutePan"))
    suite.addTest(TestAbsoluteMove("VerifyAbsolutePan"))
    suite.addTest(TestAbsoluteMove("VerifyAbsoluteTilt"))
    suite.addTest(TestAbsoluteMove("VerifyAbsolutePanSpeed"))
    suite.addTest(TestAbsoluteMove("VerifyAbsoluteTiltSpeed"))
    return suite

def suite():
    return unittest.makeSuite(TestAbsoluteMove)

但是出现了一个错误,提示说找不到名为'TestAbsoluteMove'和'TestContinuousMove'的模块。有没有人知道怎么才能让这段代码正常工作?

谢谢

4 个回答

2

这是我创建测试套件的方法(loadTestFromTestCase会自动检测你的测试)

def suite():
    """ returns all the testcases in this module """
    return TestLoader().loadTestsFromTestCase(AbsoluteMoveTestSuite)

为了能够一次性运行所有测试,我有一个包含所有子套件的总套件(注意所有的导入,你需要在新模块中先导入它们,才能使用)

import sys
import unittest

import test.framework.asyncprocess as a
import test.framework.easyconfig as e
import test.framework.modulegenerator as mg
import test.framework.modules as m
import test.framework.filetools as f
import test.framework.repository as r
import test.framework.robot as robot
import test.framework.easyblock as b
import test.framework.variables as v
import test.framework.github as g
import test.framework.toolchainvariables as tcv
import test.framework.toolchain as tc
import test.framework.options as o
import test.framework.config as c


# call suite() for each module and then run them all
SUITE = unittest.TestSuite([x.suite() for x in [r, e, mg, m, f, a, robot, b, v, g, tcv, tc, o, c]])

# uses XMLTestRunner if possible, so we can output an XML file that can be supplied to Jenkins
xml_msg = ""
try:
    import xmlrunner  # requires unittest-xml-reporting package
    xml_dir = 'test-reports'
    res = xmlrunner.XMLTestRunner(output=xml_dir, verbosity=1).run(SUITE)
    xml_msg = ", XML output of tests available in %s directory" % xml_dir
except ImportError, err:
    sys.stderr.write("WARNING: xmlrunner module not available, falling back to using unittest...\n\n")
    res = unittest.TextTestRunner().run(SUITE)
2

TestAbsoluteMove 是一个类,它需要从某个地方引入。无论你的 AbsoluteMoveTestSuite 类在哪里定义,你都需要导入 TestAbsoluteMove。

2

Nose 让这件事变得非常简单。它会自动找到你的测试并把它们一起运行。(你也可以通过传递一个标志来运行特定的测试。)

撰写回答