我正在使用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类的所有对象?还有其他方法我应该加载测试用例来促进这个吗?
答案 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)
需要这种方法,因为测试套件可以任意深度嵌套。