代码覆盖(英语:Code coverage)是
软件测试中的一种
度量,描述
程序中
源代码被
测试的
比例和程度,所得比例称为代码覆盖率。
简介
代码覆盖是由系统化软件测试所衍生的方式。第一份出版的相关参考资料是Miller及Maloney1963年在ACM通讯上发表的论文。
代码覆盖是飞行设备进行安全认证中的考量项目之一。飞行设备相关认证的指南列在
美国联邦航空管理局的文件DO-178B及最近出版的文件DO-178C。
功能安全标准,如IEC 61508或ISO 26262,并未定义程式码覆盖率之需求值,只列为软件测试方法的选项,唯有航太产业标准(DO-178B)要求100%,以因应超高可靠度的产品需求,此数值对于工业或汽车产品实属理想目标。
覆盖率准则
为了量测
测试套件测试软件的程度,会用一种或多种不同的覆盖率准则。
基本的覆盖率准则
以下列出一些基本的覆盖率准则:
考虑以下的C++函式:
假设此函式是一个大型程式的一部分,且某测试用例执行到此函式:
考虑以下的程式:
if a and b then
以下二个测试可以得到100%的条件覆盖率:
但上述的测试条件都不会使if的逻辑运算式成立,因此不符合判断覆盖的条件。
有时会需要用错误插入的方式来确保所有条件及
异常处理程式都有一定的覆盖率。
修改条件/判断覆盖
在一些安全关键应用(例如飞航用的软件)中,一般会需要满足修改条件/判断覆盖(modified condition/decision coverage,简称MC/DC)的准则。此准则是条件/判断覆盖的延伸,而且每个条件都要可以独立影响判断结果的成立或不成立。例如考虑以下的程式:
if (a or b) and c then
以下的测试可满足条件/判断覆盖:
不过,若第一项测试中b的值改为false,不影响判断结果,第二项测试中c的值改为true,不影响判断结果,因此需要用以下的测试才能满足修改条件/判断覆盖:
其中粗体的条件表示是会影响判断结果的条件,在影响判断结果的条件中,每个变数都出现至少二次,其中至少一次其值为真,至少一次其值为假。
多重条件覆盖
此覆盖率准则要求要测试逻辑运算式中的所有组合,例如上述程式的多重条件覆盖需要有以下的8个测试:
其他覆盖率准则
以下也是一些可能会用到的覆盖率准则:
安全关键应用一般会要求某种特定的覆盖率要到达100%。
有些覆盖之间有相关性:例如路径覆盖就包括了判断覆盖、指令覆盖及进入点/结束点覆盖,而判断覆盖也包括了指令覆盖。
完整的路径覆盖测试多半难以实现甚至不可能实现。有 个判断的程式就会有 种完整路径,循环结构可能会产生无穷种完整路径。程式中的许多路径也许是不可行的,因为也许没有受测系统的输入,使系统完整依某特定路径执行。而且已证实没有识别不可行路径的通用算法(若有,此算法就可以求解
停机问题)。实务上路径覆盖测试的软件只会试图找出随着循环执行次数不同时,有变动的路径,设法找到“基本路径”,并要求对基本路径需达到路径覆盖的要求。
实务
目标软件是在特定环境下配合特定的选项或函式库所建立,所执行的每一个函式都会对应到原代码的机能点,代码覆盖的程序可以让程式开发者及品质保证单位可以找出程式在正常情形下不会执行或是很少执行的部分(例如异常处理程式),也帮助测试工程师确认最重要的条件(机能点)是否有测试到。测试结果可进行分析,确认哪一部分程式尚未执行到,后续再修改测试程式,对这部分进行必要的测试。上述作法的目的是为了开发一套严格且可管理的
回归测试。
在配合软件开发环境进行代码覆盖率时,需考虑以下的事项:
测试工程师可以根据
代码覆盖测试的报告来调整测试用例、输入或是组态,以增加重要机能的代码覆盖率。测试工程师常常会使用到指令覆盖及判断覆盖,前者会报告在测试中会执行到多少比例的程式码,后者会报告在测试中会执行到多少比例的的判断结果,二者都会输出一个覆盖率的度量,以百分比表示。其意义则需视进行的代码覆盖种类来决定,67%的判断覆盖率会比67%的指令覆盖率会来得全面。
一般而言代码覆盖工具及函式库会影响程式性能,也会消耗内存或其他资源,无法在系统正常使用时测试。因此一般只在开发阶段进行,提供给客户的系统不会包括代码覆盖工具及函式库。也有一些软件无法用覆盖测试来测试,其覆盖率会用分析的方式来得到近似值,而不是用直接测试到的结果。
有一些缺陷会受到代码覆盖工具的影响,像在进行代码覆盖测试时,可以略过一些有
竞争危害或是
实时敏感度高的程序。相对的,当加上额外的代码覆盖测试码时,也可能比较容易找到这类的缺陷。