测试覆盖度评估是衡量阶段性软件测试执行状态的重要手段之一,来确定测试是否达到事先设定的测试任务完成的标准。测试覆盖率则是测试覆盖度评估中一种量化的表示方法,一般通过被测试的软件产品需求、功能点、测试用例数或程序代码行等来进行计算。
软件测试覆盖率常用的计算公式:
功能覆盖率=至少被执行一次的测试功能点数/测试功能点总数(功能点) 需求覆盖率=被验证到的需求数量/总的需求数量(需求) 覆盖率=至少被执行一次的测试用例数/应执行的测试用例总数(测试用例) 语句覆盖率=至少被执行一次的语句数量/有效的程序代码行数 判定覆盖率=判定结果被评价的次数/判定结果总数 条件覆盖率= 条件操作数值至少被评价一次的数量/条件操作数值的总数 判定条件覆盖率=条件操作数值或判定结果至少被评价一次的数量/(条件操作数值总数+判定结果总数) 上下文判定覆盖率=上下文内已执行的判定分支数和/(上下文数*上下文内的判定分支总数) 基于状态的上下文入口覆盖率=累加每个状态内执行到的方法数/(状态数*类内方法总数) 分支条件组合覆盖率=被评测到的分支条件组合数/分支条件组合数 路径覆盖率= 至少被执行一次的路径数/程序总路径数除此之外,覆盖率还包括类覆盖率、函数覆盖率、代码块覆盖率等,如EMMA中
测试评估可以说贯穿整个软件测试过程,可以在测试每个阶段结束前进行,也可以在测试过程中某一个时间进行,目的只有一个,提高测试覆盖度,保证测试的质量。通过不断的测试覆盖度评估或测试覆盖率计算,及时掌握测试的实际状况与测试覆盖度目标的差距,及时采取措施,就可以提高测试的覆盖度。
测试覆盖度的评估依赖于不同的测试阶段或不同的测试方法。如在单元测试中,测试覆盖率是建立在被测试的代码行、程序分支和程序路径等的度量之上,从软件质量保证的要求出发,单元测试的覆盖率要达到80%之上。白盒测试方法主要以程序语句、判定-条件、条件组合和(基本)路径等覆盖率来衡量,和单元测试是吻合的。而在系统功能测试中,则以功能点、测试用例、需求数等覆盖率来衡量。
要获得、提高测试覆盖率,常常需要借助测试工具。下面就以两个测试工具为例。
1. EMMA
EMMA是一个用于检测和报告JAVA代码覆盖率的开源工具,支持许多种级别的覆盖率指标:包,类,方法,语句块(basic block)和行,特别是能测出某一行是否只是被部分覆盖,如条件语句短路的情况。EMMA能生成text、xml、html等形式的报告,以满足不同的需求,其html报告提供逐层细化查询功能,能够从package开始一步步链接到我们所关注的某个方法。EMMA能和Makefile和Ant集成,效率很高,便于应用于大型项目。 EMMA是通过向.class文件中插入字节码的方式来跟踪记录被运行代码信息的。EMMA支持两种模式:On the fly和Offline模式。On the fly模式往加载的类中加入字节码,相当于用EMMA实现的application class loader替代原来的application class loader。On the fly模式比较方便,缺点也比较明显,如不能为被boot class loader加载的类生成覆盖率报告,也不能为像J2EE容器那种自己有独特class loader的类生成覆盖率报告。这时,必须求助于Offline模式,Offline模式是在类被加载前,加入字节码。EMMA也支持两种运行方式:Command line和Ant。 2.Rational PureCoveragePureCoverage是一个面向VC, VB或者Java开发的测试覆盖程度检测工具,可以自动检测测试完整性和未被测试的范围,在每一个测试阶段生产详尽的测试覆盖程度报告。PureCoverage将在一个对话框中列出所有应用程序模块,开发人员只需针对每个应用程序构件,就可以简单地设置基于代码行或函数的代码覆盖级别。不仅可以查看每次程序运行的图形化覆盖数据,还可以直接地、实时地控制覆盖数据的记录。对于最关心或最重要的功能模块,可以详细地收集覆盖数据;而对于不太重要的模块, 只收集较常规的覆盖数据,帮助开发人员进行有效地测试。
系统的测试活动,依据测试目标,建立在至少一个测试覆盖策略基础上,而覆盖策略帮助进行测试覆盖度的有效评估。覆盖策略有