如何从TestSuite中提取测试用例列表?

时间:2012-01-25 14:38:03

标签: python unit-testing

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

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

但是,我希望在套件收集后对每个测试做一些自定义的事情。我以为我可以做这样的事情来迭代套件中的测试用例:

print suite.countTestCases()
for test in suite:             # Also tried with suite.__iter__()
    # Do something with test
    print test.__class__

但是,对于我加载的测试用例数量,它只会打印

3
<class 'unittest.suite.TestSuite'>

有没有办法可以从套件中获取TestCase类的所有对象?还有其他方法我应该加载测试用例来促进这个吗?

4 个答案:

答案 0 :(得分:5)

尝试

  for test in suite:
    print test._tests

答案 1 :(得分:2)

我使用此函数作为suite._tests中的一些元素本身就是套件:

def list_of_tests_gen(s):
  """ a generator of tests from a suite

  """
  for test in s:
    if unittest.suite._isnotsuite(test):
      yield test
    else:
      for t in list_of_tests_gen(test):
        yield t

答案 2 :(得分:1)

获取测试列表的一种巧妙方法是使用nose2 collect插件。

$ nose2 -s <testdir> -v --plugin nose2.plugins.collect --collect-only 
test_1 (test_test.TestClass1)
Test Desc 1 ... ok
test_2 (test_test.TestClass1)
Test Desc 2 ... ok
test_3 (test_test.TestClass1)
Test Desc 3 ... ok
test_2_1 (test_test.TestClass2)
Test Desc 2_1 ... ok
test_2_2 (test_test.TestClass2)
Test Desc 2_2 ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.001s

OK

它并没有真正运行测试。

您可以像这样安装nose2(以及它的插件):

$ pip install nose2

当然你可以使用nose2来运行单元测试,例如喜欢这个或这个:

# run tests from testfile.py
$ nose2 -v -s . testfile

# generate junit xml results:
$ nose2 -v --plugin nose2.plugins.junitxml -X testfile --junit-xml 
$ mv nose2-junit.xml results_testfile.xml

答案 3 :(得分:0)

Here 是最近提交给 Django 的一个内部帮助函数,它允许迭代测试套件的测试用例:

from unittest import TestCase

def iter_test_cases(suite, reverse=False):
    """Return an iterator over a test suite's unittest.TestCase objects."""
    if reverse:
        suite = reversed(tuple(suite))
    for test in suite:
        if isinstance(test, TestCase):
            yield test
        else:
            # Otherwise, assume it is a test suite.
            yield from iter_test_cases(test, reverse=reverse)

需要这种方法,因为测试套件可以任意深度嵌套。