8

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

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()

运行测试时,输出将是

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

然而,在我的真实世界用例中,子测试将依赖于更复杂的迭代,并检查每个子测试非常不同的东西。因此,我宁愿计算每个子测试并将其列为输出中的一个单独的测试用例(Ran 6 tests in ...在本例中),以获得完整的画面。

unittest在 Python 中的普通模块有可能吗?鼻子测试生成器功能将单独输出每个测试,但如果可能的话,我希望与标准库保持兼容。

4

2 回答 2

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

然后在NumbersTest覆盖run函数:

def run(self, test_result=None):
    return super(NumbersTest, self).run(NumbersTestResult())

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

于 2017-07-10T09:24:35.100 回答
1

使用 python 3.5.2,themiurge 的答案对我来说不是开箱即用的,但稍微调整一下就可以做到我想要的。

我必须专门让测试运行程序使用这个新类,如下所示:

if __name__ == '__main__': 
    unittest.main(testRunner=unittest.TextTestRunner(resultclass=NumbersTestResult))

但是,这并没有像默认情况下那样将测试失败的详细信息打印到控制台。要恢复这种行为,我必须将NumbersTestResult继承自的类更改为unittest.TextTestResult.

class NumbersTestResult(unittest.TextTestResult):
    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
于 2019-07-17T09:55:05.510 回答