分别计算Python单元测试中的子测试

Dir*_*irk 7 python unit-testing parameterized-unit-test python-unittest

从3.4版开始,Python 在编写unittests时支持简单的subtest语法。一个简单的示例如下所示:

import unittest

class NumbersTest(unittest.TestCase):

    def test_successful(self):
        """A test with subtests that will all succeed."""
        for i in range(0, 6):
            with self.subTest(i=i):
                self.assertEqual(i, i)

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

运行测试时,输出为

python3 test_foo.py --verbose
test_successful (__main__.NumbersTest)
A test with subtests that will all succeed. ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Run Code Online (Sandbox Code Playgroud)

但是,在我的实际用例中,子测试将取决于更复杂的可迭代项,并检查每个子测试有很大不同的内容。因此,我宁愿对每个子测试进行计数并将其作为单独的测试用例列出在输出中(Ran 6 tests in ...在此示例中),以获取完整的图片。

使用unittestPython中的普通模块是否可以通过某种方式实现?鼻子测试生成器功能将分别输出每个测试,但是如果可能的话,我希望与标准库保持兼容。

the*_*rge 3

你可以子类化unittest.TestResult

class NumbersTestResult(unittest.TestResult):
    def addSubTest(self, test, subtest, outcome):
        # handle failures calling base class
        super(NumbersTestResult, self).addSubTest(test, subtest, outcome)
        # add to total number of tests run
        self.testsRun += 1
Run Code Online (Sandbox Code Playgroud)

然后在NumbersTest重写run函数中:

def run(self, test_result=None):
    return super(NumbersTest, self).run(NumbersTestResult())
Run Code Online (Sandbox Code Playgroud)

抱歉,我现在无法在完全工作的环境中对此进行测试,但这应该可以解决问题。