文章目录
- 覆盖率
- 覆盖评测
- 基于需求的测试覆盖
- 基于代码的测试覆盖
- 覆盖率准则
覆盖率
覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。
通过已执行代码表示,用于可靠性、稳定性以及性能的评测。
测试覆盖是对测试完全程度的评测。测试覆盖是由测试需求和测试用例的覆盖或已执行代码的覆盖表示的。建立在对测试结果的评估和对测试过程中确定的变更请求(缺陷)的分析的基础上。
覆盖评测
测试覆盖是就需求(基于需求的)或代码的设计/实施标准(基于代码的)而言的完全程度的任意评测,如用例的核实(基于需求的)或所有代码行的执行(基于代码的)。
基于需求的测试覆盖
基于需求的测试覆盖在测试生命周期中要评测多次,并在测试生命周期的里程碑处提供测试覆盖的标识(如已计划的、已实施的、已执行的和成功的测试覆盖)
在执行测试活动中,使用两个测试覆盖评测,一个确定通过执行测试获得的测试覆盖,另一个确定成功的测试覆盖(即执行时未出现失败的测试,如没有出现缺陷或意外结果的测试)。
基于代码的测试覆盖
基于代码的测试覆盖评测测试过程中已经执行的代码的多少,与之相对的是要执行的剩余代码的多少。
代码覆盖可以建立在控制流(语句、分支或路径)或数据流的基础上。
控制流覆盖的目的是测试代码行、分支条件、代码中的路径或软件控制流的其他元素。
数据流覆盖的目的是通过软件操作测试数据状态是否有效,例如,数据元素在使用之前是否已作定义。
覆盖率准则
覆盖率等于覆盖面积/总面积
基本的覆盖率准则
- 函式覆盖率(Function coverage):有呼叫到程式中的每一个函式(或副程式)吗?
- 指令覆盖率(Statement coverage):若用控制流图(英语:control flow graph)表示程式,有执行到控制流图中的每一个节点吗?
- 判断覆盖率(Decision coverage):(和分支覆盖率不同)若用控制流图表示程式,有执行到控制流图中的每一个边吗?例如控制结构中所有IF指令都有执行到逻辑运算式成立及不成立的情形吗?
- 条件覆盖率(Condition coverage):也称为谓词覆盖(predicate coverage),每一个逻辑运算式中的每一个条件(无法再分解的逻辑运算式)是否都有执行到成立及不成立的情形吗?条件覆盖率成立不表示判断覆盖率一定成立。
- 条件/判断覆盖率(Condition/decision coverage):需同时满足判断覆盖率和条件覆盖率。
示例:intfoo(intx,inty){intz=0;if((x>0)&&(y>0)){z=x;}returnz;}
假设此函式是一个大型程式的一部份,且某测试用例执行到此函式:
- 函式覆盖率:只要函式foo有执行过一次,即满足函式覆盖率100%的条件。
- 指令覆盖率:若有呼叫过foo(1,1),函式中每一行(包括z = x;)都执行一次,满足指令覆盖率100%的条件。
- 判断覆盖率:若有呼叫过foo(1,1)及foo(0,1),前者会使if的条件成立,因此z =
x;会执行,后者会使if的逻辑运算式((x>0) && (y>0);)不成立,因此满足判断覆盖率100%的条件。 - 条件覆盖率:若有呼叫过foo(1,1)、foo(1,0)及foo(0,0),前二个会使(x>0)的条件成立,而第三个会使该条件不成立,而第一个会使(y>0)的条件成立,而后面二个会使该条件不成立,所有条件都有出现成立及不成立的情形,因此满足条件覆盖率100%的条件。