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

时间:2017-07-10 08:37:16

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

从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将单独输出每个测试,但如果可能的话,我希望与标准库保持兼容。

2 个答案:

答案 0 :(得分:1)

你可以继承public function login($username, $password){ $db = $this->db; //validation $db->select('id, email, username'); $db->where('username', $username); $db->where('password', $password); $db->where('status', 1); $result = $db->get('users')->row_array(); return empty($result['id']) ? false : $result['id']; }

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

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

答案 1 :(得分:0)

使用python 3.5.2,themiurge的answer对我来说不是开箱即用的,但是稍作调整就可以完成我想要的事情。

我必须专门让测试运行者使用此新类,如下所示:

FROM amazonlinux

RUN yum -y install python3 \
    python3-pip \
    shadow-utils

但是,这没有像默认情况下那样将测试失败的详细信息打印到控制台。要恢复此行为,我必须将继承自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