《重构》学习笔记(03)-- 构建测试体系
2019-05-26 本文已影响0人
若隐爱读书
如果你想进行重构,首先的前提就是拥有一个可靠的测试环境。就算是自动进行重构的工具,也需要测试来保证代码的完整性与可靠性。
为什么需要单元测试?
- 保证质量:随着迭代的过程,开发人员很难记清所有的功能点。功能点的新增和删除在代码改变后,进行回归测试时,依靠手工测试很容易出错遗漏。
- 自动化:测试用例有一次编写,无限使用的特点。相对于人工测试,单元测试几乎无需交接,并在QA进行测试时可以反复使用。
- 特性文档:单元测试可以作为描述和记录代码所实现的所有需求,有时候可以作为文档来使用,了解一个项目可以通过阅读测试用例比看需求文档更清晰。
- 驱动开发,指导设计:代码被测试的前提是代码本身的可测试性,那么要保证代码的可测试性,就需要在开发中注意API的设计,TDD将测试前移就是起到这么一个作用。
怎样进行单元测试?
书中介绍的JUnit是针对JAVA开发的一款简洁高效的测试框架,但笔者目前从事前端开发工作,因此本段不做详细介绍。从事JQuery开发的同学可以使用QUnit进行单元测试,参考QUnit入门教程。
要做什么单元测试?
单元测试任务包括:1 模块[接口测试];2 模块局部数据结构测试;3 模块边界条件测试;4 模块中所有独立执行通路测试;5 模块的各条错误处理通路测试。
正常输入。例如字符串的Trim函数,功能是将字符串前后的空格去除,那么正常的输入可以有四类:前面有空格;后面有空格;前后均有空格;前后均无空格。
边界输入。上例中空字符串可以看作是边界输入。再如一个表示年龄的参数,它的有效范围是0-100,那么边界输入有两个:0和100。
非法输入。非法输入是正常取值范围以外的数据,或使代码不能完成正常功能的输入,如上例中表示年龄的参数,小于0或大于100都是非法输入,再如一个进行文件操作的函数,非法输入有这么几类:文件不存在;目录不存在;文件正在被其他程序打开;权限错误。
但是“任何测试都不能证明一个程序没有bug”。因此单元测试不必做到大而全,应该集中在可能出错的地方。总之,引入测试的目的就是"花合理的时间抓出大多数bug",而不是"穷尽一生抓出所有的bug"。