78. python如何进行单元测试

在上一节中我们事先了数字反转函数revert(), 但如果确保它的实现是正确的呢?这就需要单元测试。

在Python中,有一个名为unittest模块实现了一个单元测试框架,它和CUnit,JUnit等测试框架非常类似。

unittest模块提供了一个main()函数,它负责测试程序的启动入口。 它的原型如下:

unittest.main(module='__main__', defaultTest=None, argv=None, testRunner=None,
    testLoader=unittest.defaultTestLoader, exit=True, verbosity=1, failfast=None,
    catchbreak=None, buffer=None, warnings=None)

它从模块加载一组测试并运行它们; 这主要是为了让测试模块方便地执行。这个函数最简单的用法是在 测试脚本的末尾包含以下行:

if __name__ == '__main__':
    unittest.main()

最常见的是TestCase类,它就代表着unittest中的逻辑测试单元。它作为基类,具体的子类实现特定的测试。 这个类实现了测试运行所需要的接口,以允许它驱动测试,以及测试代码可以用来检查和报告各种故障的方法。

TestCase类提供了三组方法:一组用于运行测试,另一组用于检查条件和报告失败,以及一些允许收集关于测试本身的信息的查询方法。

检查条件和报告失败的方法有:

  • assertEqual 测试第一个参数和第二个参数是否相等。如果值不相等,则测试将失败。

  • assertNotEqual 测试第一个参数和第二个参数是否相等。如果值相等,则测试将失败。

  • assertIn 测试第一个参数是否在第二个里面, 如果不在,则测试将失败。

常见的就这几个。

我们采用该框架对revert函数进行测试。代码如下:

class TestRevertFunc(unittest.TestCase):
    """Test revert"""

    def test_revert(self):
        """Test method add(a, b)"""
        self.assertEqual(321, revert(123))
        self.assertEqual(-321, revert(-123))
        self.assertEqual(21, revert(120))
        self.assertEqual(0, revert(0))
        self.assertEqual(1, revert(1))
        self.assertEqual(-1, revert(-1))

if __name__ == '__main__':
    unittest.main()

执行测试就可以看到程序结果,unittest优势是只需编写很少的代码即可对函数接口进行测试,并且某一个测试 失败也能找到具体的测试用例。