基于VectorCAST针对iDRT车载控制软件的单元测试

2021-06-01 09:47
中国科技纵横 2021年3期
关键词:单元测试测试用例用例

(上海电气集团智能交通科技有限公司,上海 200233)

1.系统概况及测试依据

基于数字化磁标签的列车运行管理系统,是数字轨道捷运系统的关键子系统。系统综合运用高精度定位和循迹导向技术、电子地图技术、车路协同技术、智能感知与控制技术,与虚拟轨道胶轮电车智能控制相结合,保证数字轨道胶轮电车循数字化磁钉轨道(含电子道岔)运行,实现数字轨道列车的运行控制以及安全防护、辅助与驾驶和列车运行监控等功能[1]。

iDRT车载控制软件作为基于数字化磁标签的列车运行管理系统的新型轨道系统中重要的车载控制设备软件,需依据EN50128标准进行软件测试,开展重要软件的测试工作。标准要求所有含有软件的具有安全含义的系统都应分配一个软件完整性级别(SIL),范围从0~4。标准以一些“规范”和“信息”的方式详细描述了为适合于每个SIL而必须开展的软件开发活动以及必须生成的活动完成证据[2]。

其中代码覆盖率在铁路控制和防护系统的软件代码测试中愈来愈受重视,这不仅是由于功能安全规范(如国际标准EN50128)的高度推介,更是来自于研发组织内部对提升软件代码质量的迫切需求。

EN50128标准描述了软件安全完整性等级,并规定了对于人员及其职责、生命周期、文件材料方面的要求。内容还对目标、输入文件、输出文件进行了详细描述,并对软件需求规范、体系结构、设计和执行、验证和测试,以及软件/硬件集成、软件确认、质量保证和维护提出了要求见表1。

表1 EN 50128代码测试覆盖需求

其中覆盖需求包括:

(1)Other test coverage criteria can be used,given that this can be justified.These criteria depend on the software architecture(see Table A.3) and the programming language (see Table A.15 and Table A.16).

(2)Any code which it is not practicable to test shall be demonstrated to be correct using a suitable technique,e.g.static analysis from Table A.19.

2.单元测试理论及方法

iDRT车载控制软件作为安全苛刻设备,其安全完整性等级不低于SIL2,其中对于软件覆盖率提出了要求,使用VectorCAST结合Tornado开发环境的vxSim进行单元测试、集成测试[3]。

首先需要了解什么是软件单元,在CMMI管理体系中定了软件中的最小可测试单元为软件单元(一般是指单个的软件函数),而单元测试即对最小可测试单元进行检查和验证,即对函数或一个类的方法进行测试等。

单元测试的基本原则:宏观上,单元测试要符合 AIR原则:A: Automatic(自动化)、I: Independent(独立性)、R: Repeatable(可重复);微观上,单元测试代码层面要符合 BCDE 原则:B: Border,边界性测试,包括循环边界、特殊取值、特殊时间点、数据顺序等;C: Correct,正确的输入,并且得到预期的结果;D: Design,与设计文档相符合,来编写单元测试用例;E: Error,单元测试的目的是为了证明程序有错,而不是证明程序无错。

为了发现代码中潜藏的错误,我们需要在编写测试用例时有一些强制的错误输入(如非法数据、异常流程、非业务允许输入等)来得到预期的错误结果。

一般的单元测试策略有三种:孤立的单元测试策略(Isolation Unit Testing);自顶向下的单元测试策略(Top-Down Unit Testing);自底向上的单元测试策略(Bottom Up Unit Testing)。

集成测试:也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。

系统测试 System Testing:是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。这种测试可以发现系统分析和设计中的错误。

3.测试工具VectorCAST的使用及拓展

在单元测试环节,使用VectorCAST/C++(VectorCAST用于单元/集成动态测试的工具)实现了函数级别的代码覆盖和功能验证,编辑自动对被测项目软件实现函数级的插桩处理(Instrumentation on the Function level),采用图形用户界面执行测试[4]。

3.1 启动VectorCAST并新建一个测试环境

设置编译器Compiler为 Wind River -> VxWorks ->VxWorks 5.x -> VxSim;输入环境名称“Tornado_demo”,设置测试方法,选择“Traditional Method”,选择White-Box;测试文件目录,比如这里我将被测试文件放在“C:VCASTExamplesTimer”目录下,则这里选择添加该目录。

3.2 在VectorCast上进行单元测试

依据上面的步骤就已经将VectorCast与Tornado的Vxsim连接好,在运行测试用例时,自动会在VxSim跑用例,下面简单介绍如何在VectorCast上进行单元测试的步骤:

选择某一个函数右键菜单,选择“Insert Basis Path Test Cases”添加用例,则生成的用例是根据函数的判断分支生成测试用例。当然也可以根据项目要求选择MC/DC等其他方式生成用例。此时生成测试用例如图1所示。

图1 单元测试执行的代码分支

执行测试用例并观察测试用例所执行的判断分支,第一个用例需要执行的分支是“if(initiated == TRUE)”。通过正确设置全局变量initiated为1和返回值,使得第一个用例执行“if(initiated == TRUE)”。同时可以通过勾选用例查看语句覆盖情况,查看代码已经覆盖了对应的分支如图2所示。

图2 测试用例执行后的语句覆盖情况

3.3 多个被测文件开展单元测试方案

iDRT车载控制软件主要实现车辆循迹导航控制功能,需要进行单元测试、集成测试的代码量比较大,为了能更有效得使用VectorCast进行完成单元测试,提出了一些测试要求及测试步骤,包括:(1)首先针对于每一个被测的.c文件建立一个测试环境,在集成测试中将两个关联紧密的.c文件建立一个测试环境,环境名称一般命名为“配置项名称-文件名称-001”。(2)为了保证测试的充分性,一般要求单元测试的各种覆盖率都达到100%;语句覆盖要求所有语句至少执行一次;分支覆盖要求程序中每个判定的“真”值和“假”值都至少执行1次,即程序的每1个分支都至少遍历1次。(3)代码的分支中如果存在多条件组合情况,为了实现各种条件组合的遍历,测试用例的数量将呈指数级增长,测试效率降低。为避免这种情况,采用MC/DC覆盖取代条件组合覆盖,用很少的测试用例即可实现多条件中的每个布尔操作数都独立影响判定结果。(4)通过MC/DC覆盖自动生成测试用例,查看每个用例的路径,对应路径设置对应的输入、输出及全局变量,如果是输出变量的,需要设置预期值。(5)对函数所调用的函数,可以先不打桩,通过调用查看两者之间的接口是否正常,如果出错,可以结合代码审查查看被调用函数的问题后,再打桩,完成覆盖。桩函数信息填写必须完整。(6)对于系统函数需要打桩,先不执行,在测试环境中添加系统函数后,重新更新环境[5]。

3.4 利用VBA自动生成单元测试记录文件

利用VBA编写抽取VectorCAST测试数据文件的宏代码依据执行过程写入CMMI管理体系制定的单元测试记录和集成测试记录文件中,最终快速自动生成相关单元测试记录和集成测试记录的Word文档,规范化完成项目资料归档[6]。

(1)准备单元测试记录模板,见表2所示。

表2 单元测试记录模板

(2)依据软件设计文件整理好被测单元信息,见表3所示。

表3 软件设计文件被测单元信息

(3)在Office Word中执行已经编写好VBA源码实例,VBA源码实例详解以下内容:

(4)生成相关函数的单元测试记录见表4所示,通过VBA自动完成文件合并,生成针对每一个.c文件的单元测试记录。

表4 函数的单元测试记录

4.总结

软件集成测试是根据软件结构设计,是将单元测试的各个软件模块按照功能、接口等方式逐步整合,测试软件单元之间、软件单元与已集成软件之间的接口关系是否正确,并且符合软件设计要求。VectorCAST测试工具也提供了软件集成测试方法。集成测试一般采用黑盒测试为主,白盒测试为辅,通常采用增量集成的方式逐级进行,有自上而下和自下而上2种方式。对于软件单元之间的所有调用关系,集成测试需要达到100%的覆盖率。

通过VectorCAST测试工具在新型轨道项目中车载嵌入式软件单元测试中提出了切实可行的改进软件设计的质量管理方法和措施。在对iDRT车载控制软件进行单元测试的过程中,实现了多人协同进行嵌入式软件测试流程的可能。同时,iDRT车载控制软件对标安全性指标需小于10-6次/小时的失效概率。需要达到快速完成研发和产品化,同时又能够满足相应的安全性标准,就必须采用先进的测试流程和工具进行质量管理。工具的使用以及自行的文档生成开发,能够大大减少了复杂的重复劳动,起到了事半功倍的作用。

猜你喜欢
单元测试测试用例用例
UML用例间包含关系与泛化关系的比较与分析
UML用例模型中依赖关系的比较与分析
基于SmartUnit的安全通信系统单元测试用例自动生成
联锁软件详细设计的测试需求分析和用例编写
從出土文獻用例看王氏父子校讀古書的得失
基于混合遗传算法的回归测试用例集最小化研究
基于依赖结构的测试用例优先级技术
一年级上册第五单元测试
一年级上册一、二单元测试
软件回归测试用例选取方法研究