PIE模型
Fault:静态存在于软件中的缺陷;如代码存在错误
int numbers[] = {3, 5, 6};
int lenth = numbers.length;
double mean,sum;
sum = 0.0;
// 计算数组所有元素的平均值
for (int i = 1; i < lenth; i++) { // 这里i应该为0,但是i却为1,代码存在一个静态缺陷
sum += numbers[i];
}
mean = sum / (double) lenth;
System.out.print("Mean:" + mean);
Error: 软件运行中,运行到fault,触发产生的错误;
Failure: Error传播到软件外部,使用户用结果与专业文档对比,观测到失效的行为。
要观测到Failure需要三个必要的条件:
1、执行必须通过错误的代码(Execution-执行);
2、在执行错误代码的时候必须触发出一个错误的中间状态(Infection-感染);
3、错误的中间状态必须传播到最后输出,使得观测到输出结果与预期结果不一致(Propagation-传播)。
一个测试执行到包含fault的代码,不一定会产生错误的中间状态error;产生了错误的中间状态,不一定会有失效failure。
在上述代码段中,如 for (int i = 1; i < lenth; i++) 就是一个fault,在正确代码中,i的初值应该为0,应该从数组的0号元素开始计算,这种错误就是Fault。
当有Fault的代码,在运行过程中就会导致相应的Error。
如下代码,若将i = 0,打成 i = 1,则会导致 sum=5+6(正常情况:i = 0,则sum = 3+5+6),Fault导致的sum表现出计算错误,这种 sum的计算错误为Error。代码继续运行会导致 平均数mean的结果错误,mean的计算错误表现在输出,即为Failure。
如果数组为(0,1,1,3) 时,虽然导致了error,但是输出中并没有体现出计算错误,这时Failure就不存在。
PIE模型相关的题目
Please construct a simple program P (with a fault) and 3 tests (t1, t2, t3), s.t.
t1 executes the fault, but no error
t2 (executes the fault and) produces an error, but no failure
t3 produces a failure
*/
public class test {
public static int[] P(int[] array) { //冒泡排序
if (array.length == 0)
return array;
for (int i = 1; i < array.length; i++) // for (int i = 0; i < array.length; i++)
for (int j = 1; j < array.length - 1 - i; j++) //for (int j = 0; j < array.length - 1 - i; j++)
if (array[j + 1] < array[j]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
return array;
}
public static void print(int[] array) { //输出数组元素
System.out.print(" 排序后:" );
for(int i=0;i<array.length;i++) {
System.out.print( " " + array[i] );
}
}
public static void main(String[] args) {
int array1[] = {1, 2, 8, 11, 58}; //t1 t1 executes the fault, but no error
int array2[] = {2, 6, 5, 11, 8, 26}; //t2 t2 (executes the fault and) produces an error, but no failure
int array3[] = {24, 8, 5, 11, 2, 9}; //t3 t3 produces a failure
System.out.println("t1排序前:1 2 8 11 58 " );
P(array1);
print(array1);
System.out.println('\n');
System.out.println("t2排序前:2 6 5 11 8 26 " );
P(array2);
print(array2);
System.out.println('\n');
System.out.println("t3排序前:24 8 5 11 2 9 " );
P(array3);
print(array3);
}
}