我想现在应该到饮水机边上去说了,但是等等,我不是怀疑代码中有什么缺陷呢?认真检查清单 5 会发现,如果 condition 为 false,那么第 13 行确实会抛出 NullPointerException。Yeesh,这儿发生了什么?
这表明行覆盖的确不能很好地指示测试的有效性。
路径的恐怖
在清单 7 中,我定义了另一个包含 indirect 的简单例子,它仍然有不能容忍的缺陷。请注意 branchIt() 方法中 if 条件的后半部分。(HiddenObject 类将在清单 8 中定义。)
清单 7. 这个代码足够简单
package com.vanward.coverage.example02;
import com.acme.someotherpackage.HiddenObject;
public class AnotherBranchCoverage {
public void branchIt(int value){
if((value > 100) || (HiddenObject.doWork() == 0)){
this.dontDoIt();
}else{
this.doIt();
}
}
private void dontDoIt(){
//don't do something...
}
private void doIt(){
//do something!
}
}
呀!清单 8 中的 HiddenObject 是有害的。与清单 7 中一样,调用 doWork() 方法会导致 RuntimeException:
清单 8. 上半部分!
package com.acme.someotherpackage.HiddenObject;
public class HiddenObject {
public static int doWork(){
//return 1;
throw new RuntimeException("surprise!");
}
}
但是我的确可以通过一个良好的测试捕获这个异常!在清单 9 中,我编写了另一个好的测试,以图挽回我的超级明星光环:
文章来源于领测软件测试网 https://www.ltesting.net/