v1.0 2024-03-12 学习时总结;
v1.1 2024-06-25 复习时阅读下文补充总结;软件测试的几个术语(故障--Fault、错误--Error、失效--Failure-CSDN博客
前言:
“微软不是一家软件开发公司,而是一家软件测试公司。” --比尔•盖茨(据说)
一.what is 失效模型?
Now, I 'll give u 3 terms: fault, error, failure;
1.1 Software Fault(软件缺陷):
Define: (Abnormal condition that can cause an element or an item to fail.)
key words:静态缺陷;可能使功能失效的异常条件.(并未执行,通过静态的,观测发现的问题)
即:实际代码功能与预期实现功能不符合/注释有问题(maybe? [v1.1]ans:不是,注释并不会导致任何失效,不是fault;)/...
e.g.1
//e.g.1
int i =0; // i =1 注释有误(存疑,Q1:注释有误 算fault吗?)
//e.g.2
int add(int a,int b){
return a-b; } // 加法函数却写的减法
1.2 Software Error(软件错误) :
Define: (Discrepancy between a computed, observed or measured value or condition and the true, specified, or theoretically correct value or condition.)
key words: 中间步骤/中间变量与你设计的运行模式不同
即: 不正确的内部状态,是缺陷Fault的表现形式(执行fault,可能会有Error)
[v1.1] 补充:
[实际执行中]
运行fault后,触发得到的中间错误
Q:怎么才叫中间错误?中间值的问题or实际逻辑问题[比如数组求和中,0+4+5变成了4+5,是error吗?]
e.g.2
float sum =0.0;
for(int i =1;i<A.length;i++) // 实际应该从i =0 开始;
{
sum+= A[i];
}
means = sum / A.length;
//test case1 : A=[1,2,3];
//test 预期步骤(expected): sum= (1+2+3)
//test 实际步骤(actual): sum= (2+3) ----error
1.3 Software Failure(软件失效):
Define: (Termination of the ability of an element or an item to perform a function as required.)
key words: 预期结果与实际结果不符
像这里的case1,平均数应该是2而实际结果是1.667,failure表现在输出(Q2:不输出,算体现出failure吗)
[v1.1]补充:
error传到软件外部,用户和测试人员能够观测的到的失效行为。
什么叫能观测?
那肯定就是输出[print]了.
比如e.g3,没有print,那么观测不到,就是没有failure;
e.g.3
float sum =0.0;
for(int i =1;i<A.length;i++) // 实际应该从i =0 开始;
{
sum+= A[i];
}
means = sum / A.length;
print(means)
//test case1 : A=[1,2,3];
//test output(expected): means= (1+2+3)/3 =2;
//test output(actual): means= (2+3)/3 =1.66666667;
1.3.1 观测到Failure的三个必要条件【PIE模型】
1)Execution/Reachability-执行:
必须到达程序中包含缺陷的一个或多个位置
2)Infection-感染:
程序的状态必须是错误的
3)Propagation-传播:
被错误影响的状态必须传播,导致程序的某些输出不正确
二、三者关系
2.1 关系示例图
程序就好比是从起点运行到终点。过程中有偏差,即使最终到达期望终点,过程也是Error的。
2.2关于failure常见的运行情况(3种)
- No reachability:代码没有执行到fault处
- No propagation:有Reachability&Infection.但是Error因为某些特定的情况无视了因为传入数据的特殊,例如计算平均数的时候,对数组起始位置的下标 i :
- i = 0 :平均数等于0 + 2 + 4 = 6;6 / 3 = 2;
- i = 1 :平均数等于2 + 4 = 6; 6 / 3 = 2;(结果一样)
- No Infection : 即执行到了fault但是没产生error。
- 先问个问题。Q2:有没有一个fault,任何测试都不会将其测试出来?这样还能称之为fault吗 (应该不算了)[v1.1]不算,这个逻辑类似于假言推理;
2.3 产生Fault,error,failure三者的不同情况
2.3.1有Fault,Error,无Failure;
(即 No Propagation)
e.g.4
int find_last_march(int [] a,int b ){//从后向前找到首个匹配的元素,返回下标
for (int i = length(a)-1, i >0;i--)
if(a[i] == b) return i ; }
//test : a=[1,2,3];b=4;
//有fault(length错误减一),error(遍历过程有误).
//无failure(期望和实际,均未输出。【当然在代码内加入return -1 也可】)
2.3.2有fault无error 更无failure :
如no reachability 一样. (事实上,对于上例当输入a为空数组时,返回空指针异常,甚至没有执行到 [i=length(a)-1] 的fault处)
Q3:执行了fault但没产生error? 存在吗?
是否产生Error,不容易把握。先针对代码原本要完成的功能,在脑海里预想一个完美的代码。
然后对比那个完美代码和存在Fault的代码在输入相同的测试样例的时候,看它们在执行期间状态是否一致。
2.3.3有fault有error 有failure :比较常见;
参考:
Fault、Error及Failure的解释 - 知乎 (zhihu.com)
软件测试的几个术语(故障--Fault、错误--Error、失效--Failure)_如果因为软件错误的中间态引起了软件的输出错误是fault吗-CSDN博客