本文将通过演示实例介绍VectorCAST/QA如何在LiteOS-A内核上实现系统白盒测试,获取被测程序的代码覆盖信息。具体实现在支持sudo超级用户模式的Ubuntu 18.04(或以上)版本中,调试目标板是i.MX6ULL开发板(鸿蒙OS官方认可适配)。
VectorCAST/QA介绍
1.1
VectorCAST/QA功能与优势
VectorCAST工具集包含两款测试工具:针对单元集成测试的VectorCAST/C++,和实现系统白盒测试的VectorCAST/QA。区别于单元测试的测试对象是函数组件,系统白盒测试的对象则是系统整体编译后的程序。VectorCAST/QA通过集成被测项目程序的编译/构建环境和已有的测试基础架构,获取系统测试所需的关键指标。
VectorCAST/QA具有以下功能和优势:
自动对项目源代码添加代码覆盖率接口;
沿用项目已有的系统测试框架和测试用例;
获取在系统测试阶段的代码覆盖率信息;
测试用例和代码覆盖率信息逐一对应。
1.2
VectorCAST/QA工作流
VectorCAST/QA会自动对被测源文件插装(区别于单元集成测试的Stub插桩,对程序的插桩Instrumentation可以理解为插覆盖率函数接口)添加覆盖率测试接口,同时工具会在目标板的RAM 内存中分配出一段内存空间,用以存放一个固定名字的char类型全局数组,该数组实时保存覆盖率信息,用户可以通过读取该数组获取覆盖率结果,数组大小可通过工具配置选项进行设置。
VectorCAST/QA测试配置步骤
2.1
创建VCAST工程
在构建VectorCAST/QA系统测试环境之前,需要首先创建VCAST工程;
1.
通过包含全局变量定义等的脚本文件VCAST_LAUNCH.sh启动VCAST
sudo bash 。/VCAST_LAUNCH.sh 或者 source VCAST_LAUNCH.sh;
2.
在VCSAT打开后,如果需要打开已有测试项目
File-》Open 选择*vcm文件;
3.
如若需要创建新项目
若是第一次创建项目,切记需首先创建项目保存路径,File-》Set Working Directory 选择测试项目保存的路径;
可选择创建空项目New-》VectorCAST Project-》Empty Project,同时根据项目需求设定项目名称和选择交叉编译工具链;
亦或通过实际的项目选择配置包中自带的模板CFG,New-》VectorCAST Project-》From Configuration File。
2.2
配置QA测试环境
创建完VCAST工程,再创建QA测试环境从而完成环境的配置,右键Group-》Create System Test Environment-》Interactive。
配置QA测试环境共包含五个步骤,具体配置步骤如下:
1.
选择编译器
配置QA 环境的第一步需要结合具体项目配置选择编译器,本文项目选择Clang编译器,Preprocessor command 需要和目标板适配;
2.
环境命名
在配置环境的第二步骤中,自定义环境名称,例如本项目中环境命名为123;
3.
加载源文件
配置的第三步加载被测源文件,其中Base Directory指向源码最上层的父目录,然后选择目录文件中要添加到测试环境中的源文件,本文项目中只包含hello.c源文件;
4.
覆盖率类型
配置的第四步根据项目测试需求设置覆盖率测试类型,本项目选择Statement+Branch即语句分支覆盖。覆盖率类型选择的配置亦可在环境创建后针对具体被测文件的需求进行设置,可参见本文2.3章节,其他配置选项可选择默认;
5.
编译
当前述配置步骤执行完毕后,即可点击配置界面右下角的Build进行环境编译。
2.3
代码覆盖率插装
当环境编译成功后,通过双击工程视图中的环境名称进入到环境视图,勾选Tools-》Options-》Coverage-》Save data in ASCII format in memory,从而将覆盖率信息实时保存在RAM中,可通过串口等工具实时获取覆盖率信息,存储覆盖率信息的数组的大小可通过Maximum size for ASCII buffer调控,不勾选则为工具默认值,配置完成后点击Apply;
进入环境视图后可看见被添加的所有测试源文件,通过右键示例的hello.c-》Set Coverage Type可以配置要测试的覆盖率类型;
覆盖率类型设置完成后,再次选择被测文件hello.c右键-》Instrument 实现插装;如果出现某些头文件找不到的错误,可以在Tools-》options-》C/C++-》Preprocessor/Compiler-》Include Directories通过+号来添加搜索路径。(++ 代表递归的添加路径中的子路径)
执行完上述步骤后,点击File-》Close Environment关闭QA环境。在工程视图中右键环境,选择System Testing-》Apply Coverage to Source Tree-》Always,该配置选项将会使得覆盖接口代码直接插桩到被测源文件中,同时工具会对被测前的源文件进行备份,我们将在第3章节的测试实例中进行比对,至此完成QA 测试的所有配置步骤。
VectorCAST/QA测试实例
经过第2章节的配置,可以获得经过插装且带有覆盖率接口的hello.c文件,通过交叉编译工具链进行编译即可将程序烧录到目标板中进行系统测试。
3.1
插桩前后源代码对比
如2.3章节所述,hello.c源文件被插桩前将会被VectorCAST工具自动备份为hello.c.vcast.bak,文件将会保存在被测源文件路径下参见图9,图10和11进行QA覆盖率接口插桩前后的源文件对比。
下图为插桩后代码,当前打开的即是插装后的hello.c文件,vcast_ascii_coverage_data_pool便是QA工具自动创建的用以存储代码覆盖率信息的数组,其中printf(“%s”,vcast_ascii_coverage_data_pool)及后面的文件存储代码为手动添加,目的是支持本次项目调试过程中可以通过串口实时查看目标板打印的覆盖率信息,同时覆盖率结果文件存储在目标板中亦可通过其他调试方法发送给上位机,用户可以依据目标板的配置选择不同的获取覆盖率信息的方式。
插桩后代码
3.2
编译可执行文件
1.
通过交叉编译工具链对插桩后的hello.c文件进行交叉编译,获得可执行文件hello;
clang -target arm-liteos --sysroot=/home/vector123/book/openharmony/prebuilts/lite/sysroot/ -o hello hello.c;
2.
将hello存入到根目录rootfs;
cp hello /home/vector123/book/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin
3.
重新制作rootfs.jffs2,并将rootfs.jffs2烧录到目标板。
mkfs.jffs2 -s 0x10000 -e 0x10000 -d rootfs -o rootfs.jffs2
3.3
获取覆盖率结果
烧录完rootfs.jffs2文件后,上位机通过MobaXterm工具进行在线调试。
输入。/bin/hello命令运行hello程序,如图所示,获得hello.c源代码中的打印语句以及覆盖率结果信息,同时覆盖率结果存储在目标板系统中,存储地址取决于插桩时设定的文件存储路径,结果存储在根目录下的QA01.DAT文件中,如图所示;
打印语句与覆盖率结果
覆盖率存储文件
3.4
生成覆盖率报告
通过将生成的覆盖率结果文件QA01.DAT加载至VectorCAST工具进行解析,即可获得覆盖度报告,具体步骤如下:
1.
右键Environment-》Add Test Results 选择路径下的结果文件,选择QA01.DAT;
2.
添加完成后即可在左侧的环境视图中观察到覆盖率结果文件QA01.DAT,勾选该文件即可生成覆盖率报告,当有多组不同的覆盖率测试时,可以导入多个不同的测试结果文件,以实现测试和代码覆盖率的逐一对应;
3.
通过Environment-》view-》Aggregate Coverage Report即可获取到覆盖率报告,报告显示百分百覆盖。
编辑:jq
全部0条评论
快来发表一下你的评论吧 !