[学习笔记3]Fault Revisist(Fault 反思)

之前我学习了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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值