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