PIE模型对于软件测试日常笼统说的“Bug”一词做了细分:
1、Fault:软件中存在的静态错误。
2、Error:由于Fault导致的内部状态的错误。
3、Failure:不满于规格说明,用户可见的外部错误。
我们要观察到错误的存在,必须经过三个步骤,也就是“PIE”名字的由来:
1、Execution(执行):错误代码必须要被执行到。
2、Infection(感染):触发了错误的中间状态。
3、Propagation(传播):错误的中间状态必须可以传播到最后的输出使得可以被观测到。
错误代码被执行到,未必会触发错误的中间状态;错误的中间状态,未必会导致错误的输出。
比如下面一个计算数组中数字之和的程序,其中for循环从i=1开始,遗漏掉了i=0的情况,这显然是一个Fault。
如果我们测试的数组是[0,5,3],由于遗漏掉的i=0的情况刚好为0,所以sum计算的结果为4,与预期相符。此时,Fault并未触发错误的中间状态。
但如果换成[4,5,3],就可以触发错误的中间状态。
再看另一个例子,计算数组的平均值时,错误地将数组长度减一,这也是一个Fault。
当测试的数组是[3,5,4]时,sum只计算了前两个数的总和,造成了一个错误的中间状态。
但很巧合的是,(3+5) / 2的结果 跟 (3+5+4) / 3的结果是一样的,也就是说,虽然存在一个错误的中间状态,但并没有导致一个错误的输出结果。
因此,我们可以得出一个结论,如果要发现一个Bug,必须要满足PIE模型。PIE模型对于我们如何提升软件质量有一定的指导借鉴意义。