《单元测试之Junit》这本书是程序员三部曲中的第二部,第一部是讲程序的版本管理及CVS使用,第三部则是应用程序的发布、部署及监控。这三部虽然我只看了这第二部,但我从这部简洁易懂但又注重实用的讲解中感觉到其余两部一定也是上乘之作,但愿有机会能够再次拜读。
昨天和老婆一起去拱北的文华书城看书,发现了这本书,一直都想读一下,于是就有这篇感想。因为很多关于Junit的资料在网上应有尽有,我也没必要再解释诸多概念,不然还不如Ctrl+C,Ctrl+V来得有效率。好了,言归正传,现在就说说咱的收获,也许很多程序员朋友和我一样,对单元测试的内容和范围老是有些困惑,究竟哪些内容是单元测试的内容,单元测试的范围究竟有多大,测到怎么样才算做完单元测试。下面就把我看书的一些心得与大家共享。
实际上,单元测试涉及的内容可以归纳为:Right-BICEP,具体的英语全名不想太多解释,主要就是指在以下六个方面:
1.Right 指验证结果的正确性
这一点我们都明白,就是看结果是否正确,没什么好说的。
2.B 指的是边界条件的验证
边界条件就是指边界情况或是模糊情况下的测试,这里大致包括七点,也可以以一个英文单词CORRECT来记忆
C(Conformance):指的是一致性验证,就是值是否与预期值一致
O(Ording):指的是顺序性验证,就是值的顺序是否预期一致
R(Range):指的是区间性验证,就是值是否位于合理的最小值和最大值之间
R(Rerference):指的是依赖性验证,就是验证代码是否引用了不在代码本身控制范围之内的外部资源
E(Existence):指的是存在性验证,就是值是否存在(包括是否是非null,非0,或是集合中的一个元素等)
C(Cardinatity):指的是基数性验证,就是结果是否恰好有足够的值
T(Time):指的是时间性验证,就是指事件发生是否有序,是否在正确的时刻发生,是否及时,包括绝对时间和相对时间的验证,以及并发性考虑
3.I 指的是反向关联
关联就是类间,功能间,操作间的关联关系的验证,这个也常见。比如比较常见的反向逻辑验证,如用平方的结果验证计算平方根;或者用查数据库中是否增加了数据来验证是否插入成功等。
4.C 指的是交叉检查
交叉检查就是指计算一个量有多种算法或方法得到,而我们用多种算法来同时验证这个量的正确性。有时也指用一种量来检查另一种检查。举个最简单的例子,我们要验证2的平方是4,我们可以用2*2=4来验证,也可以用2*2*2*2*2开平方来验证。(例子似乎有点问题,但意思应该能理解吧。请见谅)
5.D 指的是错误条件的验证
这一点实际上是让我们强制引发错误,来测试代码如何处理真实世界里可能会出现的问题。比如内存耗光、磁盘满、时钟问题、网络问题、系统过载、调色板有限或显示屏分辨率过高或过低等问题,需要我们事先模拟并强制引发此类错误来验证代码的健壮性。
6.P 指的是性能特性
性能特性与性能本身不同,系统的性能不是单元测试需要过多关注的问题,而性能特性指的是性能的一种发展趋势。比如我们测过插入一条数据到数据库要0.01秒,插10条要0.03秒,我们可以估计测试出插入数据的条数增大对性能的影响,以考虑是否改进代码。有一个工具能帮助我们测试这一点,JunitPerf。
除开以上几点是单元测试的必要内容外,我还想提一点,我们常常在单元测试中想模拟一些诸如网络连接、数据库故障之类的测试,但如果用真实的环境往往效率低下且环境复杂,此书推荐一个叫Mock的东东来帮助我们更好地完成此类测试。
单元测试一直是自己的软肋,从书上学到不少的东西,但还需要用到项目中去,特书此篇,自我勉励,堪以共赏。