软件构造的第二章-测试与测试优先的编程,介绍了软件测试的概念、设计测试用例的方法、测试的一些策略和一些测试用的工具。主要包括图中的内容:
(一)软件测试
发现错误但不能证明无错误,包括静态测试(观察代码等)和动态测试(结合程序运行过程)。与调试(debug)相比,调试偏向于寻找错误根源并排除,而测试则是检查发现是否发生错误。
软件测试也可分为黑盒测试和白盒测试,黑盒针对行为,而白盒针对代码结构。
(二)测试用例
测试用例由输入、执行条件、预期结果三部分组成,一个好的测试用例需要满足:最能查错、不重复不冗余、最有效、不简单也不复杂的条件。
(三)测试优先编程
先写规约,再写测试用例,最后写出代码并进行测试与修改,这样的步骤符合测试优先编程。
(四)单元测试
隔离各模块,针对最小单元模型展开测试。
(五)JUnit
JUnit是一个被广泛使用的java测试框架,能够根据被测试的类的结构自动生成测试用例。所生成的测试类的每个测试方法前都有@Test作为标识,一般测试方法用assertEquals来判断,第一个参数是期望结果,第二个则是实际结果。
(六)黑盒测试
黑盒测试是把被测试者的具体实现全部忽略,只关注最基本的代码功能,根据规约来编写。
(1)通过划分选择测试用例
等价类划分:将被测方法的所有输入可能性按照一定规则划分为数个等价类,并依据等价类编写测试用例,比如输入奇数,则可以划分为:正奇数,负奇数,以及不符合要求的输入。对于部分特殊的输入,比如0,+-1,空串等,在有需要时可单独进行判断。
(2)在划分中考虑边界
许多错误发生在输入域的边界,边界值分析法可以作为等价类划分的补充。
(3)覆盖划分的两个端点
笛卡尔积覆盖:不同维度划分的多个取值要结合起来,每个组合一个用例,测试完备,代价高。
覆盖每个取值:每个维度的每个取值至少被测试用例覆盖一次即可,代价低,覆盖度未必高。
(七)白盒测试
根据代码的具体实现来编写测试用例。对程序的基本执行路径进行等价类划分,测试用例要使得每个基本路径至少被覆盖一次。
(八)测试覆盖度
一般指测试用例对代码的覆盖度,而代码覆盖度又包括函数、语句、条件、分支和路径覆盖。效果上路径>分支>语句,而测试难度上也是如此。
(九)自动测试与回归测试
JUnit框架可以帮助建立自动测试。回归测试则是指在进行程序的修改后,要将所有测试重新执行。
(十)测试策略
测试策略要在程序中显式地记录出来,便于他人理解自己的测试用例,一般在程序中用"/*****/"来表示出来,其中记录着测试用例如何划分输入并进行覆盖,以及其他的一些补充说明。