之前我学习了BUG的定义,即Fault、Error、Failure。
然而新的问题出现了:
1、应该如何确定代码中的缺陷代码为Fault?
2、如何断定这个中间状态为错误中间状态即Error?
3、如何判定输出的状态为Failure?这个其实会相对简单点,若有一个正确的规格文档,可以通过规格文档中的预期输出和输出状态做比较,这样就可以判定是否是Failure。
那么该怎样来确定Fault呢?
听课的时候有这样一个例子可以作为理解的源泉。
int max(int x, int y){
int max = x;
if(x > y)
max = y;
return max;
}
input: 3 5
output max: 3 Failure
这是一个求两个数中比较大的数的一段代码,不难发现这个代码是存在错误的:
不难发现解决办法:
即将第3行 if(x > y) 修复成 if(x < y),会发现程序的输出结果正确。
int max(int x, int y){
int max = x;
if(x < y)
max = y;
return max;
}
input: 3 5
output: 5 Pass
但是不同的程序员,解决的办法可能不同,会发现以下这种办法也可以修复代码:
即将第2行 int max = x; 修复成 int max = y;
将第4行 max = y; 修复成 max = x;
这样程序会变成:
int max(int x, int y){
int max = y;
if(x > y)
max = x;
return max;
}
input: 3 5
output: 5 Pass
以上这两种修复办法,使得修复之后的程序结果从Failure变成Pass,说明修复之前的代码行为为Fault。
那么问题就来了,到底是第3行是Fault,还是第2行和第4行是Fault?
修复了第3行或者第2、4行都是Failure变成Pass,只因为修复不同,所以带来的Fault是不一样的。因此这两种办法都找出了自己对应Fault。
我们一般都会有一种倾向,更倾向于第一种:即第三行为Fault,因为程序员一般认为一个极小的修复更像一个Fault,而对于对整个程序变动很大的修复看起来并不像一个Fault。
那么什么是Fault呢?他是静态存在于代码之中,还是要通过测试、修复等一些操作来动态的确定?上面例子中可以看出Fault应该是后者。但是这样又会遇到新的问题,如以下代码(还是上面的例子):
int max(int x, int y){
int max = x;
if(x > y)
max = y;
return max;
}
input: 3 5
output: 3 Failure
测试人员用3和5跑测试,发现输出的是3,发现了Failure,他就会找Fault,测试人员觉得是第4行可疑,将第4行改成了max = x;接着他继续跑3和5,结果还是Failure,这样测试人员认为第4行不是Fault。
同样的修复方式(修复依然是第4行),如果我们用5和3跑测试,结果会发现输出结果从Failure变成Pass,这样我们就会认为第4行是Fault
从上面可以看出,同样的修复,由于不同测试也会导致测试人员对Fault的断定结果不一样。
还有这样一种情况:
还是上面的代码,当输入3和5,预期结果是5,实际输出是3,发现Fail。这时测试人员觉得第2行可疑,将max = x;修复成 max = y;跑3和5,实际输出是5,发现Pass。然后再跑了一个测试5和3,结果实际输出为3,出现Failure,测试人员再次检查,发现第4行有问题,将第4行修改成max = x;然后跑3和5,Pass,跑5和3,Pass。
这样测试人员认为这个程序出现了两个Fault:即第2行和第4行分别是一个Fault。
当跑5和3,实际输出为3,出现Failure,测试人员修复了第2行,再跑一次5和3,实际输出为3,出现Failure,测试人员再次检查程序,发现第4行可疑,修复后,跑5和3,实际输出为5,Pass。跑3和5,实际输出为5,Pass。
这个时候测试人员会断定为:第2行和第4行构成了一个Fault,也就是说只有一个Fault。
其实我们还是不知道什么是Fault,什么是一个Fault,什么是两个Fault。
Fault的干扰:
int max(int x,int y,int z){
if(x > y)
y = x;
if(y > z)
z = y;
return z;
}
input: 2 5 3
output: 5 Pass
input: 2 3 5
output: 5 Pass
如上代码,这是一段正确的(求最大数)代码,所以测试都会Pass。
int max(int x,int y,int z){
if(x > y)
y = x;
if(y < z)
z = y;
return y;
}
input: 2 5 3
output: 5 Pass
input: 2 3 5
output: 3 Failure
第二段代码,测试结果一次Pass,一次Failure。可以看出Fault是在第4和第6行,为什么会有一次Pass呢?这是因为第2个Fault对第1个Fault产生了干扰导致结果Pass。
int max(int x,int y,int z){
if(x > y)
y = x;
if(y < z)
z = y;
return z;
}
input: 2 5 3
output: 3 Failure
input: 2 3 5
output: 3 Failure
第三段代码,两次测试,两次Failure。可以看出Fault是第4行。
对比第二段和第三段代码,第二段有两个Fault,测试结果却有一次Pass,而第三段代码有一个Fault,测试结果却是两次Failure。这就是Fault之间的干扰导致的第二段代码的情况。
对于本次学习的目的就是:我们需要知道我们不知道什么是BUG,也就是一直在说的Fault,我们不明白Fault,关键是也没人明白什么是Fault!