基于嵌入式系统的BullseyeCoverage逻辑覆盖测试方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 204

目前嵌入式软件的覆盖率测试相对通用平台软件具有一定的的复杂性和困难性,本文介绍了一种基于嵌入式系统的BullseyeCoverage 逻辑覆盖测试概念及方法,研究了代码覆盖率工具 BullseyeCoverage 的工作原理,并应用到实际嵌入式系统测试案例中,实践结果表明, BullseyeCoverage 测试工具能够从函数覆盖、条件/判定覆盖多个角度快速、准确地定位未被测试的代码,并给出测试报告,便于测试人员有针对性地设计测试用例,以便发现潜在的软件缺陷,最终提高软件产品质量。

针对嵌入式系统而言,其开发平台与运行平台一般不同,开发工具运行在软硬件配置丰富的测试计算机上,嵌入式执行程序运行在软硬件资源相对缺乏的目标机上,由于开发环境与运行环境存在较大差异,且常规的测试方法和技术在嵌入式软件系统中难以奏效,故嵌入式软件相对于通用平台的软件而言,测试工作有一定的复杂性。

嵌入式软件的覆盖率测试,其充分性测试具有重要意义。

借助于覆盖率分析工具可以降低测试难度同时可以提高测试效率。

本文介绍了一种基于嵌入式系统的BullseyeCoverage 逻辑覆盖测试方法,通过搭建基于arm-xilinx-linux 目标板的嵌入式软件动态测试平台进行动态覆盖测试,根据覆盖率分析情况补充测试用例,实现软件的充分性测试。

1 软件的覆盖测试
1.1 覆盖率概念
覆盖率测试也称为逻辑测试,测试时需要访问测试代码本身然后对代码进行插装,主要以程序的内部结构为基础来设计测试用例,因此,它也是白盒测试的一种方法;覆盖率度量指标有多种,包括函数覆盖、语句覆盖、条件覆盖、分支覆盖、分支/条件覆盖、路径覆盖等,其中语句覆盖是最基本的覆盖标准。

覆盖率是代码执行所占的百分比,覆盖率按照式(1)计算:覆盖率=已执行的程序对象数量/程序中可执行的程序对象的总数×100% (1)
覆盖率测试基本准则是测试用例要尽可能多地覆盖程序的内部逻辑结构,发现隐藏的错误和问题。

同时,检验软件测试工作的充分性和全面性,必要时补充测试用例,使相关的逻辑测试指标得以满足。

1.2 覆盖率测试方法
覆盖率测试通过对被测软件程序进行插装,并对插装后的被测软件程序编译生成可执行程序。

然后将可执行程序导入到实际环境中运行,同时执行功能、性能、接口、人机交互界面、强度、安全性、边界、恢复性测试等测试用例。

如果覆盖率没有达到软件规定要求,分析原因后,必要时补充测试用例,保证覆盖率测试指标满
足软件要求。

覆盖率测试方法流程如图1
所示。

图1 覆盖率测试方法流程图
1.3 覆盖率测试工具
Bullseye 公司提供的BullseyeCoverage 产品从可用性、可靠性和平台支持性三方面来说,是一款领先的代码覆盖率工具。

BullseyeCoverage 不仅支持Windows 下的VC 、Borland C++、Gnu C++、Inter C++编译器,还支持各种Unix 下的编译器,通过提供函数、条件/判定覆盖率来帮助测试人员快速找出尚未测试的代码,并衡量测试工作的完成程度。

BullseyeCoverage 工具主要功能包括代码插桩和动态覆盖率分析。

通过对被测软件进行自动源程序插装,BullseyeCoverage 可报告被测软件在测试执行时代码覆盖情况;另外可以通过图形化、HTML 或 xml 方式显示覆盖率测试结果,能精确地表明代码已执行的区域,从而可快速识别遗漏的测试用例,这一功能可减少重测试以及纠正软件错误。

BullseyeCoverage 作为覆盖率测试工具,具有以下特性:①能够与被测软件编译器相结合,实现源程序的自动插装;②根据输出的覆盖数据,能够快速、 清晰的分析出每个函数的覆盖率、条件/分支覆盖率等;
③通过代码覆盖率数据,帮助测试人员判断是否已经充分测试;快速定位未覆盖的软件程序,便于增加测试用例或改进测试用例没计的缺陷,进而提高软件的覆盖率。

2 BullseyeCoverage工具原理分析
BullseyeCoverage 工具先对被测代码进行“插装”,运行程序向覆盖率文件写入数据,最后分析覆盖率,其工作原理是:针对不同的编译器,设计一个和真实编译器同名的拦截器(拦截器文件存放在BullseyeCoverage 工具安装目录的bin 目录下),当覆盖编译开关打开时,C/C++源文件在编译过程中首先被这些拦截器拦截,由拦截器将一系列探针代码插入到源文件中,然后源文件再通过真实的编译器生成能够被 BullseyeCoverage 分析的二进制文件,当程序
基于嵌入式系统的BullseyeCoverage逻辑覆盖测试方法
重庆赛宝工业技术研究院 赵婷婷
• 205

被执行时,代码覆盖的情况会被自动记录到指定的test.cov 文件中去。

通过命令从该文件中获取函数、条件/判定覆盖的情况,当覆盖编译开关关闭时,拦截器直接调用实际的编译器,不再进行代码插装,生成不含有覆盖分析的二进制代码。

图2展示了覆盖开关是
否打开的差异性。

图2 覆盖编译调用关系图
针对本文采用测试计算机/目标机方式开发的嵌入式软件,实施嵌入式软件覆盖测试时,将BullseyeCoverage 测试工具软件运行在测试计算机上,并使 BullseyeCoverage 工具可用,然后重新编译被测软件(BullseyeCoverage 工具通过在程序中插桩代码来记录执行信息),生成可执行文件及覆盖率分析文件test.cov ,通过网络接口建立测试计算机/目标机通信连接,将可执行文件和覆盖分析文件test.cov 上传到目标机上,执行完测试之后,test.cov 文件中会写入本次测试的覆盖率统计数据,将test.cov 文件下载到测试计算机上进行结果查看,其覆盖测试原理如图3
所示。

图3 覆盖率测试原理图
3 覆盖率测试的实现过程
3.1 动态测试环境的搭建
为了测试Linux 平台下的嵌入式软件,搭建如图4所示的嵌入式软件动态测试环境。

测试环境由测试计算机、目标机、以太网、BullseyeCoverage 测试工具、Filezilla 工具、putty 工具等组成。

在测试计算机上安装嵌入式软件集成开发环境、BullseyeCoverage 工具、Filezilla 工具、putty 工具,测试计算机与目标机通过网线连接起来,通过Filezilla 工具向目标机上传运行程序及覆盖率文件test.cov ,通过putty
连接目标机,便于可执行程序运行。

图4 动态测试环境图
3.2 测试的详细流程
下面介绍在搭建好的动态测试环境下进行覆盖测试的过程:①将BullseyeCoverage 工具压缩包拷贝到测试计算机/opt 目录下,进行解压,然后在该目录下创建BullseyeCoverage-8.15.37文件
夹,用于BullseyeCoverage 工具的安装;
②配置工具链的环境变量:export PATH=/opt/gnu/arm/linux/bin:$PATH ,其中/opt/gnu/arm/linux/bin 为工具链arm-xilinx-linux-gnueabi-g++的绝对路径,然后重启系统,使环境变量生效;
③安装:通过命令行进入到BullseyeCoverage 工具解压后的目录,执行./install--prefix AAA --key XXX ,其中AAA 表示第①步BullseyeCoverage 工具的安装路径,如/opt/BullseyeCoverage-8.15.37,XXX 表示BullseyeCoverage 工具的安装密钥;
④安装成功后,在命令行窗口输入ls–l ,查看到编译器拦截器arm-xilinx-linux-gnueabi-g++;
⑤配置BullseyeCoverage 环境变量:export PATH=/opt/BullseyeCoverage-8.15.37/bin:$P A TH ,其中/opt/BullseyeCoverage-8.15.37/bin 为安装BullseyeCoverage 工具的bin 路径;设置test.cov 文件的路径:export COVFILE=项目工程目录/test.cov ,重新启动系统使变量生效;
⑥在命令行中输入cov01-s ,查看工具是否启动,如果未启动,输入cov01 -1启动工具;
⑦配置qt 工程g++:打开qt 工程,点击tools/option/compilers ,点击add ,Name 编辑框输入ZYNQ7000_GCC ,编译器路径选择arm-xilinx-linux-gnueabi-g++的路径,配置如图5所示,然后将界面切换到Kits 界面,编译器选择ZYNQ7000_GCC。

图5 添加编译器方法图
⑧编译源代码,对工程进行重新构建,编译成功之后在项目工
• 206

程目录下生成test.cov 文件,将test.cov 和test001.pro 文件通过Filezilla 工具上传到目标机,通过Putty 连接目标机运行可执行程序,同时执行测试用例,待被测软件执行完后,test.cov 文件中会写入本次测试的覆盖率统计数据,测试完之后将test.cov 下载到测试计算机上;
⑨在命令行输入CoverageBrowser test.cov ,打开覆盖率文件,查看文件覆盖率百分比数据,如图6所示。

图6 main.cpp的覆盖情况
图7 foo函数覆盖率情况
图6中,蓝色部分表示已经覆盖的代码,而红色表示未覆盖的代码。

覆盖统计窗口依次显示函数名、函数覆盖率、未覆盖函数的数目、条件/判定覆盖率、未覆盖条件/判定的数目,由图6可知,main.cpp 文件的main 函数已经完全覆盖,而 foo 函数尚有1个条件未被覆盖,条件/判定覆盖率为83%,为了从代码级别更加详细地了解foo 函数的覆盖情况,可以双击列表上的foo 函数,具体查看foo 函数的覆盖率情况如图7所示。

图7中行标左边的符号有各自特定的含义,如表1所示:
表1 符号含义
符号含义
→T只执行过该判定分支为真的情况→F只执行过该判定分支为假的情况TF 该判定分支的真假两种情况均被执行过
→t 只执行过该表达式为真的情况→f 只执行过该表达式为假的情况tf 该表达式的真假两种情况均被执行过
√已执行过该函数

该函数(判定分支/表达式) 未被执行
3.3 覆盖率分析
从图7可查看当前函数、条件覆盖和判定覆盖的具体情况,再根据未被测试到的代码新增测试用例,这样就可以有效提高整个工程的代码覆盖率。

例如main.c 文件foo 函数29c 行if(a<10||b<10)只执行b 大于等于10的情况,未执行b 小于10的情况,可以考虑设计新的测试用例a=10,b=5 使其能够覆盖该表达式为真的情况,执行完之后,文件覆盖率如图8
所示。

图8 文件覆盖率
3.4 测试报告生成
测试结束后,BullseyeCoverage 会以图形式给出直观的函数、条件/判断覆盖情况,另外还可以生成html 格式或xml 格式的覆盖率分析报告,代码覆盖情况报告可以间接的反映软件测试的进度,测试人员可以有针对性地补充测试用例或修改测试用例设计,增加代码的覆盖率,提高测试的充分性,还可以判断软件代码设计的缺陷。

4 总结
本文提出了一种基于嵌入式系统的BullseyeCoverage 逻辑覆盖测试
概念及方法,研究了代码覆盖率工具 BullseyeCoverage 的工作原理,并应用到实际嵌入式系统测试案例中,根据覆盖率结果,测试人员对整个工程所有文件的代码覆盖情况一目了然,能够从函数覆盖、条件/判定覆盖多个角度快速、准确地定位未测试的代码,从而有针对性地设计测试用例,提高代码覆盖率,以便发现潜在的软件缺陷,提高软件产品的质量,最终为用户提供优质的软件服务。

项目来源:重庆市技术创新与应用示范项目(项目编号:cstc2018jszx-cyzdX0083)
作者简介:赵婷婷(1991—),女,湖北随州人,硕士,软件测试工程师,主要从事计算机软件测试。

相关文档
最新文档