目录
01.覆盖率测试概念
02.覆盖率测试方法
03.嵌入式软件覆盖率测试原理
04.SkyEye的重大突破
覆盖率测试是一种白盒测试手段,通常会在软件测试的早期阶段进行,也就是单元测试过程中。覆盖率测试这种测试方式需要对测试代码本身进行访问同时对代码进行插桩处理,再根据程序的内部结构完成测试工作。
覆盖率测试的过程中需要做到有效覆盖程序的语句以及分支结构,尽量在测试过程中发现隐藏的软件缺陷从而保证软件的质量。覆盖率测试的基本准则是要求测试用例要尽可能多的覆盖程序的内部逻辑结构,并发现其中存在的问题,为保证测试工作的充分性和全面性,必要时应该进行补充测试,保证测试效果。
覆盖率指的是已经测试的对象在可测对象中所占用的比例,覆盖率越高证明测试的效果越好。在具体嵌入式软件测试中,应该根据具体情况制定相应的方法和策略。覆盖率测试常用到的几种典型的覆盖策略有以下几种:
语句覆盖
软件开发过程中相关的逻辑单位以及函数、文件等都是由语句构成的,并且不同的语句类型表示不同的含义,这种语句的标识具有一定的专一性。使用语句覆盖是测试覆盖率最基础的方式,具体语句的覆盖率指的是被测语句在整个可测语句中执行的百分比,程序中的每个语句至少执行一次,但语句覆盖本身具有一定的局限性,即便覆盖率达到100%,也不能保证程序完全被覆盖这种测试只看语句的执行情况,难以发现其中的逻辑错误。
判定覆盖
程序在编写的过程中通常可以分为三种结构:顺序,分支和循环。判定覆盖又称分支覆盖,程序的逻辑越复杂,证明程序的分支越多,因此使用分支覆盖进行测试可以取得较充分的效果。在具体的测试中分支测试覆盖率指的是至少执行了一次的分支总数与可执行的分支总数的比值。分支覆盖本身的逻辑性较强,是一种比较可靠的测试方式,但由于程序的分支数量庞大,使用分支覆盖测试方式无疑增加了测试成本通常情况下,为提高软件的测试质量,对重点分支结构语句进行分支覆盖测试。
条件覆盖
条件覆盖与分支覆盖的测试类似,主要也是基于程序中的特定表达式即条件表达式中每一个条件表达式可以取真值或者假值。若每一个条件语句都能获得一次真值或者假值相当于形成了足够多的测试用例,测试结果的覆盖性较好。条件发生变化时,不一定会引起分支发生变化,因此条件覆盖情况不能保证分支覆盖的充分性,在实际测试中可以通过覆盖关键的条件语句完成测试。条件覆盖率指的是至少执行了一次的条件布尔值总数与条件总的布尔值的比值。
判定条件覆盖
判定条件覆盖就是给出的条件组合里面的每个子条件的真、假都出现过,需要执行足够的测试用例,使得判定条件中每个条件取到各种可能的值,并使每个判定取到各种可能的结果。判定条件覆盖同时满足判定覆盖和条件覆盖,但未考虑条件的组合情况。
路径覆盖
路径覆盖指选取足够多的测试用例,使程序中的每条可能的路径都至少执行一次,在白盒测试中,覆盖程度最高的就是路径覆盖,因为其覆盖了程序中所有可能的路径,路径覆盖被广泛应用于单元测试。
举例
针对如下程序:
If((a>1) and (b==0)) then x=x/a;
If((a>2) or (x>1)) then x=x+1;
语句覆盖
满足语句覆盖,可设计如下测试用例:
Testcase1:a=2,b=0,x=3
判定覆盖
满足判定覆盖,可设计如下测试用例:
Testcase1:a=2,b=0,x=3
Testcase2:a=1,b=0,x=1
条件覆盖
满足条件覆盖,可设计如下测试用例:
Testcase1:a=2,b=0,x=3
Testcase2:a=1,b=0,x=1
Testcase3:a=2,b=1,x=1
判定条件覆盖
满足判定条件覆盖,可以设计如下测试用例:
Testcase1:a=2,b=0,x=3
Testcase2:a=2,b=1,x=1
Testcase3:a=1,b=0,x=3
Testcase4:a=1,b=1,x=1
路径覆盖
满足路径覆盖,可以设计如下测试用例:
Testcase1:a=2,b=0,x=3
Testcase2;a=1,b=0,x=1
Testcase3:a=2,b=1,x=1
Testcase4:a=3,b=0,x=1
几种覆盖率测试策略的强弱程度如下:
路径覆盖>判定条件覆盖>条件覆盖>判定覆盖>语句覆盖
嵌入式软件指的是嵌入到计算机系统中的软件,一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序四个部分组成。嵌入式软件的一些特点主要体现在:与硬件紧密联系,嵌入式软件的测试与硬件具有一定的不可分割性;软件的测试效果以及质量确定跟硬件性能和测试环境有较大关联;实时性较强,嵌入式软件通常情况下为实时控制软件,需要在特定的时间内完成任务的处理工作。时间也是处理过程中的重要因素,因此,嵌入式软件的测试对处理时序有着较高要求。
对嵌入式软件进行覆盖测试,较传统的方法是需要对代码插桩,但嵌入式软件与普通软件不同,嵌入式软件的系统资源有限,插桩会增加代码量,过大的代码量将使得程序不能在嵌入式系统中运行,同时嵌入式软件具有很强的实时性,程序的输出只在有限的时间内有效,插桩会破坏程序的时间特性,导致软件执行的错误。
为避免这些缺陷,迪捷软件的SkyEye作为一个全数字实时仿真平台,实现了零插桩目标码覆盖率统计,在不插桩的情况下,使用反汇编工具生成嵌入式软件目标码的反汇编文件,分析反汇编文件获取需要的基础信息,如函数指令信息、地址对应源码行号等,再与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况,实现零插桩分析覆盖率的目的,无需修改被测件代码进行代码覆盖率测试,可以计算出语句覆盖和分支覆盖情况,并支持融合前面的统计结果然后生成报告,具体如下:
SkyEye可以做到指令覆盖率、指令分支覆盖率、源码分支覆盖率的分析:
▲图1 覆盖率信息统计
SkyEye支持通过函数对应的目标码文件及源码文件来查看详细的执行情况
▲图2 函数uart_printf目标码详情
▲图3 函数uart_printf源码执行情况
SkyEye支持融合各统计结果生成覆盖率统计分析报告,包括指令覆盖率统计结果、源码覆盖率统计结果、函数覆盖率统计结果、目标覆盖率统计结果
▲图4 指令覆盖率统计结果
▲图5 源码覆盖率统计结果
▲图6 函数覆盖率统计结果
▲图7 目标覆盖率统计结果