测试
单元测试
Python 内置的 unittest 模块用于单元测试。
编写单元测试:
编写单元测试时,我们需要编写一个测试类,并从 unittest.TestCase
继承。在测试类中可以编写多个测试方法(也叫测试用例)。
以 test 开头的方法就是测试方法,不以 test 开头的方法不被认为是测试方法,测试的时候不会被执行。unittest.TestCase
提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。
最常用的断言就是 assertEqual()
:
self.assertEqual(abs(-1), 1) # 断言函数返回的结果与 1 相等
另一种重要的断言就是期待抛出指定类型的 Error,例如通过 d['empty']
访问不存在的 key 时,断言会抛出 KeyError:
with self.assertRaises(KeyError):
value = d['empty']
运行单元测试:
最简单的运行方式是在代码中写unittest.main()
。
if __name__ == '__main__':
unittest.main()
另一种方法是在命令行通过参数 -m unittest
直接运行单元测试:
$ python3 -m unittest testfile1 testfile2 testfile3
这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。
setUp 与 tearDown:
可以在单元测试中编写两个特殊的 setUp()
和 tearDown()
方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。setUp()
方法中进行测试前的初始化工作, tearDown()
方法中执行测试后的清除工作。
例:
import unittest
class My: #待测试类
def sum(self, x, y):
return x + y
def sub(self, x, y):
return x - y
class TestMy(unittest.TestCase): #测试类
#初始化工作
def setUp(self):
self.my = My()
#退出清理工作
def tearDown(self):
pass
#具体的测试用例,一定要以test开头
def test_1(self):
self.assertEqual(self.my.sum(1,2), 3)
#具体的测试用例,一定要以test开头
def test_2(self):
self.assertEqual(self.my.sub(1,2), -1)
if __name__ == '__main__':
unittest.main() #启动测试
测试结果:打印一个点表示一个通过,F表示一个fail.
文档测试
Python 内置的“文档测试”( doctest)模块可以直接提取注释中的代码并执行测试。
doctest 严格按照 Python 交互式命令行的输入和输出来判断测试结果是否正确。
import doctest
class My:
'''
Example:
>>> a = [1,2,3]
>>> a
[1, 2, 3]
'''
pass
if __name__ == '__main__':
doctest.testmod()
如果期望结果和执行结果不一致,则会报错;如果正确,则什么输出也没有。
注:doctest 非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含 doctest 的注释提取出来。用户看文档的时候,同时也看到了 doctest。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论