覆盖率

更新时间:2024-03-17 00:47

覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。通过已执行代码表示,用于可靠性、稳定性以及性能的评测。

评测方法

测试覆盖是对测试完全程度的评测。测试覆盖是由测试需求和测试用例的覆盖或已执行代码的覆盖表示的。

质量是对测试对象(系统或测试的应用程序)的可靠性、稳定性以及性能的评测。质量建立在对测试结果的评估和对测试过程中确定的变更请求(缺陷)的分析的基础上。

覆盖评测

两种评测

实施标准(基于代码的)而言的完全程度的任意评测,如用例的核实(基于需求的)或所有代码行的执行(基于代码的)。

系统的测试活动建立在至少一个测试覆盖策略基础上。覆盖策略陈述测试的一般目的,指导测试用例的设计。覆盖策略的陈述可以简单到只说明核实所有性能。

如果需求已经完全分类,则基于需求的覆盖策略可能足以生成测试完全程度的可计量评测。例如,如果已经确定了所有性能测试需求,则可以引用测试结果来得到评测,如已经核实了 75% 的性能测试需求。

如果应用基于代码的覆盖,则测试策略是根据测试已经执行的源代码的多少来表示的。这种测试覆盖策略类型对于安全至上的系统来说非常重要。

两种评测方法

两种评测都可以手工得到(公式如下所示)或通过测试自动化工具计算得到。

基于需求的测试覆盖

基于需求的测试覆盖在测试生命周期中要评测多次,并在测试生命周期的里程碑处提供测试覆盖的标识(如已计划的、已实施的、已执行的和成功的测试覆盖)。

在执行测试活动中,使用两个测试覆盖评测,一个确定通过执行测试获得的测试覆盖,另一个确定成功的测试覆盖(即执行时未出现失败的测试,如没有出现缺陷或意外结果的测试)。

基于代码的测试覆盖

基于代码的测试覆盖评测测试过程中已经执行的代码的多少,与之相对的是要执行的剩余代码的多少。代码覆盖可以建立在控制流(语句、分支或路径)或数据流的基础上。控制流覆盖的目的是测试代码行、分支条件、代码中的路径或软件控制流的其他元素。数据流覆盖的目的是通过软件操作测试数据状态是否有效,例如,数据元素在使用之前是否已作定义。

覆盖率等于覆盖面积/总面积

覆盖率准则

为了量测测试套件测试软件的程度,会用一种或多种不同的覆盖率准则。

基本的覆盖率准则

以下列出一些基本的覆盖率准则:

考虑以下的C++函式:

intfoo(intx,inty){intz=0;if((x>0)&&(y>0)){z=x;}returnz;}

假设此函式是一个大型程式的一部份,且某测试用例执行到此函式:

考虑以下的程式:

ifaandbthen

以下二个测试可以得到100%的条件覆盖率:

但上述的测试条件都不会使if的逻辑运算式成立,因此不符合判断覆盖的条件。

有时会需要用错误插入(英语:Fault injection)的方式来确保所有条件及异常处理程式都有一定的覆盖率。

修改条件/判断覆盖

在一些安全关键应用(例如飞航用的软件)中,一般会需要满足修改条件/判断覆盖(modified condition/decision coverage,简称MC/DC)的准则。此准则是条件/判断覆盖的延伸,而且每个条件都要可以独立影响判断结果的成立或不成立。例如考虑以下的程式:

if(aorb)andcthen

以下的测试可满足条件/判断覆盖:

不过,若第一项测试中b的值改为false,不影响判断结果,第二项测试中c的值改为true,不影响判断结果,因此需要用以下的测试才能满足修改条件/判断覆盖:

其中粗体的条件表示是会影响判断结果的条件,在影响判断结果的条件中,每个变量都出现至少二次,其中至少一次其值为真,至少一次其值为假。

多重条件覆盖

此覆盖率准则要求要测试逻辑运算式中的所有组合,例如上述程式的多重条件覆盖需要有以下的8个测试:

其他覆盖率准则

以下也是一些可能会用到的覆盖率准则:

安全关键应用一般会要求某种特定的覆盖率要到达100%。

有些覆盖之间有相关性:例如路径覆盖就包括了判断覆盖、指令覆盖及进入点/结束点覆盖,而判断覆盖也包括了指令覆盖。

完整的路径覆盖测试多半难以实现甚至不可能实现。有个判断的程式就会有种完整路径,循环结构可能会产生无穷种完整路径。程式中的许多路径也许是不可行的,因为也许没有受测系统的输入,使系统完整依某特定路径执行。而且已证实没有识别不可行路径的通用算法(若有,此算法就可以求解停机问题)。实务上路径覆盖测试的软件只会试图找出随着循环执行次数不同时,有变动的路径,设法找到“基本路径”,并要求对基本路径需达到路径覆盖的要求。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}