软件测试的错误
- Failure
定义:当一个系统不能执行所要求的功能时,即为Failure,可译为“失效”。
例子:一个程序员在编程的时候,不小心将for(i = 0;i < 3; i++)中的i = 0误打成i=1,这种错误就可以归为Fault。 - Error
定义:计算、观察或测量值或条件,与真实、规定或理论上正确的值或条件之间的差异,可译为“错误”。Error是能够导致系统出现Failure的系统内部状态。
例子:若将i = 0,打成 i = 1,则会导致 s =2 + 3(正常情况:i = 0,则s = 1 + 2 + 3)
Fault导致的s表现出计算错误,这种 s计算错误为Error。即i = 1 导致 s = 2 + 3这种漏算错误。
/**
* 代码段1
* 计算平均数
*/
public static int average(int [] nums) {
double result = 0;
for(int i=0;i<nums.lenght;i++){
result += nums[i]
}
result = result / nums.lenght;
return result;
}
- Fault
定义:可能导致系统或功能失效的异常条件(Abnormal condition that can cause an element or an item tofail.),可译为“故障”。
例子:从上面的代码可以看出,当Fault :i=1 导致Error:s = 2 + 3,代码继续运行会导致 平均数average的结果错误,average的计算错误表现在输出,即为Failure。
三者的关系
- 由于人类试图通过上述3个基本术语来覆盖所有现实中的失效场景,所以就有“Fault -> Error -> Failure”。即,故障发生了,会导致错误,错误有可能造成系统功能的减弱或丧失。
- 当Fault是另外一个组件/系统的失效时,则有Failure (Fault) -> Error -> Failure;当将Fault说成是某组件状态Error时,则有Error (Fault) -> Error -> Failure。
- 事实上,这是一种递归循环的关系,递归关系要成立必须有一个明确的结束条件,这个条件就是要找出Root Cause,否则将无法完成一个失效分析。
来自穆春阳科学网博客
常见的运行情况
通常会有三种情况
- 没有执行到fault
- 出现了某些异常,代码没有执行到fault处
- 感染到Error,但是Error因为某些特定的情况无视了
- 因为传入数据的特殊,例如计算平均数的时候,根据代码段1,int a = {0,2,4};
当i = 0 的时候,平均数等于0 + 2 + 4 = 6;6 / 3 = 2;
当i = 1 的时候,平均数等于2 + 4 = 6; 6 / 3 = 2;
这样的话i=0或者i=1的时候得到的结果都是一样的
- 因为传入数据的特殊,例如计算平均数的时候,根据代码段1,int a = {0,2,4};
- 没有传播到外面体现Failure
/*
* 代码段2
* 计算平均数
*/
public static double average(int a[]){
int i = 0;
double result = 0;
for (i=0; i < a.length; i++) {
result += a[i];
}
result = result / i ;
return result;
}
- 正确情况:当 i = 0 时,s = 3 + 5 + 4 = 12
具有Error:当 i = 1 时,s = 3 + 5 = 8 ;这种情况下因为Fault导致了Error。
但当 i = 0时,average = 12 / 3 = 4
当 i = 1时, average = 8 / 2 = 4
这种巧合导致了Failure 无法传播到外面,我们无法观测到失效行为,这会导致隐藏的Failure。