书中介绍了6个值得测试的具体部位,统称为Right-BICEP。分别为:Right:结果是否正确;B:是否所有的边界条件都是正确的;I:能查一下反向关联吗;C:能用其他手段交叉检查一下结果吗;E:是否可以强制错误条件发生;P:是否满足性能要求。
1.边界条件(详见下文CORRECT边界条件):找边界条件是单元测试中最有意义的工作之一,因为bug普遍出现在边界上。
2.反向关联:同时编写原方法和反向测试时,一些bug可能会被两个函数中都出现的错误所掩盖。在可能的情况下,应该使用不同的原理来编写反向测试。
3.交叉检查:通常计算一个量会有一种以上的算法。程序员机遇运行效率或其他的特性来选择算法。在测试中,可以使用剩下的一个来交叉测试结果。当确实存在一种经过验证并能完成任务的算法,只是由于速度太慢或者灵活性差没有在产品代码中使用,这种交叉检查的技术非常有效。
CORRECT边界条件:
1.一致性(conformance):当期望的或产生的数据必须符合某种特定的格式;
2.有序性(ordering):考虑数据的顺序或者在一个很大的数据集合中某一数据的位置。
3.区间性(range):一个变量所属的类型的取值范围比正常需要或者想要的更加宽广。在一个好的面向对象设计中,通常不会使用一个原生类型(如int和Integer)来存储一个具有边界的值。
4.引用/耦合性(reference):对于类的状态、其他对象的状态等需要做一些假设,程序员就需要对代码进行测试,保证在假设未满足的情况下运行良好。
5.存在性(existence):面对一些不存在的数据,Java库的许多方法会抛出某种异常,但是要调试一个隐藏在库深处的运行期异常很困难。常见的陷阱在—null、0、空字符串和其他存在性相关问题。
6.基数性(cardinality):这里的基数主要强调的是计数,偶发性的计数错误会非常严重。所以必须要检查测试函数是否能正确计数,并且检查最后的计数值。
7.时间性(time):要充分考虑与时间相关的问题——相对时间(时间上的顺序)、绝对时间(消耗的时间和钟表上的时间)、并发问题。其中,相对时间还包括代码中的超时问题。但是最棘手的是并发访问和同步访问问题。书中明确指出:编写的大多数代码,将运行在多线程的环境中。
通过学习这本书,我对单元测试有了更深的理解和认识。单元测试是一个充满挑战和能够提升个人能力的任务和工作,里面的知识也是很多而且复杂的。但是同时单元测试在项目中非常重要。让我进一步认识单元测试的作用,和底层的工作原理,我会认真学习,不断提升自己的个人能力,强化学习测试技术,为以后的学习和工作打好基础。