代码的黑盒测试(上)
——目标文件测试Object File Testing
听说,VectorCAST又出新功能了?不需要源码就可以测试?
瞎说,这功能我们一直就有,只不过哥不在江湖,江湖不多闻而已。
一、 目标文件
(一)目标文件是什么
我们都知道,一个C源程序manager.c(是一个点餐demo程序,且本文对manager.c的相关操作都是在Windows平台实现的。)变成可执行程序manager.exe,一般经历四个过程,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking),如下图所示:
图1编译过程
目标文件是源代码在经过预处理、编译、汇编过程后输出的文件(源代码编译后但未进行链接的中间文件),其内容至少包含机器指令代码,数据以及链接时所须要的一些信息。
(二)目标文件的结构组成简介
目标文件中的内容信息一般按照不同的属性,以“节”(Section)的形式存储,也叫“段”(Segment),它们都表示一个一定长度的区域。
目标文件的结构组成主要包含:代码段.text(存放机器指令代码)、数据段 .data(存放已初始化的全局变量和局部静态变量的数据)、.bss段(存放未初始化的全局变量和局部静态变量)。
我们通常使用binutils的工具objdump来查看目标文件内部的结构,以manager.o为例,如下图2所示。
图2 manager.o
二、使用VectorCAST/C++进行目标文件测试
VectorCAST/C++是Vector公司旗下一款集成的软件测试解决方案,可显著减少验证安全关键型和任务关键型嵌入式系统所需的测试C/C++软件组件的时间、精力和成本。
VectorCAST/C++不仅支持白盒下的功能测试和结构覆盖测试,也支持黑盒下的软件功能测试——目标文件测试(Object File Testing)和库接口测试(Library Interface Testing)。
目标文件测试就是使用目标文件通过VectorCAST工具生成测试套件而进行的功能测试;库接口测试方法是指VectorCAST将解析C/C++头文件中存在的函数和方法的定义,并基于这些创建测试环境,允许在没有可用源代码的情况下使用现有库或DLL创建测试。本次主要讲解VectorCAST/C++的目标文件测试方案,以manager.c源文件为操作对象,使用GCC编译器进行编译。
(一)测试输入物
1、目标文件。
a.单个.obj/.o文件生成方式
前提条件:该.c文件“涉及”到的.h文件都能正确引用
gcc -c source.c(默认在原路径下生成一个同名的.o文件),如下图3所示。
图3 单个文件manager.o的生成
b.多个.obj/.o文件生成方式
前提条件:每个.c文件“涉及”到的.h文件都能正确引用
gcc -c source1.c source2.c source3.c或gcc -c *.c(默认在原路径下生成相应同名的.o文件),如下图4所示。
图4 多个目标文件的生成
对于其他编译链,可以通过IDE(集成开发环境)生成项目的目标文件。如CodeWarrior,其一般可以通过其IDE生成相应的目标文件,如下图5所示。
图5 CodeWarriorsIDE生成相应的目标文件
2、修改后的源文件
是指删除了函数具体实现的源码文件(仍包含完整的.h文件),如下图6所示。
图6 删去函数具体实现后的“manager.c”
3、需求文档
由于目标文件测试属于一种软件黑盒测试,所以对于单元测试级别的需求文档的细致程度可能要达到详细设计文档的程度,甚至更细致。
如上int Add_Included_Dessert(struct order_type*Order)函数,对于目标文件测试的单元需求可能这样描述:
表 1 Add_Included_Dessert(structorder_type* Order)的单元需求说明示例
即需要明确给出了Add_Included_Dessert(struct order_type* Order)函数的输入与输出值。
(二)VectorCAST/C++进行目标文件测试
1、单元测试操作步骤:
a.启动工具,设置工作路径,创建新工程并命名,选择正确的编译链(以GCC编译链为例);
b.进入创建测试环境(8大步)。
Step1:选择编译器,已在前面配置好了,直接跳过。
Step2:命名测试环境(默认字母大写,空格为下划线)。
Step3:测试方式。选择目标文件测试方式,然后选择待测目标文件manager.o。如下图7所示。
图7 选择待测目标文件“manager.o”
Step4:构建选项。要选择Code Coverage为None,VectorCAST才会使用之前编译的目标文件。
Step5:本地源代码文件。使用双加号添加包含修改后的源文件所在路径。
Step6:选择UUTs和桩。
Step7:User Code可选选项。本实例不需要,直接跳过。
Step8:测试环境配置概览。成功构建测试环境,如下图8所示。
图8 成功构建测试环境
c.构建测试环境后,我们就可以根据测试需求(功能需求,表1中序号1),创建和执行测试用例,如下图9所示。
图9 创建、执行测试用例
2、集成测试
集成测试工程构建内容与单元测试很类似,仅在构建测试环境的第3步和第6步不同。集成测试一般会在第3步将相应的多个.o文件同时加进来;第6步将相应的多个修改后的源文件同时加进来。
然后使用组合测试功能,将单体测试用例按照一定的逻辑功能进行排列,执行组合测试用例。
三、总结
目标文件测试过程中,使用修改后的源代码进行测试,可以将一些核心算法的代码实现部分进行删除,能够较大程度的避免直接使用源代码,更好的保护客户代码。
当然进行目标文件测试的要求比较高。需要完善的测试需求文档,对于单元测试来说,一般需要软件详细设计文档以及单元需求文档等,对于软件集成测试来说,一般需要软件架构设计规范文档及集成需求文档等。
此外目标文件测试,只能进行功能测试,没有结构覆盖度。为了得到覆盖度信息,我们还是要转向白盒测试。将之前的测试用例导入到白盒测试工程中的测试环境中去执行,获取覆盖度。
北汇信息专注于汽车电子测试,提供专业的汽车电子测试系统搭建及测试咨询服务;提供完整的汽车新能源测试服务;提供完整的软件生命周期的软件测试服务。
VectorCAST/C++作为Vector公司的代码动态测试工具,支持自动生成测试用例,提供完善的覆盖度信息视图,还可以与Git/SVN/Jekins等工具集成等等。
本次为大家简单介绍了VectorCAST/C++在软件测试方面的软件黑盒测试。后续将会为大家带来更多基于VectorCAST/C++的动态测试相关内容。同时也欢迎垂询和沟通,共同探讨测试相关问题。
文中图片来源于VectorCAST/C++工具截图。
参考文献:
[1] 《程序员的自我修养—链接、装载与库》
[2] VectorCAST/C++工具帮助文档