自动获取python中的单元测试用例

时间:2014-02-18 06:06:12

标签: python python-unittest

我正在使用Python的unittest和简单的代码:

suite = unittest.TestSuite()
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(module1))
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(module2))

我希望我的测试套件能够自动解析所有模块并搜索我们编写的所有单元测试用例文件? 例如。

有5个文件,

1)。 f1.py

2)。 f2.py

3)。 f3.py

4)。 f4.py

5)。 f5.py

我们不知道这个文件中的哪个是单元测试用例文件。我想要一种方法来解析每个文件,并且只返回具有单元测试用例的模块的名称

注意: - 我使用的是python 2.6.6,因此无法真正使用unittest.TestLoaded.discover()

2 个答案:

答案 0 :(得分:2)

考虑使用nose工具,它会彻底改变您的单位测试寿命。您只需在源文件夹根目录中运行它,如:

> nosetests

然后它会自动查找所有测试用例。

如果您还想运行所有doctests,请使用:

> nosetests --with-doctest

如果您只想以编程方式查找模块列表,nose会提供一些API(遗憾的是,不如TestLoader.discover()那么方便)。

更新:我刚刚发现(双关语)有一个名为unittest2的库,它将所有后来的unittest功能向后移植到早期版本的Python中。我会为考古学家保留下面的代码,但我认为unittest2是一种更好的方法。

import nose.loader
import nose.suite
import types

def _iter_modules(tests):
    '''
    Recursively find all the modules containing tests.
    (Some may repeat)
    '''
    for item in tests:
        if isinstance(item, nose.suite.ContextSuite):
            for t in _iter_modules(item):
                yield t
        elif isinstance(item.context, types.ModuleType):
            yield item.context.__name__
        else:
            yield item.context.__module__

def find_test_modules(basedir):
   '''
   Get a list of all the modules that contain tests.
   '''
   loader = nose.loader.TestLoader()
   tests = loader.loadTestsFromDir(basedir)
   modules = list(set(_iter_modules(tests)))  # remove duplicates
   return modules

答案 1 :(得分:0)

使用unittest库的discovery功能:

$ python -m unittest discover --start-directory my_project