我想在树中加载所有单元测试,可以这样做吗?

时间:2009-02-18 18:44:56

标签: python unit-testing

我有一个充满Python单元测试的heirarchical文件夹。它们都是可导入的“.py”文件,用于定义TestCase对象。此文件夹包含许多嵌套子目录中的数千个文件,并由其他人编写。我无权更改它,我只需要运行它。

我想生成一个包含该文件夹中所有TestCase的TestSuite对象。有一种简单而优雅的方法吗?

由于

3 个答案:

答案 0 :(得分:4)

nose 应用程序可能对您有用,可以直接使用,也可以显示如何实现它。

http://code.google.com/p/python-nose/似乎是主页。

基本上,您要做的是走源树(os.walk),使用imp.load_module 要加载模块,请使用unittest.defaultTestLoader将测试从模块加载到TestSuite,然后以任何方式使用它来使用它。

或者至少这与我在自定义TestRunner实施中所做的大致相同 (bzr get http://code.liw.fi/coverage-test-runner/bzr/trunk)。

答案 1 :(得分:2)

查看unittest.TestLoader(https://docs.python.org/library/unittest.html#loading-and-running-tests

和os.walk(https://docs.python.org/library/os.html#files-and-directories

您应该能够使用TestLoader遍历您的包树,以构建一个可以运行的套件。

有些事情。

runner = unittest.TextTestRunner()
superSuite = unittest.TestSuite()
for path, dirs, files in os.walk( 'path/to/tree' ):
    # if a CVS dir or whatever: continue
    for f in files:
        # if not a python file: continue
        suite= unittest.defaultTestLoader.loadTestsFromModule( os.path.join(path,f)
        superSuite .addTests(suite ) # OR runner.run( suite)
runner.run( superSuite )

您可以简单地在每个测试中运行树(runner.run(suite),您可以累积所有单个套件中的superSuite并将整个质量作为单个套件运行测试(runner.run( superSuite ))。

您不需要同时执行这两项操作,但我在上述(未经测试的)代码中包含了两组建议。

答案 2 :(得分:1)

Python Library source的测试目录显示了方式。 README文件描述了如何为库模块编写Python回归测试。

regrtest.py module以:

开头
"""Regression test.

This will find all modules whose name is "test_*" in the test
directory, and run them.