PyUnit 配置可变数量的测试

3 投票
3 回答
878 浏览
提问于 2025-04-16 00:33

我想做的是创建一个文件夹,大家可以把测试文件放进去,然后让pyunit自动扩展,运行每个文件作为一个单独的测试。目前,我的做法是:

class TestName(unittest.testcase):
    def setUp(self):
        for file in os.listdir(DIRECTORY):
            # Setup Tests

    def test_comparison(self):
        for file in os.listdir(DIRECTORY):
            # Run the tests

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName),
])

if __name__ == "__main__":
    unittest.TextTestRunner(verbosity=2).run(suite())

显然,这样做有很多问题,比如如果有任何一个测试失败,整个测试就会失败等等。我想要的,是设置pyunit,让它能对放在这个文件夹里的每个文件都运行一个测试(或者一个测试用例)。现在,我在想我可以创建上面提到的那个类,里面只包含两个方法,但为了成功做到这一点,我需要添加一个上下文参数,比如:

def setUp(self, filepath):
    # Do stuff

然后我可以把循环放在主代码块里,这样运行测试:

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName, file),
])

if __name__ == "__main__":
    for file in DIRECTORY:
        unittest.TextTestRunner(verbosity=2).run(suite(file))

但我不太确定怎么做,而不需要几乎重写整个unittest.TestCase()类。有没有什么方法可以做到这一点,或者有没有其他方法可以根据文件夹里有多少个文件,动态扩展测试/测试用例的集合?谢谢。

3 个回答

0

你可以使用testscenarios这个模块,像这样操作:

class MyTest(unittest.TestCase):

    scenarios = [os.listdir(sys.path[0])]

    ...
2

好的,我想我找到了我问题的答案。我本来以为我在使用全局命名空间,但不知道为什么,我对命名空间的理解完全不管用了。

class TestImage(unittest.TestCase)
    pass #Do stuff, as well as using the filename variable

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestImage),
])

if __name__ == "__main__":
    for filename in os.listdir(sys.path[0]):
        unittest.TextTestRunner(verbosity=2).run(suite())

这段代码会对目录中的每个文件名(还有文件夹名)运行一个测试案例。不过,我不太明白为什么我可以在单元测试类中使用文件名。这肯定和那些宏加载和运行这个类的方式有关。

2

你可以使用 nose 来支持 测试生成器。这看起来大概是这样的:

def test_comparison():
    for file in os.listdir(DIRECTORY):
        yield run_cmp_test, file

def run_cmp_test(file):
    # Run the tests

另外,你也可以在 py.test 中使用 funcargs

撰写回答