tag 标签: 代码的黑盒测试

相关帖子
相关博文
  • 热度 3
    2022-6-18 17:30
    1327 次阅读|
    0 个评论
    书接上回: 代码的黑盒测试(上)| 目标文件测试Object File Testing ,我们首先介绍了编译的基本过程——预处理(Prepressing)、编译(compile)、汇编(Assembly)和链接(Linking),然后着重介绍了代码黑盒测试的第一种方法——VectorCAST/C++的目标文件的测试方法,解决了在无可用源代码的情况下,对其相应目标文件的测试。 其实一个代码工程除了开发人员手写代码外,还包含了很多库文件,甚至有的库文件或是经过开发人员修改或是直接由开发人员编写的。那么对于这些文件又该如何测试呢?请看如下分解! 一、库接口测试 (一)库文件 这里的“库”,就是库文件,一般是指编译好的二进制文件,用于在链接阶段与目标文件一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。 与可执行文件不同的是,库文件无法直接执行。直观上来看,库文件的源代码中没有main函数,而只是一些函数模块的定义和实现,没有运行的入口主函数,无法直接执行。 (二)静态库与动态库 库文件可分为静态库和动态库。它们区别主要体现在程序的链接阶段——静态库的代码是在编译过程中被载入程序中的,这就说明,只要程序编译完成,程序就不受静态库的影响;动态库的代码在编译的时候并没有被编译进入程序中,只是在程序运行时根据程序需要动态的加载到内存中。 (三)相关文件的一些扩展名 1、win32平台下,静态库通常后缀为.lib,动态库为.dll 2、Linux平台下,静态库通常后缀为.a,动态库为.so 从本质上来说,由同一段程序编译出来的静态库和动态库,在功能上是没有区别的;不同之处仅仅在于其名字上,也就是“静态”和“动态”。开发人员只需要将.h/.hpp头文件和.lib/.so文件提交给其他开发人员,他们就可以直接使用.lib/.so文件中定义的函数了。静态库和动态库的具体使用由开发人员决定。 (四)库接口测试 库接口测试允许客户在没有可用源代码的情况下,对现有库文件创建测试。在测试时,可以将第三方库或者被修改的第三方库作为一个对象库文件和API定义(头文件)。可以为API创建测试用例,来验证应用程序库函数的正确性,而无需访问源代码。 在代码开发中,通常会将一些常用的函数封装成一个库,提供接口给其它程序文件调用,省去重复写该函数接口。当使用该函数时,只需要直接将所需要的文件链接到程序中即可,大大提高了开发效率。依照这个原理,我们也可以针对一些代码程序根据测试需要,将某些源代码编译生成相应的静态库文件或动态库文件,以完成代码功能测试。 二、利用VectorCAST/C++进行库接口测试 对于如何使用VectorCAST/C++进行静态库或者动态库的单元测试,下面我们仍使用上篇文章中的点餐服务程序(采用GCC编译链),来具体说明。 (一)点餐服务程序的结构内容及说明 图 1 点餐服务程序的结构内容及说明 (二)利用VectorCAST/C++进行静态库接口测试 1 、静态库文件的生成 对于这个点餐主程序manager_driver.c,我们可以将manager.c和database.c分别作为一个调用的库文件来使用,也可以一起作为一个调用的库文件来使用。本例中,将manager.c和database.c一起作为一个调用的库文件来使用。 使用一个BAT脚本生成静态库文件,脚本内容如下: set path=%VECTORCAST_DIR%\mingw\bin;%PATH% gcc -c manager.c gcc -c database.c ar rcs manager_driver.lib manager.o database.o 说明:无论静态库,还是动态库,都是在*.o目标文件基础上生成的。 2 、环境构建基本过程 VectorCAST环境构建的基本过程在 代码的黑盒测试(上)| 目标文件测试Object File Testing 有详细说明,这里不再赘述,对于不同的以及需要注意的地方,有如下说明: 本例中,我们是利用manager.c和database.c一起生成静态库文件manager_driver.lib的,所以在构建测试环境的第3步需要选择“库接口测试方法”并在“Link Options”添加该文件及所在路径,如图2所示。同时在构建测试环境的第6步添加需要的头文件,有manager.h和database.h,如图3所示。 图2 选择添加静态库文件manager_driver.lib 图3 选择添加头文件manager.h或database.h 3 、测试用例编写与执行 按照上述说明成功构建测试环境。编写测试用例及执行测试用例,结果如下图4所示。 图4测试用例编写与执行 细心的小伙伴可以注意到上图左边部分只有显示了执行状态图标,因为我们采用的该种测试属于黑盒测试方法,所以我们在构建环境的第4步,没有勾选“Whitebox”前面的复选框,自然也没有结构覆盖度图标。 (三)利用VectorCAST/C++进行动态库接口测试 1 、动态库文件的生成 与静态库文件生成类似,将manager.c和database.c一起作为一个调用的动态库文件来使用。 使用一个BAT脚本生成动态库文件,脚本内容如下: set path=%VECTORCAST_DIR%\mingw\bin;%PATH% gcc -c -fPIC manager.c -o manager_dyn.o gcc -c -fPIC database.c -o database_dyn.o gcc manager_dyn.o database_dyn.o -shared -olibmanager_drive.dll 2 、环境构建基本过程 动态库接口测试与静态库接口测试基本一致,不同的地方如下说明: 此例中,我们仍利用manager.c和database.c一起生成动态库文件manager_driver.dll,所以在构建测试环境的第3步选择“库接口测试方法”并在“Link Options”添加该动态库dll文件,如图5所示。后面的操作与静态库接口测试一致,故不在赘述。 图5 选择添加动态库文件manager_driver.dll 三、总结 本文提供了代码黑盒测试的第二种方法——库接口测试,可以利用工具为API创建测试用例,来验证应用程序库函数的正确性,而无需访问源代码,感兴趣的同学可以尝试下。 VectorCAST/C++作为Vector公司的代码动态测试工具,支持自动生成测试用例,提供完善的覆盖度信息,还可以与Git/SVN/Jekins等工具集成等等;后续也会为大家带来更多基于VectorCAST/C++的动态测试相关内容。 北汇信息作为Vector中国的合作伙伴,始终专注于汽车电子领域的新技术和新产品,为整车厂和零部件企业提供完整的研发、测试解决方案,为工程师在汽车领域提供“趁手装备“!
  • 热度 6
    2022-5-22 19:26
    1720 次阅读|
    0 个评论
    代码的黑盒测试(上) —— 目标文件测试 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 CodeWarriors IDE 生成相应的目标文件 2 、修改后的源文件 是指删除了函数具体实现的源码文件(仍包含完整的 .h 文件),如下图 6 所示。 图 6 删去函数具体实现后的 “manager.c” 3 、需求文档 由于目标文件测试属于一种软件黑盒测试,所以对于单元测试级别的需求文档的细致程度可能要达到详细设计文档的程度,甚至更细致。 如上 int Add_Included_Dessert(struct order_type* Order ) 函数,对于目标文件测试的单元需求可能这样描述: 表 1 Add_Included_Dessert(struct order_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++ 工具截图。 参考文献: 《程序员的自我修养 — 链接、装载与库》 VectorCAST/C++ 工具帮助文档