我的代码使用unittest
框架运行测试。这是我的一种方法的基本想法:
def _RunTestsList(self, lTestsPaths):
""" Runs all tests in lTestsPaths with the unittest module
"""
for sTestPath in lTestsPaths:
testLoader = unittest.TestLoader()
temp_module = imp.load_source('temp_module', sTestPath)
tstSuite = testLoader.loadTestsFromModule(temp_module)
unittest.TextTestRunner (verbosity=1).run(tstSuite)
我显然想要实现的是运行lTestsPaths
列表中的测试。出于某种原因,它不是单独运行lTestsPaths
中的每个测试,而是在以前运行的所有测试之外运行每个测试。当从代码中的不同位置调用此方法时,也会发生这种情况。也就是说,以前(在以前的调用中)运行的所有测试都将再次运行。
在调试时,我看到当tstSuite
被初始化时,它是用以前运行的所有测试初始化的。
为什么会发生这种情况?如何使此代码按预期运行?
经过几个小时的调试,我找到了问题的根源:问题似乎是temp_module
的名称,也就是说,因为我给所有的临时模块都取了相同的名称。这与内置的dir
方法有关,因为testLoader.loadTestsFromModule(temp_module)
调用的dir
方法返回以前运行的测试对象名称。我不知道为什么,但这就是代码行为的原因。
为了解决这个问题,我在使用模块后从sys.modules
中删除了模块名称:"temp_module"。可能有一种更清洁的方法,但这是有效的。
以下是对我有效的改进代码:
def _RunTestsList(self, lTestsPaths):
""" Runs all tests in lTestsPaths with the unittest module
"""
for sTestPath in lTestsPaths:
testLoader = unittest.TestLoader()
temp_module = imp.load_source('temp_module', sTestPath)
tstSuite = testLoader.loadTestsFromModule(temp_module)
unittest.TextTestRunner (verbosity=1).run(tstSuite)
del sys.modules['temp_module']