【问题标题】:Count subtests in Python unittests separately分别计算 Python 单元测试中的子测试
【发布时间】:2017-07-10 08:37:15
【问题描述】:

自 3.4 版起,Python supports a simple subtest syntax when writing 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 ...),以获得完整的图片。

这在 Python 中使用普通的 unittest 模块是否可能? The nose test generator feature 会分别输出每个测试,但我希望尽可能与标准库保持兼容。

【问题讨论】:

    标签: python unit-testing python-unittest parameterized-unit-test


    【解决方案1】:

    你可以继承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())
    

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

    【讨论】:

      【解决方案2】:

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

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2013-09-27
        相关资源
        最近更新 更多