测试¶
测试分为 单元测试、组件测试、系统测试、性能测试,逐级上升。
所谓的测试驱动开发(TDD:Test-Driven Development),就是说每写完一个小功能,就要做一个完整的单元测试,每次进行改动以后都要进行一次单元测试,以确保功能正常。
每个单元测试都通过以后就可以进行组件测试,所有组件测试都通过就可以进行系统测试,系统测试通过就可以进行性能测试,性能测试类似于“烤机”,测试系统的最大承受能力,承受峰值等等。
单元测试¶
单元测试就是对一个模块、一个函数或者一个类进行正确性检验的检测工作 举个栗子:
对一个求绝对值函数 abs(num),可以编写一下几个测试用例:
- 输入正数 如
1、4.1、5.9,期待返回正整数1、4.1、5.9 - 输入负数 如
-1.5、-3.7、20,期待返回正整数1.5、3.7、20 - 输入
0,期待返回0 - 输入非数值类型 如
None、[]、{},期待抛出TypeError。
将上面4个测试用例放到一个测试模块里,就是一个完整单元测试。
单元测试能通过了,说明这个函数功能正常,如果不通过,要么函数有问题,要么测试用例有问题。
所以要修复直到单元测试能够通过。
这样做的好处是,如果我们对abs()做了修改,只要再进行一次单元测试,可以通过,就说明修改没有影响函数的功能。如果不通过则要找出问题,修改到通过单元测试为止。极大程度上确保该模块行为仍然是正确的。
文档测试¶
一个函数、模块、类的第一个匿名字符串,就是文档。如
文档的内容可以作为测试集来进行测试。
- 第一步:编写文档。文档中
>>>的行会被执行,这与在交互模式下执行语句的相同的。 - 第二步:
if __name__ == '__main__': import doctest; doctest.testmod() - 第三步:运行文件
例如上面的绝对值函数abs()可以这样写
文档中以
>>> 表示测试用例,并在下行写出结果。如果测试结果正确,则什么也不会输出。
小结¶
doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest。
Unittest¶
- 环境搭建:Python已内置Unittest框架,直接
import unittest - 四大组件:
- test fixture:
setUp(前置条件)、tearDown(后置条件),用于初始化测试用例及清理和释放资源 - test case:测试用例,通过继承
unittest.TestCase实现用例的继承。在Unittest中,测试用例都是通过test前缀或后缀来识别的。def test_xxx(self)、def xxx_test(self) - test suite:测试套件,即测试用例的集合。
- test runner:运行器,一般通过
runner来调用suite去执行测试。
- test fixture:
- 运行机制:通过在main函数中,调用
unittest.main()运行所有内容