除了当前添加的测试之外,unittest.TestSuite还运行以前加载的测试

时间:2013-12-12 07:49:20

标签: python python-2.6 test-suite python-unittest

我的代码使用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时,它会被所有先前运行的测试初始化​​。

为什么会这样?如何使代码按预期运行?

1 个答案:

答案 0 :(得分:1)

经过多个调试时间后,我找到问题的根源:问题似乎是temp_module的名称,也就是说,因为我给所有临时模块指定了相同的名称。这与内置dir方法有关,因为dir方法调用testLoader.loadTestsFromModule(temp_module)方法返回之前运行的测试对象名称。我不确定为什么,但这是代码行为的原因。

为了解决这个问题,我在使用模块后从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']