基于VectorCAST的Ada语言软件单元动态测试方法及其应用
2020-11-30曾贤福
曾贤福,谢 翔,许 进,夏 涛
(湖南中车时代通信信号有限公司,湖南 长沙 410005)
0 引言
Ada语言诞生于1979年,1980年被指定为美国军用标准语言,1983年被正式确立为一种ISO标准语言并投入使用。Ada语言被广泛应用于有高可靠性、长生存期要求的大型软件的研发[1],在军事、商业、公共交通及金融等领域的核心软件开发中发挥着重要作用。Ada语言不仅具有普通高级语言的高可靠性和高安全性,还具有抽象数据、多任务、异常处理以及类属设施等特性[2],因此其软件的动态测试技术比较复杂,目前市场上支持Ada语言的测试工具很少,VectorCAST软件便是其中之一。VectorCAST 软件是美国Vector Software公司推出的软件测试解决方案,它能为用户提供一整套自动化测试体系,特别适用于安全性与可靠性要求较高的嵌入式软件。
VectorCAST支持Ada及C/C++等嵌入式源代码,自动生成测试代码来为嵌入式环境构造可执行的测试架构。VectorCAST 工具可以创建测试环境,生成测试用例,实现自动化测试,进行静态分析和覆盖分析(包括语句覆盖、判定覆盖、修正的条件/判定覆盖等)[3],其最大的特点就在于能够实现最大限度的自动化测试且更适用于嵌入式环境。本文以CTCS2-200C型列车控制车载设备主机软件(Ada语言编码)测试为例,提出了一种利用VectorCAST测试工具在Adamulti编译环境下来实现Ada语言软件单元动态测试活动以及回归测试功能的方法。
1 测试环境的配置
本文测试环境需要安装VectorCAST测试工具(2018 SP1)和Green Hills Adamulti (v4.0.7) 编译软件。其中,VectorCAST用于测试用例编写及执行,Adamulti用于用例的编译和调试。
1.1 安装VectorCast软件
安装VectorCAST测试工具软件前,需先安装Green Hills Adamulti编译工具软件。按照默认方式安装VectorCAST测试软件,完成后若提示没有证书,则点击“确定”后在弹出的“Licence Setup” 窗口选择“Skip this Step”即可,之后再处理证书的问题。在安装好的VectorCAST文件夹下找到“LMTools”图标并打开,即可开始设置证书,其界面如图1所示,具体操作为
(1)点击“Config Services”选项卡,设置如下参数:
勾选界面下方两个复选框,即可实现证书服务的开机自启。
(2)设置完成后,点击“Save Service”;
(3)此时切换至“Start/Stop/Reread”选项卡,会看见刚才保存的服务名称,点击“Start”;
(4)通过“Server Status”选项卡,可查看当前服务状态。
图1 证书设置Fig. 1 Certificate setting
1.2 基于Green Hills Adamulti编译环境的配置
设置环境变量名称为“VECTOR_LICENSE_FILE”,值为<证书文件路径>,建立Green Hills项目:
(1)打开命令行窗口,输入指令“Set PATH =%VECTORCAST_DIR%; %VECTORCAST_DIR%MinGWin;<Cygwin安装目录>in; %PATH%”以设置环境变量,如图2所示。
图2 设置环境变量Fig. 2 Setting environment variables
(2)拉取Green Hills工程
首先用cd指令切换至create_ghs_project.py文件所在位置,然后,执行“vpython create_ghs_project.py --destination <要建立工程的目录>”。
(3)配置仿真环境
首先将strip_address.py文件拷贝至工程目录下的src文件夹中并用cd指令切换至该位置,然后执行“vpython strip_address.py --gpj project.gpj”。工程目录的lcap1, lcap2, lcap3和lcpl文件夹下都有src文件夹,由于前三者代码是一样的,只需在lcap1和lcpl下的src文件中执行上述操作即可。配置仿真环境如图3所示。
图3 配置仿真环境Fig. 3 Configuration simulation environment
2 测试主要步骤
在创建测试环境时,VectorCAST根据被测代码和开发环境自动创建测试套件,测试人员可以根据测试需要创建测试用例,实现不同的测试需求。单元测试是对被测单元设计测试用例,执行待测程序时通过自动打桩,分析实际运行程序的输出结果与预期结果,最终确定语句覆盖率(Statements)、分支覆盖率(Branches)和修正条件/判定覆盖率(MC/DC)的是否达到设计要求。
2.1 测试工程创建
在VectorCAST界面下,按File → New → Ada Target Environment → Coldfire Green Hills Simulatro/Target顺序依次弹出测试环境窗口,开始创建VectorCAST测试工程,操作如下:
(1)选择编译环境及链接信息。
(2)为该测试环境命名。
(3)选择测试覆盖率类型,结合被测软件其自身特点,应选择语句覆盖率(Statements)和修正判定/条件覆盖率(MC/DC)来进行测试覆盖率统计。
(4)添加被测软件工程路径。
(5)选择被测单元和桩,此时软件界面如图4所示。从左侧的组件列表中选出需要的组件分别放入右侧的分类中, UUT(unit under test)表示被测单元,被测组件需要添加至该项;STUB表示桩,默认情况下软件会自动对所有用到的非被测组件打桩,因而可不填写;DONT_STUB和IGNORE表示非桩,归入此分类的组件不会被打桩,在测试执行时直接运行原函数,但测试用例无法直接对该组件的变量进行设置,因而当被测组件调用了类属组件(以generic关键字声明)时,应将该类属组件添加至该分类。
(6)测试人员可以选择增加测试所需的用户代码。
(7)保存选择环境后构建测试工程。
图4 测试工程环境构建Fig. 4 Environment constitution of testing project
2.2 测试用例创建
测试人员应根据软件详细设计说明书中的函数功能、输入输出和流程图设计模块测试用例,采用等价类及边界值测试技术来实现软件单元测试。VectorCAST支持多种形式的输入输出参数(包括最大值、最小值、中间值、输入参数范围、输入值列表、外部数据源等)自动生成测试用例,不需要测试人员编写测试代码,测试工具自动产生软件测试的驱动、桩模块,从而节省时间,使测试人员可将重点放在测试用例设计上,全面覆盖测试项点,提高软件测试效率。VectorCAST中,可以通过以下4种方式构建测试用例:
(1)Insert Test Case,插入一个空的测试用例;
(2)Insert Min Mid Max,按照最小值、中间值、最大值自动生成测试用例;
(3)Insert Basis Path Test Cases,按照基础路径自动生成测试用例;
(4)Insert Partitioned Test Case,按照等价类划分自动生成测试用例。
以Trigger_Back_Slide 函数为例(存在两个判断条件)设计测试用例。选取“Insert Basis Path Test Cases”测试方式生成测试用例(图5),按照路径的方式生成3个测试用例。
第一个测试用例设计描述:(1)if not Back_Slide_Triggered ==>FALSE。
第二个测试用例设计描述:(1)if not Back_Slide_Triggered ==>TRUE;(2)if (Speed_Warning_Sound_Play_Status = FALSE) ==>FALSE。
第三个测试用例设计描述:(1)if not Back_Slide_Triggered ==>TRUE;(2)if (Speed_Warning_Sound_Play_Status = FALSE) ==> TRUE。
这些测试用例会遍历代码中的所有不同路径,然后保存实际的测试用例结果,帮助设计者识别可能影响代码可靠性和安全性的潜在异常状况,以便尽早发现软件设计缺陷。
图5 测试用例创建Fig. 5 Create of test case
一般情况下,测试用例仅调用一次被测函数;但在某些情况下,为了满足用例的条件需要依序执行多个函数,此时应先为每个需要被执行的函数编写一个子测试用例,然后再编写一个复合测试用例来调用子测试用例。复合测试用例本身不包含输入和期望,仅通过调用子测试用例来完成测试。
2.3 测试用例编辑
测试用例创建后,可看到测试用例的参数表格。被测组件被设置为UUT类型,打桩的组件被设置为ST,组件的子项中<GLOBAL>表示该组件静态/全局变量(测试人员可以根据测试需求设置变量),变量只在当前测试用例有效,用例之间相互不影响。测试人员可以根据测试需要设置桩函数的输入与输出,与此同时,也可以勾选“Units Under Test”中特有的<SBF>项目里的被测函数对其强制打桩。强制打桩后,被调函数完全被桩函数替代(图6)。VectorCAST可以为桩函数设置多个不同的输入与输出,也可以支持复杂的结构或对象变量。桩函数的设置只需在测试用例界面操作即可实现,该界面提供被测单元所有调用的桩函数,测试人员可以灵活设置桩函数的输出或者返回值,且每个用例设置的桩函数具有独立性,可消除各用例之间的互扰,大幅提高测试效率。
图6 桩函数设置Fig. 6 Setting of stub function
2.4 测试用例执行及覆盖率统计
测试用例设置完成后,开始自动执行测试用例。执行过程中,测试工具根据之前的设置自动计算覆盖率的统计,当遇到条件判断复杂的函数模块时,VectorCAST可以自动分析被测函数中MC/DC条件组合并产生MC/DC的测试组合条件,帮助测试人员设计测试数据。
以cvc_lcap_app_ctl_back_slide(防溜功能逻辑控制单元)所属函数Is_Back_Slide_Active(判断是否触发防溜功能)中如下表达式为例:
MC/DC覆盖分析如图7所示。上述表达式中有Ca,Cb, Cc, Cd和Ce共5个条件。借助VectorCAST进行分析,全部条件组合有32种,满足Pa,Pb,Pc,Pd及Pe 5种条件组合配对,即16/32组合配对可满足Pa;同样8/16组合配对可满足Pb;12/16组合配对可满足Pc;14/16组合配对可满足Pd;15/16组合配对可满足Pe。综合分析,选取8,12,14,16和32共计5种条件组合,Pa,Pb,Pc,Pd及Pe可以同时满足,即最少设计5个测试用例就可实现MC/DC覆盖。
图7 MC/DC等价类分析矩阵Fig. 7 MC/DC equivalence analysis matrix
通过分析MC/DC覆盖率执行情况,可以设计最少的测试用例来满足覆盖率要求,从而提高测试效率。分支语句前会出现( “ * ” 为“ T ” 或“ F ” ) , 表示该条件的TRUE 或FALSE在选定的测试用例中已被覆盖[4]。VectorCAST测试完成后,自动生成测试报告,通过查看测试报告可以确认被测函数的语句覆盖率、分支覆盖率、MC/DC组合覆盖率是否均达到100%(图8),大大提高了单元测试报告编写的时间效率。如果覆盖率达不到测试规范要求,需要分析是软件设计问题还是测试用例设计不全面导致的问题:如果是测试用例设计有遗漏,则需要补充完整的测试用例来达到覆盖率要求;如果是软件存在问题而导致覆盖率不足,则记录相关的问题并报告,后期由设计人员修改且关闭问题。
图8 测试报告覆盖率统计Fig. 8 Coverage statistics of testing report
2.5 回归测试
在进行回归测试时,首先需要使用AdaMulti编译变更后的代码,然后在VectorCAST软件中选择“Environment→Incremental Rebuild”,VectorCAST即会对环境进行重建,完成后即可修改或新增测试用例以满足覆盖率要求。为方便在不同目录乃至不同计算机上进行自动化的回归测试,VectorCAST还提供了回归脚本的方式,选择“Environment→Create Regression Scripts”后,测试工具会自动生成.bat,.tst和.env这3个文件;只要将3个文件放在同一目录下,运行.bat文件,即可自动完成从建立测试项目、导入测试用例.tst文件、执行测试到生成测试报告的完整的回归测试过程。为了保证在软件修改后测试库中测试用例的有效性,必须对测试用例库进行维护。通过查看测试报告,以确定是否需要修改原有的测试用例或者需要添加新的测试用例,新的测试用例用于测试软件的新特征或者覆盖现有测试用例无法覆盖的软件功能。以CVC_LCAP_APP_GST_DEGRADE组件为例,将CVC_LCAP_APP_GST_DEGRADE组件后缀为. bat,.tst和.env的3个文件放在同一个文件夹内运行回归测试批处理UT_regression_all.bat文件,运行完后自动生成测试工程,同时会生成测试报告(图9),通过查看测试报告以发现软件设计缺陷与问题。
图9 回归测试Fig. 9 Testing regression
3 测试效果分析
基于VectorCAST测试工具,自动创建测试用例和生成测试报告,完成软件单元测试技术分析。本文从各项测试工作分配比例和千行代码测试工作耗时两方面,将以往测试工具与VectorCAST测试工具单元测试方法进行了横向比较,结果如图10和图11所示。可以看出,基于VectorCAST测试工具单元的测试方法已将测试重心转移到用例设计和用例执行上,使测试用例的设计更充分和完善,使手动测试报告生成工作量至少减少一半。从测试效率方面分析,使得千行代码的测试时间节省了23 h,测试效率提高了约22%。
图10 单元测试工作分配比例对比Fig. 10 Comparison of unit test work allocation ratios
图11 千行代码单元测试耗时对比Fig. 11 Comparison of unit test time
4 结语
本文对VectorCAST自动化测试工具在Ada语言软件测试中的应用进行研究,基于Green Hills AdaMulti编译环境,重点介绍软件单元测试的实现方法,通过VectorCAST自动化测试工具实现Ada语言软件的单元测试,极大程度地降低了测试人员的工作量,同时提高了软件测试效率,也为其他安全类软件测试提供有效的参考。鉴于目前有关VectorCAST测试工具的资料比较少且Ada语言具有特殊性,采用VectorCAST测试工具对Ada语言软件进行集成测试将作为下一步的研究方向。