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优势是只需编写很少的代码即可对函数接口进行测试,并且某一个测试 失败也能找到具体的测试用例。