彭丽维,宋鹏飞,江雪莹,谢 林
(1.卡斯柯信号(成都)有限公司,成都 610083;2.卡斯柯信号有限公司,上海 200071)
随着科技飞速发展,轨道交通等领域软件的复杂性和规模性越来越高,保证这些软件的可靠性和安全性有重要意义。软件测试是保证软件质量的重要环节和依据[1],然而,软件测试工作是一项费时费力的活动,软件测试成本日益增加。因此,如何高效、正确、快速地对软件进行测试逐渐成为研究的主流方向。
文献[2]着重介绍了分块划分的原理,分析节点和分区两种类型的模块结构,将所有的代码分成若干个模块,分别在测试引擎中编译链接每个模块,并将结果存储在临时数据库中。测试引擎将自动测试模块和额外的可执行程序结合起来,使得测试工具可以根据新的测试需求和不同的测试标准来实时进行测试。利用上述原理设计了计算机辅助软件测试工具。文献[3]将软件的检验和验证(V&V)与商业计算机辅助软件工具(CASE)结合,在实时的硬件环境下循环测试,相比于传统的CASE,在软件测试方面增加了Matlab需求仿真工具箱、逆向工程工具箱、生成单元测试程序工具箱和在线帮助以及信息辅助控制,实例证明在很大程度上减少了测试所需时间和物力。
杨波等从软件的需求分析出发提出了基于需求建模的测试用例生成方法,从软件开发的需求阶段着手,利用UML建立需求元模型,再从元模型中提取出测试特征元模型,采用OCL约束对模型进行验证,生成抽象测试用例[4]。
上述方案中在一定程度上提高了测试效率,但是仅针对某一种具体应用的联锁软件,测试模型通用性不强,仍需要大量地人工编写测试用例。
为解决上述问题,本文提出一种通用联锁软件测试用例的生成方法,如图1所示,从状态信息表生成、状态信息处理、测试用例生成3个阶段来展开研究。根据计算机联锁技术条件罗列出每个阶段的所有状态及状态之间的转换条件和转换关系,利用这些状态和关系生成若干四元组合,形成联锁状态转换模型的树形网状结果,最后通过解析该树形网状结果来生成测试用例。
图1 总体框架Fig.1 General framework
状态信息表生成阶段是指根据计算机联锁技术条件中描述的进路建立、进路锁闭、信号开放、进路解锁、联锁结合功能和联锁接口功能各个阶段所需的联锁条件,列出每个阶段所有的状态及状态之间转换的条件,利用联锁自动化工具将这些状态和状态之间的转换条件输出到状态信息表中。
其中状态信息表中包括所有状态的名称、初始状态和结束状态,以及每个状态下可执行的操作、操作对应的结果状态和操作对应的联锁条件。
针对每个阶段包含若干状态,在信息表中需要指定初始状态、结束状态和操作对应的结果状态,其中初始状态和结束状态是指从每个阶段罗列出的所有状态中,指定一个初始状态作为后续搜索的起点和若干结束状态作为后续搜索的结束条件[5]。
在状态信息表中,每个状态还需包含可执行的操作和操作对应的结果状态,这些操作和结果是通用联锁软件根据先验阈值设定的适用于所有类型车站的通用判断条件和操作,再结合具体站场的实际联锁逻辑变为具体的值来进行使用,其中操作对应的转化条件和状态下可执行的操作是一个适用于所有站型的通用条件判断和操作,需要结合具体车站数据,将通用条件判断和操作描述用实际的站场元素来替代[6]。
状态信息处理阶段是指根据状态信息表提供的状态转换名称、结束状态、初始化状态及状态下可执行的操作及该操作对应的结果状态,得到联锁状态转换模型,过程如下。
本阶段划分为2个模块,分别为:状态及条件信息组合模块、联锁状态转换模块,各模块详细处理分为以下若干步。
1)状态及条件信息组合模块,用3个子模块Module1-1,Module1-2,Module1-3来表示。
Module1-1:将状态信息表中描述的初始状态作为入口点状态,识别该状态下可执行的所有操作,并找到操作对应的状态结果,操作对应的转化条件,针对每一个操作生成一个入口四元组合:“入口点状态”“转换条件”“可执行的操作”“结果状态”。
“结果状态”可能包含多个,这里将所有的结果状态用“结果状态1”“结果状态2”……“结果状态n”来描述。
Module1-2:每一个结果状态下也包括若干个可执行的操作,重复Module1的操作,针对每一个结果状态下的每个操作生成一个执行四元组合:结果状态1、转换条件、结果状态2,循环执行Module1-2,最终生成若干个执行四元组合:结果状态n-1、转换条件、结果状态n。
Module1-3:将状态信息表中描述的结束状态作为出口点状态,识别所有能转换到该状态下的操作对应的状态及转化条件,针对每一个操作生成一个出口四元组合:“结果状态”“转换条件”“可执行的操作”“出口点状态”。
2)联锁状态转换模块,将1)描述的所有四元组合拼接起来,形成一棵以入口点状态为起点,出口点状态为结束点的中间连接若干结果状态,并带有转换条件和可执行操作的树形网状结构。如图2所示,具体步骤如下[7]。
图2 树形网状结构生成逻辑Fig.2 Tree network structure generation logic
定义任意一个四元组合中,第一个状态为源状态,第三个状态为目标状态。
S1:寻找所有包含入口点状态的四元组合,确定目标状态和源状态,每一个四元组合循环执行以下搜索。
S2:以S1步骤中找到的每一个四元组合的目标状态为搜索起点,在所有四元组合中搜索以该目标状态为源状态的所有四元组合,并记录四元组合中的转换条件和可执行操作。
S3:若S2中搜索到的四元组合中的目标状态包含结果状态或者目标状态或者源状态在前一次的搜索结果中出现,则以该四元组合的目标状态为源状态的搜索结束,将本次搜索的内容组合起来形成一个分支。
S4:若S3搜索未结束,取下一个四元组合继续S2步搜索,直到所有三元S1中描述的所有四元组合搜索完成。
S5:S4执行完成后,将S3中组合起来的若干分支合并,形成一棵以入口点状态为起点,出口点状态为结束点的中间连接若干结果状态,并带有转换条件和可执行操作的树形网状结构[8]。
测试用例生成阶段是指解析状态信息处理阶段得到的树形网状结构,生成抽象的测试用例,根据抽象测试用例中的每个四元组合的源状态、转换条件、可执行操作和目标状态,注入实际车站数据,生成实例化的测试用例。
在得到具体的测试用例前,必须要有符合逻辑的状态转换过程作为对应的输出,因此必须要生成抽象的测试用例。
抽象测试用例生成过程中不考虑迁移的条件,只考虑所有的状态转化过程。采用状态覆盖准则生成的用例会遗漏很多过程,严重影响测试质量,为了保证测试用例的完备性,必须要能够覆盖到所有迁移条件。在迁移覆盖准则的前提下,设计深度优先搜索算法,解析联锁状态转换模型得到的树形结构。
1)以树形结构中每个四元组合的入口点状态为起点,取出每个入口点包含的所有分支;
2)解析每条分支中包含的n个四元组合,其中第一个四元组合的源状态必须是入口点状态,第二个四元组合源状态为第一个四元组合的目标状态,第三个四元组合源状态为第二个四元组合的目标状态,依次类推,第n个四元组合的源状态为第n-1个四元组合的目标状态,第n个四元组合的目标状态为出口点状态或者第1个到第n-1个四元组合中出现过的目标状态或者源状态;
3)将步骤2)中每条分支得到的所有状态按四元组合出现的顺序组合在一起,构成一条抽象测试用例[9]。
根据JAVA语言提供的反射机制,动态调用类中的函数和方法,结合模型的建立情况,为模型中的每个模板建立一个类。该类中包含模型中所有迁移涉及到的方法,每个方法有关的输入通过该方法返回,以便在对模型解析时能够得到具体的输入,具体过程如下:
1)取4.1中得到的抽象测试用例,取出抽象用例得到所有状态信息,并结合树形结构,获取状态之间的联锁条件及可执行的操作;
2)利用JAVA反射机制解析步骤1)中抽象用例的联锁条件和可执行操作,注入实际车站数据,将适用于所有站的转换条件和可执行操作以实际站的数据中描述的元素来替代;
3)将步骤2)中解析好的联锁条件和可执行操作按步骤1)中取出的抽象测试用例中的四元组合顺序条件到抽象用例的源状态和目标状态之间,构成一条可执行的实例化的测试用例;
4)每个抽象案例对应软件的一个测试用例,解析所有的抽象测试用例,最终生成软件所有的测试用例[10]。
安全软件潜在的危险性对系统可靠性有很大影响,本文提出了一种基于模型的联锁软件测试用例生成方法。以铁路信号系统中的安全软件计算机联锁系统部分设计过程为实例,根据软件的需求规范和可能影响软件安全的环境因素着手,建立联锁安全软件的状态机模型,来生成测试用例,在一定程度上提高了软件测试的可靠性,将传统测试软件的方法由黑盒测试逐步转化为白盒测试,有效地避免了由于软件的保密性而造成软件内部运行程序的不可靠性引起测试不全面的问题。