基于EFSM模型的铁路信号安全软件单元测试技术研究
2023-11-27李一楠孙文哲赵晓宇刘雅晴
王 飞,李一楠,孙文哲,赵晓宇,刘雅晴
(中国铁道科学研究院集团有限公司 通信信号研究所,北京 100081)
随着我国高速铁路的快速发展,保证列车运行安全成为铁路关注的重点[1-2]。中国列车运行控制系统3级(CTCS-3,Chinese Train Control System-3)是我国自主研发的列车运行控制系统,在投入使用之前需要对其做大量的测试工作,确保其功能的正常使用[3]。其中,单元测试是软件测试最基本、最初的阶段,也是保障铁路信号安全软件质量、防止其失效的重要手段[4]。通过对软件单元测试发现其中的缺陷,确保设计和实现软件规定的要求。目前,铁路信号领域的软件测试主要参考TJ/DW230-2020《铁路信号安全软件编程暂行技术要求》、 TJ/DW231-2020《铁路信号安全软件测试暂行技术要求》等文件[5-6]。其中,文献[6]重点强调要通过单元测试方式对软件的功能、性能、错误处理等进行测试,可发现软件内部逻辑错误缺陷,识别难达、危险分支,提高软件测试的可靠性,保证铁路信号系统的安全性。
现阶段,铁路信号安全软件单元测试技术主要以白盒测试为主,黑盒测试为辅[7]。白盒测试主要关注软件内部结构逻辑,忽略软件的功能逻辑。黑盒测试主要从功能方面对软件进行测试,不太关注软件的内部结构逻辑,且测试案例是否完备全面依赖于测试人员对功能的理解程度,这样会导致一些复杂环境条件下产生的异常测试案例被遗漏,进而产生严重的后果。因此,需要一种既能充分考虑黑盒测试的各种场景,又能满足白盒测试的结构覆盖需求的测试方法,同时切实可行、容易操作,从而提高测试效率。
本文提出了一种基于扩展有限状态机(EFSM,Enhanced Finite State Machine)模型的黑白盒融合单元测试方法。以软件结构中划分的最小功能模块为测试对象,利用EFSM模型准确刻画软件的各种场景,设计相关测试案例,同时使用自动化测试工具Cantata对基于EFSM模型设计的测试案例进行自动化分析,给出被测功能模块各个函数结构覆盖结果。
1 基本理论
1.1 单元测试概述
单元测试是指对软件内部最小可测单元的正确性进行测试的工作。其中,对最小可测单元的大小并没有明确的规定,它可以是一个模块、一个类、一个方法、一个子系统甚至一个函数。测试人员依据软件设计规范和程序源代码,设计测试的输入和输出条件,通过编写相应的测试案例分析软件中可能存在的缺陷,验证软件功能是否符合设计规范的要求。单元测试方法包括白盒测试和黑盒测试。
白盒测试方法中的语句覆盖、分支覆盖、条件覆盖(CC,Condition Coverage)、修正条件判定覆盖(MCDC,Modified Condition Decision Coverage)、条件组合覆盖的测试是以程序内部结构为基础的常见白盒测试方法,其覆盖程度依次增强,设计难度也逐级增加;白盒测试方法还包括路径覆盖、控制流、数据流、程序变异、程序插桩等,可以根据测试的充分性要求适当选择。
黑盒测试方法中的功能分解、等价类划分、边界值分析是黑盒测试设计用例的常用方法[8];判定表、因果图、随机测试、猜错法和正交试验法等,可以根据测试对象和被测特性的特点适当选择。
铁路信号安全软件单元测试的基本内容如下[9]:
(1)对每个软件单元的功能进行测试;
(2)被测试的软件特性都与功能相关,且包含正常和异常情况;
(3)测试用例的输入域应覆盖有效等价类、无效等价类和边界值;
(4)软件源代码对于每个单元内部的错误处理措施是否有效;
(5)软件源代码的每条语句都被至少一个测试用例覆盖,即语句 100%覆盖;
(6)软件源代码的每个分支都被至少一个测试用例覆盖,即分支 100%覆盖;
(7)软件源代码的每个分支的每个条件都被独立起作用的测试用例覆盖,即 MCDC 100%覆盖。
1.2 扩展有限状态机
EFSM能够对软件中有限个状态以及这些状态之间的转移行为进行建模。EFSM在有限状态机基础上增加了变量、操作及状态迁移的前置条件,可以更加准确地刻画软件内部的动态行为[10],是对FSM的扩展。通常EFSM模型使用状态图来表示,图中,用节点表示状态,用边表示转移条件。
EFSM由六元组M构成:
其中,S为一个有限状态集合;s0∈S为该模型的初始状态;V为内部变量的有限集合;I为输入集合;O为输出集合;T为状态迁移的有限集合。T的每个迁移t是一个五元组t=(ss,i,g,op,se),其中,ss为迁移t的起始状态;i∈I为输入符;g为当前迁移的判定条件,也被称为守卫条件;op为输出或赋值等一系列操作语句;se为迁移t的终止状态。
1.3 Cantata自动化测试工具
Cantata测试工具的功能包含:单元和集成动态测试、AutoTest测试、覆盖率分析、静态分析、测试需求追踪、代码变更分析、Cantata Makefile等。
Cantata进行软件测试的策略,如图1所示。
图1 Cantata进行软件测试的策略
(1)编写测试脚本,设置不同的输入调用被测试单元;
(2)将编写的测试脚本与动态测试库、函数插桩、覆盖率插桩、覆盖率采集分析等进行链接编译,生成测试可执行文件;
(3)产生测试结果,给出覆盖率统计结果,并显示未覆盖的原因。
2 基于EFSM模型的黑白盒融合单元测试技术
2.1 黑盒测试案例的形式化描述技术
传统的黑盒测试案例使用自然语言描述,由于自然语言存在模糊性和二义性,给测试人员带来了一定的困扰和挑战。测试人员由于对测试案例的含义和预期结果理解不一致,导致执行时产生歧义和误解,从而影响测试结果的准确性。
为了解决这些问题,通过将测试案例转化为EFSM模型,可以将测试过程更加形式化和规范化,并消除了自然语言描述的模糊性和二义性。
EFSM模型使用图形的方式表示软件的各个状态和状态间的转换关系,可以清晰地展示系统的行为和功能。测试人员可以根据EFSM模型中的状态迁移路径,准确地理解测试案例所要求的系统行为和预期结果。这种结构化和精确的表示方式使测试人员之间可以更好地共享和理解测试需求,减少了解释和执行测试用例时的歧义,提高了测试人员对测试细节的准确理解。
2.2 黑盒测试与白盒测试相互融合技术
该技术充分利用了黑盒测试和白盒测试各自的优点,能够全面验证软件的功能和结构,发现更多的缺陷,提高测试案例的质量,进而提升软件的安全和可靠性。
(1)黑盒测试和白盒测试分别关注软件的功能和内部结构,通过将两者结合,能够充分覆盖测试对象的各个方面。黑盒测试注重对软件功能的正确性和需求符合性的验证,而白盒测试则关注代码覆盖率和结构的完整性。
(2)由于黑盒测试和白盒测试都有不同的测试目标和方法,结合使用可以发现更多的缺陷。黑盒测试主要通过输入和输出验证软件功能的正确性,而白盒测试通过深入分析代码路径和逻辑来发现软件中潜在的问题。
(3)黑盒测试用例基于功能需求的角度设计,能够充分考虑到用户的使用场景和预期结果;白盒测试着重于代码层面的覆盖和测试,能够发现逻辑错误和边界条件等问题;结合两者,既可以保证软件功能的完整性和正确性,又能够测试代码的覆盖率和结构,提高测试案例的质量。
(4)白盒测试对于难以覆盖的关键分支和异常场景能够提供更深入的测试和分析。通过使用白盒测试方法,结合对未满足覆盖率要求的分支的设计和测试,可以进一步提升软件的安全性和可靠性。
2.3 基于EFSM模型的黑白盒融合单元测试方法
结合黑盒测试和白盒测试各自的优点,以功能模块为最小可测对象执行单元测试,本文提出了一种基于EFSM模型的黑白盒融合单元测试方法,如图2所示。具体实施步骤如下:
(1)采用EFSM模型对铁路信号软件应用各场景进行形式化建模,实现功能点分解;
(2)根据EFSM模型中各个状态迁移,建立黑盒测试用例集;
(3)根据建立的黑盒测试用例集,编写相关测试代码,结合Cantata自动测试工具,给出覆盖率测试结果,查看各个被测函数是否满足语句、分支、MCDC覆盖率要求;
(4)如果覆盖率测试结果不满足要求,分析未覆盖原因,判断是否存在异常场景,针对未覆盖分支使用白盒测试方法设计补充测试案例,满足覆盖率要求。
(5)如果覆盖率测试结果满足要求,本测试步骤选择边界值分析法补充测试用例。经验表明,在边界附近很容易发生错误,为了使测试案例集更充分,该方法简单而有效。
3 铁路信号软件单元测试验证
3.1 无线超时降级场景的EFSM模型
车载设备在CTCS-3(简称:C3)等级完全模式下,处理无线超时降级CTCS-2(简称:C2)等级的场景分析[11]。
场景1:无线超时后,在完全监控模式下应启动C3等级向 C2等级的降级处理并输出最大常用制动命令。
场景2:无线超时制动10 s内,列车速度不大于160 km/h,且不超过C2等级允许速度,车载自动转入C2等级。
场景3:无线超时制动10 s内,列车速度高于160 km/h,但低于C2等级允许速度,不转入 C2 等级。
场景4:无线超时制动10 s 后,列车速度不超过C2的允许速度,自动转入C2等级。
场景5:无线超时制动10 s后,列车速度高于C2的允许速度,不转入C2等级。
场景6:自动降级过程中,无线恢复,自动缓解常用制动,列车继续以C3等级运行。
根据EFSM模型理论,建立C3等级完全模式下,处理无线超时降级C2等级的EFSM模型,如图3所示。图中,各状态、含义如表1所示;各迁移含义如表2所示。表2中主要描述了输出条件、判定条件及输出操作的含义。
表1 模型中各状态含义
表2 模型中各迁移含义
3.2 EFSM模型中各迁移转换为黑盒测试用例
根据表2中EFSM模型中每个迁移t的描述,建立黑盒测试用例集,其中,全局变量和桩函数设置依据迁移输入条件i,驱动参数依据迁移判定条件g,以及期望输出依据迁移输出操作op,如表3所示。
3.3 基于Cantata的覆盖率分析
(1)覆盖率要求:依据铁路信号安全软件测试要求,语句、分支和MCDC覆盖率均须达到100%。
(2)准备工作:基于以上要求,根据EFSM模型生成的测试用例集,编写测试脚本,设计桩函数,将测试脚本与Cantata建立连接,在Test Properties视图选择“Options File”> “Coverage”,勾选想要查看的覆盖率。
(3)执行过程:执行编译,将测试脚本与Cantata软件中的库函数链接生成可执行文件后,运行生成一个后缀为cov的覆盖率文件。
(4)查看覆盖率结果:切换到Coverage Explorer页面,点击页面右上角的倒三角,下拉选择当前工程查看覆盖率结果,如图4所示。
(5)定位未覆盖部分:针对覆盖率不满足100%要求的函数,可以点击对应的源码,红色显示未覆盖部分,同时给出未覆盖原因,这样可以快速定位未覆盖部分。如图5所示,选择红色未覆盖代码给出的未覆盖原因,MCDC覆盖未满足,判断条件currentMode_ == FULL_SUPERVISION_A &¤tLevel == ATP_LEVEL_3_A的独立影响作用没被体现,也就是未设计当判断条件不满足时的测试案例。
图5 未覆盖原因截图
基于Cantata的覆盖率测试结果,分析未达分支原因,判断是否是难达分支,针对无线超时降级场景的未覆盖分支,经分析未存在复杂难以设置的场景,均为不满足限制条件进入等待处理分支,使用白盒测试方法补充以下测试案例,如表4所示。
表4 白盒测试用例
针对白盒测试设计的案例,编写测试脚本,使用Cantata测试工具再次查看覆盖率结果,如图6所示,添加的补充测试案例,满足语句、分支和MCDC覆盖率均达到100%的要求,测试通过。
图6 覆盖率测试通过结果截图
3.4 边界值分析法
通过Cantata软件分析之后,已经确保了软件内部每一条语句、分支都至少被执行过一次,满足覆盖率要求。但是针对输入域有边界范围限制时,需要进一步设计案例,保障软件在边界值附近的运行逻辑的正确性。依据边界值的常用分析方法,测试数据一般选取刚好等于、稍小于和稍大于边界的数据。通过分析无线超时降级处理软件时,发现列车当前运行速度、输出制动时间和降为C2级后的允许速度都有边界值限制。针对这3个输入域利用边界值分析方法设计案例,由于在基于EFSM模型分析设计案例时已经对边界值附近大于和小于的数据进行了案例分析,因此,针对该场景补充的测试案例只针对等于边界值进行分析,如表5所示。测试过程中,未发现边界值附近有逻辑错误,测试通过。
表5 边界值分析测试用例
4 结束语
本文详细介绍了测试案例的设计、执行和评估过程,以无线超时降级场景为例,介绍了基于EFSM模型的黑白盒融合单元测试方法的具体应用过程和结果,以及测试结果的分析和改进措施。该方法结合了黑盒测试的功能覆盖和白盒测试的结构覆盖,生成了完备的测试案例集,有助于检测出软件内部的逻辑错误和状态转换错误。本方法不仅提高了单元测试的效率和完整性,也提高了软件的可靠性。