关键词:软件测试, 代码覆盖,质量
测试环境:ubuntu 12.04
代码覆盖 CFG(Control flow graph)图。控制流图(CFG)是一个有向图抽象数据结构。它是一个过程或程序的抽象表现。每个在图形中的节点代表一个基本块,例如,没有任何跳跃或跳跃目标的直线代码块;跳跃目标以一个块开始,和以一个块结束。定向边缘被用于代表在控制流中的跳跃。CFG中的每个结点至多只能有两个直接后继。
插桩技术
在实现覆盖测试的过程中,往往需要知道某些信息,如:程序中可执行语句被执行(即被覆盖)的情况,程序执行的路径,变量的引用、定义等。要想获取这类信息,需要跟踪被测程序的执行过程,或者是由计算机在被测程序执行的过程中自动记录。需要在被测程序中插入完成相应工作的代码,即代码插桩技术。如今大多数的覆盖测试工具均采用代码插桩技术。
它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。根据探针插入的时间可以分为目标代码插桩和源代码插桩。
源代码插桩
源代码插桩是在对源文件进行完整的词法分析和语法分析的基础上进行的,这就保证对源文件的插桩能够达到很高的准确度和针对性。但是源代码插桩需要接触到源代码,而且随着编码语言和版本的不同需要做一定的修改。
目标代码插桩
例如gdb插入到目标机的stub代理,实现嵌入式的远程调试。目标操作系统提供支持远程调试协议的通信模块和多任务调试接口,并改写异常处理的有关部分。另外目标操作系统还需要定义一个设置断点的函数;因为有的硬件平台提供能产生特定调试陷阱异常(debug trap)的断点指令以支持调试(如X86的INT 3),而另一些机器没有类似的指令,就用任意一条不能被解释执行的非法(保留)指令代替。目标操作系统添加的这些模块统称为"插桩"。
GCOV工具
Gcov is GCC Coverage, 是一个测试代码覆盖率的工具, 是一个命令行方式的控制台程序。
testcov.c
#include <stdio.h> int main(void) { int i, total; total = 0; for(i=0; i<10; i++){ total += i; } if (total != 45){ printf("failure\n"); } else { printf("success\n"); } return 0; }
编译,并执行。
gcc -fprofile-arcs -ftest-coverage -o testcov testcov.c ./testcov
查看testcov程序代码覆盖情况
$ gcov testcov.c File ‘testcov.c‘ Lines executed:87.50% of 8 testcov.c:creating ‘testcov.c.gcov‘