tag 标签: VectorCAST

相关帖子
相关博文
  • 热度 3
    2022-6-18 17:30
    1328 次阅读|
    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++ 工具帮助文档
  • 热度 8
    2022-5-22 11:39
    918 次阅读|
    0 个评论
    前言 随着汽车日益互联化、智能化和电动化,硬件组件的抽象化,软件功能变得愈发复杂——汽车正在从基于硬件的创新转向基于软件的创新,并且软件安全和质量越来越受到制造商和消费者的关注,而传统的工具和流程可能无法满足汽车发展与应用的实际需求。为了解决这些安全和质量方面的问题,汽车工业已经采用了ASPICE标准和ISO 26262标准,它们为电气和电子系统的开发提供了最佳的实践。 单元测试是软件测试阶段最基本的测试,它能够消除深度未知隐患。它反馈更快,更省时间。此外,ASPICE过程及ISO26262安全规范同样对单元测试提出了相关要求。 软件详细设计文档为单元测试提供了基础的输入参照。从ASPICE角度来说,没有详细设计文档是无法进行单元验证或测试的。这表明,详细设计文档指导着单元测试过程的所有活动。同时,使用像VectorCAST/C++这样的专业工具,高效进行功能测试的同时,保证了代码的覆盖度,符合ASPICE和ISO26262行业规范要求。 1、WHY:(软件详细设计文档与单元测试的基本关系) 1.1从V模型角度 图 1ISO 26262里面的V模型 V模型是在快速应用开发(Rapid Application Development,RAD)模型基础上演变而来,其特点就是它清楚的标识了开发和测试的各个阶段以及他们之间的对应关系;左边部分是软件开发阶段,右边部分是软件测试阶段。从上图中我们可以看出,软件详细设计文档对应着软件单元测试,所以要想做好单元测试,就必须有软件详细设计文档作为输入,同时要求测试工程师对软件详细设计文档有着深刻的理解。 软件详细设计文档应在编写代码之前完成,软件代码是对软件详细设计文档的具体实现,软件单元测试则是以软件详细设计为参照,判断软件代码是否符合软件详细设计文档的工作。 1.2软件详细设计文档是测试输入的基础参照之一 图 2软件详细设计文档是测试输入的基础参照之一 VectorCAST/C++可以为单元测试和集成测试提供高度自动化的解决方案,能够显著提升开发人员在验证安全和任务关键型嵌入式系统方面的工作效率。广泛应用于航空电子、医疗设备、汽车、工业控制、铁路和金融行业。 如上图所示,将详细设计文档和单元需求文档结合起来,会大大的提高编写测试用例效率。特别是对于那些颗粒度较大的“单元需求文档”,需要结合软件详细设计文档,从颗粒度较大的需求提取出有效的部分来进行功能测试。 软件详细设计文档与单元需求文档相辅相成,所以软件详细设计文档在单元测试中有着十分重要的作用。 然后,通过相应的源代码使用VectorCAST/C++工具创建测试工程,接着通过VectorCAST/C++工具为需求测试自定义编写测试用例,同时将需求映射到测试用例,形成测试用例与单元测试需求、测试用例与代码覆盖度之间的双向可追溯性,并且可以在最后的测试报告中体现出来。 1.3快速理解功能需求,降低沟通成本 如果负责该项测试测试的人员对项目内容了解很有限的话,这就免不了与开发人员进行频繁的沟通。即使是一个公司内部进行测试,只要不是开发人员来进行测试,一般也避免不了与开发人员进行沟通,但是如果有了软件详细设计文档,测试人员可以快速了解开发内容,理解功能需求,降低与开发人员沟通时间与次数,而且能够较完整的完成其单元测试。 图 3有无软件详细设计文档对测试周期和沟通次数的影响示意图 2、WHAT:(什么是软件详细设计文档) 2.1详细设计基本概念 详细设计是为了确立每个模块的实现算法、数据结构以及接口定义,用适当的方法表示算法和数据结构的细节。 它通过一些设计描述工具,无歧义的描述过程单位的相关细节。详细设计产生的主要文件就是软件详细设计文档。 此外,软件详细设计文档一般来源于软件架构设计的进一步分析。在软件架构设计活动中,设计了软件组件和组件间接口。 软件详细设计则是对软件组件的进一步分解和设计,一般包含三个方面:软件单元,软件单元的内部逻辑和软件单元间的交互逻辑。 图 4软件详细文设计文档包含的内容 2.2详细设计文档基本内容 由于自然语言不具有单义性,所以要进行无歧义的描述软件过程单元细节,就必须使用一些特定的设计描述方法。详细设计采用的方法一般有程序流程图、HIPO(Hierarchy plus Input Process Output)图、N-S图等,还有其他描述说明形式(如图5)。使用这些方法就是来规范和辅助说明算法、数据结构和接口相关细节的。 这些细节涵盖了数据结构定义,全局变量和宏定义描述,动态行为描述(比如任务,中断和需求方案分析等),每个函数的设计(比如输入、输出、流程图、伪代码等)等。 图 5软件详细设计文档包含了GetStopSigLevel函数的定义 3、HOW:(软件详细设计文档在VectorCAST/C++工具中的应用) 3.1为测试用例的数据提供依据 图 6单元需求文档csv文件 Key:FR6 ID:FR6 Module:requirement3 Title Description:"The signal light_intensity shall be an input to lights control. Its value shall range from 0 to 100." 图 7需求文档csv文件中的某条需求 如上图标黄区域,说明了“light_intensity”变量变化范围是0~100。所以根据这条详细设计文档说明,就可以正确编写测试用例,并保证了测试用例数据是有实际意义的,避免像“light_intensity=120”等这样无意义的赋值 。 图 8具有意义的测试用例并通过 图 9无意义的测试用例并失败 3.2VectorCAST/C++工具RGW功能 图 10通过工具实现软件单元需求与测试用例关联 VectorCAST/C++提供一个RGW(Requirements Gateway)功能。VectorCAST/C++支持与一些需求管理系统Polarion、DOORS、RequisitePro等进行集成,同时支持需求管理系统导出的CSV等格式文件。 对于经过软件详细设计文档印证的需求文档,我们可以按照这些结构文件编写,使需求文档契合VectorCAST/C++工具,使用该功能。可以实现软件单元需求、测试用例和代码覆盖率之间的可追溯性,并允许将单元需求导入,映射到测试用例。 这样可以帮助测试人员,当需求发生更新或迭代时,能够快速更新测试用例或编写测试用例,提高工作效率。 所以软件详细设计文档,在很大程度上为项目团队提升了测试效率、提升工作的自动化率。 3.3批量生成测试用例 对于那些详细设计文档里的某些函数,若具有一般数学表达式的功能的函数且我们可以事先确定好它的输入与输出的,可以通过VectorCAST/C++工具提供的CSV Mapping功能来批量构建测试用例。 图 11包含测试所需数据的CSV文件 首先我们根据函数关系确定好一系列的输入值和期望值形成CSV文件,然后将CSV文件加载到工具中,接着确定好数据列与测试用例模板里变量的对应关系,最后选择创建测试用例。 通过上面操作我们就会快速生成一系列的测试用例。 图 12对应测试用例模板变量与CSV文件列的关系并生成测试用例 总结 众所周知,进行单元测试不仅可以尽早地发现错误,还容易发现深层次问题,并能快速定位问题的来源,针对相关需求,向开发人员进行反馈,小步快速迭代,高效的实现正确的需求和代码。而详细设计文档不仅为开发提供了标准,也为后续的测试提供了参考。通过VectorCAST/C++联系实际问题,能快速的完成动态单元测试。 北汇信息专注于汽车电子测试,提供专业的汽车电子测试系统搭建及测试咨询服务;提供完整的汽车新能源测试服务。当然在代码测试方面,我们也有完整的代码测试解决方案。 VectorCAST/C++作为Vector公司的代码动态测试工具,既可以用于手写代码,也可以用于自动生成代码的测试,如模型转代码的测试。 本次为大家简单介绍了软件详细设计文档在单元测试过程的一些简单应用。后续将会为大家带来更多基于VectorCAST/C++的动态测试相关内容。 注:文中图片来源于ISO 26262、VectorCAST/C++(Vector)。 参考文献 VectorCAST/C++相关文档 仨人谈起·基于模型开发(MBD)场合,模型设计可以等同于软件详细设计吗?