过多的测试

来源:互联网 发布:淘宝网上怎么进货 编辑:程序博客网 时间:2024/04/29 23:43

作者: 佚名

原文链接:http://googletesting.blogspot.tw/2008/02/in-movie-amadeus-austrian-emperor.html

在电影《莫扎特传》中,奥地利国王评论莫扎特的音乐中有“太多的音符”。对于一个功能来说,怎样的测试算“过多”呢?

我们来看看decide方法:      

public void decide(int a, int b, int c, int d, int e, int f){
if(a > b || c > d || e > f){
DoOneThing();
} else {
DoAnother();
}
}  
//由于空间有限,这里只列举单字符的变量名。
//实际应用时该起些规范的变量名。你们要学习的是我的思想,而不是我举例的代码:-)

我们要做哪些测试?若是要给每个变量都进行赋值,覆盖所有整型的取值范围,那将需要2192次测试,真是个天文数字!这就是过多的测试

怎样才能在执行最少的测试并保证测试的覆盖度呢?只要执行两类测试,就能实现100%的覆盖率,它是大多数代码覆盖度的衡量标准,分别是(a > b || c> d || e > f)为真和假的两种情况。不需要太多的测试就能够发现代码中的大部分bug和无意识的代码改动引起的错误。

要测试逻辑表达式和它们的子表达式需要执行多少测试?如果你在测试decide方法时验证a=b这一情况,可能就会发现子表达式a>b不正确,代码实际实现的是a>=b。此外,验证a<b或a>b也会起到同样的作用。因此比较a、b大小时只需要执行三类测试,对于所有的参数来说,则是需要3*3*3=27类测试。好像还是有点多。

要独立地测试逻辑表达式和它们的子表达式需要执行多少测试?来看看另一个版本的decide方法,逻辑子表达式已被提取出来:

public void decide(int a, int b, int c, int d, int e, int f){
if(tallerThan(a, b)|| harderThan(c, d) || heavierThan(e, f)){
DoOneThing();
} else {
DoAnother();
}
}  
boolean tallerThan(int a, int b) { return a > b; }
boolean harderThan(int c, int d) { return c > d; }
boolean heavierThan(int e, int f) { return e > f; }
//要注意 “package scope”而不是 public; JUnit测试将会接触到这些内容。

我们可以为decide方法执行四类测试。一是tallerThan的值为真,二是harderThan的值为真,三是heavierThan的值为真,四是所有值都为假。为每个提取出来的功能执行两类测试,那么总共需要4+2*3=10类测试。这个数量正正好,能够发现大部分开发代码误操作引起的bug。通过这一方法能够在减少封装的同时增加系统的易测性。学习前文中的Java代码,合理地控制测试范围来进行限制。

怎样的测试算过多?答案是“看情况。”这取决于你在测试执行过程中是否有自信来面对他人的改变。测试用例不仅能发现程序员的代码错误,还能够作为范例或文档。好的测试不宜多,也不宜少
0 0
原创粉丝点击