更新时间:2023-12-12 14:29
假设此函式是一个大型程式的一部分,且某测试用例执行到此函式:
考虑以下的程式:
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%的指令覆盖率会来得全面。
一般而言代码覆盖工具及函式库会影响程式性能,也会消耗内存或其他资源,无法在系统正常使用时测试。因此一般只在开发阶段进行,提供给客户的系统不会包括代码覆盖工具及函式库。也有一些软件无法用覆盖测试来测试,其覆盖率会用分析的方式来得到近似值,而不是用直接测试到的结果。
有一些缺陷会受到代码覆盖工具的影响,像在进行代码覆盖测试时,可以略过一些有竞争危害或是实时敏感度高的程序。相对的,当加上额外的代码覆盖测试码时,也可能比较容易找到这类的缺陷。