1 摘要
去年系统测试阶段测试覆盖工具试运行过几个项目,取得的效果一般,主要目前事业部的项目以维护为主,每次测试,都是增量加核心业务测试(用例很少),所以结果中会出现很多覆盖率为0或者很低的情况,所以如果分析测试覆盖会占用很多时间,投入产出比不合适;如果是新项目,版本变更比较频繁,亦不试用于项目的开始阶段。
基于上面的问题,避免升级测试出现测试覆盖不到的情况,在现有的覆盖率统计工具进行二次开发,生成增量代码的覆盖率信息(增量行覆盖率、增量分支覆盖以及增量函数覆盖率)。目前只实现了linux C程序基于gcov的增量覆盖率统计方法,该方法能够快速、准确的统计出模块的增量覆盖率信息,并将最终结果用报表的形式展示。该工具试用一段时间后,会根据效果决定是否退出JAVA基于emma的增量代码覆盖率统计工具。
2 Linux GCOV 工具介绍
gcov是gnu/gcc工具库中的一个组件,一般来说,都会被安装的,原来是linux用来测试linux内核覆盖的工具,LCOV基于GCOV进行测试覆盖率的统计。
使用步骤:
Ø 首先了解编译文件的结构,在CC编译后面增加-fprofile-arcs -ftest-coverage。
Ø 启动应用程序
Ø 进行业务功能测试
Ø 收集测试数据,执行lcov -d./ -c -o testresult.info
Ø 生成HTML报告 genhtml -o testresult testresult.info
Ø 下载查看结果,将testresult 下载到本地进行观看. 或者安装Apache服务器 将主目录指向testresult目录。
3 实现思路
获取增量代码信息
部门使用svn进行版本管理,通过使用svn diff(有时候存在不太准确的情况,不过基本是靠普的)方式获取基线版本(默认是线上运行版本,也可以是用户指定的版本)和提测版本之间的变化信息,通过开源组件SVNkit进行svndiff实现。
解析svn diff结果,过滤文件
解析svn diff出来的结果,提取发生变化的文件名称并记录这些文件中发生变化的行号,过滤发生了变化但文件名称后缀非C和h的文件。提取增量行和增量函数信息。
获取提测版本的整体覆盖率信息
运行系统测试用例,生成文本格式(格式见参考文档)的覆盖率信息文件,该文件中记录了所有代码文件中的每一行代码被覆盖的次数(该文件同时记录了代码文件中函数被覆盖的次数,以及分支覆盖的次数)。
解析覆盖率文件
解析上一步中获得的文本文件,从该文件中提取被修改的文件的每一行的覆盖次数。
统计增量行和增量函数的覆盖率
将第3步和第5步中获取的数据进行对比,增量行被覆盖的次数大于0表示该行被覆盖到,增量函数中只要有一行被覆盖说明该函数被覆盖到。统计被覆盖到的增量行的总数和被覆盖到的增量函数的总个数,计算出增量行的覆盖率和增量函数的覆盖率。计算公式见章节4
生成覆盖率结果报表
根据步骤6生成的文件,使用lcov命令生成html格式结果。结果中只显示进行了修改了内容的文件覆盖情况。
4具体实现
4.1 指标计算规则
Ø 函数覆盖实现:
² 增量函数列表(FN):
根据执行结果里面的所有函数名和开始位置,增量遍历(即每次都从上次遍历的结束位置进行遍历)代码修改记录,如果在代码修改记录中,代码行数在某两个函数的起始行之间,则说明该函数本次进行了变更。
² 增量函数执行次数(FNDA):
根据增量函数结果,在对执行结果里面的所有函数执行次数(FNDA),进行过滤,过滤掉在增量函数中不存在的函数执行FNDA.
² 增量函数总数(FN):
增量函数列表(FN)的个数.
² 增量函数执行总数(FNH):
增量函数执行次数(FNDA),里面执行次数大于0的个数.
Ø 代码行覆盖实现:
² 增量代码行(DA):
根据代码修改记录结果,在对执行结果里面的所有行行(DA),进行过滤,过滤掉在代码修改记录中不存在的函数DA.如果在DA中不存在,而在修改代码记录中存在则表明该行为无效代码,应该替掉。
² 增量代码有效行总数(LF):
上一步骤中DA的个数。
² 增量代码有效行总数中被执行到的个数(LH):
前面返回的DA记录中,执行次数非0的和。
Ø 分支覆盖实现:
² 增量分支总数(BRDA)(可能有遗漏,因为不是不是一行):
根据代码修改记录结果,在对执行结果里面的所有行分支次数(BRDA),使用代码行号进行过滤,过滤掉在代码修改记录中不存在的BRDA.
² 增量分支总数(BRF):
增量分支总数的个数
² 增量分支执行个数(BRH):
增量分支总数(BRDA)里面执行次数大于0的和。
4.2流程图
4.3使用方法
操作步骤
Ø 首先了解编译文件的结构,在CC编译后面增加-fprofile-arcs -ftest-coverage。
Ø 启动应用程序
Ø 进行业务功能测试
Ø 运行目录下./startup.sh
Ø data目录下生成全量和增量测试覆盖结果
配置文件说明
#代码在svn的路径
source_path=http://XXXX/svn1/FDTCR/AutoTest/XXX/gcovtest
#svn用户名
username=XXX
#svn口令
passwd=XXX
#上次版本号
old_version=36
#最新版本号
new_version=37
#应用程序路径
application_path=/root/tester/