李冠军,杨清祥,白鸿钧
(河南思维轨道交通技术研究院有限公司,郑州 450001)
列车运行监控装置(LKJ)车载控制软件涉及列车行车安全,因此在每次软件变更后都必须进行严格测试,以保证软件控制的安全性、可靠性[1]。在LKJ软件升级过程中,软件测试工作一直占据着很大的比重。虽然目前已逐渐使用LKJ软件自动化仿真测试系统代替部分人工测试的工作,但其测试用例的编辑和维护仍需人工手动完成,需耗费较多的人力,且效率较低。因此,为了尽可能的提高效率及自动化程度,充分发挥LKJ软件自动化仿真测试系统的优势,除对测试脚本的编写方法进行优化外,亟待有更安全、可靠的LKJ软件测试用例自动生成解决方案。
由于LKJ软件控制功能复杂且牵涉外部接口参数较多,在编写LKJ软件测试用例时,需要根据软件控制功能将不同的控制参数和外部接口等进行排列组合来形成不同的测试用例。测试LKJ软件的一个控制功能往往需要几十条甚至上百条LKJ软件测试用例,才能实现对控制功能的完整覆盖。目前LKJ软件自动化仿真测试系统提供的LKJ软件测试用例编写方式有脚本语言编辑、人工录制测试用例和图形化编辑3 种方式。
(1)脚本语言编辑方式是指采用测试脚本语言编辑生成自动测试脚本[2]。该方法对测试用例编写人员的业务水平和脚本语言运用水平要求较高,且编辑工作量较大,一般适用于功能相对简单的压力测试和重复性的性能测试等方面。对于逻辑复杂的软件功能测试,由于测试脚本的编辑及维护工作量非常巨大,使用该方式无法体现自动化测试的优越性。
(2)人工录制测试用例方式是指在人工操作LKJ设备时,系统对设备操作过程、LKJ输出关键信息和LKJ控制结果等信息进行详实记录,并从一次或多次人工操作记录中提炼信息,自动生成LKJ软件测试用例初稿,再由人工对初稿进行修改。该方式以人工操作为范例,由于个人操作习惯及业务水平不同,可能会输出与预期不符的结果,导致测试用例偏离实际,且生成的测试用例脚本维护工作量大,只适用于特殊场景的重复测试。
(3)图形化编辑方式仅需要通过拖动图形完成一系列组合即可编辑测试用例,对测试用例编辑人员的脚本语言运用水平没有太高要求。此方法可显著提高LKJ软件测试用例的编辑效率,简化LKJ软件测试用例维护工作。但由于LKJ软件测试用例整体数量庞大,用例编辑及维护仍需要大量人力,不能发挥LKJ软件自动化仿真测试系统的优点。
测试用例的自动生成技术是实现LKJ软件的自动化测试的关键一环。目前测试用例自动生成的方法,几乎都离不开选取接口参数[3]和创建测试模型[4]。通常采用的测试模型有有限状态机(FSM,Finite State Machine)和扩展有限状态机(EFSM ,Extended Finite State Machine)[5]等。在列车控制领域,已尝试采用UML2.0活动图的方式自动生成测试用例[6-8]。
本文通过图形化建模的方式,将复杂的LKJ功能进行拆分并采用简单的图形控件进行建模,自动生成测试用例,从而提高测试用例编写效率和质量。
鉴于LKJ软件的特点及目前LKJ软件测试用例编制困难的现状,本文主要结合图形建模技术,对通过模型自动生成LKJ软件测试用例的方法展开研究,并从测试模型框架、测试用例模块划分、接口参数选取及取值设计、接口参数组合设计及测试用例自动生成方法5方面入手,详细介绍基于LKJ软件自动化仿真测试系统的测试用例自动生成方案。
在对LKJ软件进行测试前,应先根据LKJ软件控制功能建立相应的LKJ软件功能测试模型,依据该模型对接口参数采用遍历的算法自动生成一系列测试用例,其中,接口参数选取及接口参数组合序列的形成是关键。LKJ软件功能测试模型主要包括测试环境、接口参数、图形建模3部分。
测试环境主要指测试用例进入的前置条件及测试用例运行的必备资源,如司机设定信息、LKJ基础数据等;接口参数指影响测试结果的关键信息,主要体现在图形建模的判断节点及各分支中,每种参数可存在2个及以上的参数值。图形建模指根据接口参数之间的逻辑关系进行模型绘制。
不同控制功能有不同的测试环境,不在本文讨论范围之内,暂不展开讨论。
由于LKJ软件功能复杂、接口参数多样,若每个功能仅设计一个测试用例,则会造成测试用例接口参数过多、逻辑分支庞大,很难实现测试用例的自动生成。因此,首先应对LKJ软件功能进行分解,细分成一个个相对独立的功能模块,然后对每个功能模块再进行多次分解,分解成能进行独立测试的最小测试单元,如图1所示。
图1 LKJ软件测试用例模块划分示意图
为避免遗漏,用例模块划分采用自顶向下逐层分解的原则,先画出整体框架,再逐层细化。具体划分步骤如下。
(1)根据运行场景或LKJ控制模式进行划分,场景划分方式主要依据运用场景,例如:库内、调车、自动闭塞站内运行、自动闭塞区间运行等;LKJ控制模式划分方式主要依据LKJ控制功能的模式,例如:待机、降级、段内走行、调车、通常、重载模式、无防冒、随时停车等。本文选取第2种划分方式。
(2) 梳理各控制模式的所有控制功能,例如:通常模式下的走停走、特殊前行、绿色许可证行车、过机校正、警惕、手信号引导等。对上述控制功能再向下逐层分解,如走停走可以分为停车再开和过机再走,其中过机再走又可向下分解为过机后信号开放和过机后信号关闭,直到不能再向下分解为止。
(3) 依据控制功能的最小单元进行测试用例模块划分,分解出的测试用例模块应能单独进行测试,且输入参数相对较少。如停车再开控制功能可以分解成停车期间、起车至机车越过信号机等测试单元模块。
(4) 将每个测试单元划分成进入(启动)条件、控制过程、退出(解除)条件等3部分,每部分为一个独立的测试用例模块。
测试用例接口参数直接关系到被测LKJ软件功能的覆盖度,是影响测试结果的关键参数,但接口参数过多不利于参数组合设计,所以应当根据不同测试用例模块的实际需求选择适合的接口参数,LKJ测试用例模块常用的接口参数有速度、列车管压力、信号机类型、信号机标志、信号制式、机车信号、距离、列车类型、机车类型等。
测试用例接口参数分为有限集参数和无限集参数两种,有限集参数可以通过枚举来表示,无限集参数一般为数值型参数,通常采用等价或边界取值转换为有限集参数。
(1)有限集参数取值可根据测试需要选取典型值。信号机类型、信号机标识、信号制式、机车信号、列车类型等为枚举型接口参数,例如:信号机类型取值包括预告、2预告、通过、容许、进站、进出站、出站等。
(2)速度、限速、距离等无限集参数取值尽量按等价类和边界值方法转换为有限的离散数值集合。例如LKJ控制中要求距离小于70 m,则测试用例中可设置距离为69 m和70 m两个边界值。
接口参数选择完成后,运用图形化方式编辑测试环境,并基于图形建模的方式为接口参数建立测试场景流程图;系统依据测试场景流程图自动生成一系列的测试用例接口参数组合序列[9],每个接口参数组合序列可生成一个测试用例,并通过对接口参数组合序列的筛选及对测试预期(测试断言)的设置,形成本测试用例的接口参数组合序列表。
以LKJ软件的货车特殊前行功能进入条件[10]为例,介绍测试用例的接口参数组合序列表的形成的过程。
货车特殊前行功能主要解决货物列车在非货车靠标停车困难车站尾部拉过标的问题,货车特殊前行功能进入条件如下:
(1)货物列车;
(2)机车停在LKJ车载数据预先设置为非货车靠标停车困难车站的站内,且列车头部与出站信号机距离小于70 m;
(3)机车信号为停车信号或LKJ逻辑判断为停车信号;
(4)机车运行速度为0 km/h;
(5)司机按规定方法操作,输入LKJ的前行距离值不超过100 m。
对货车特殊前行功能进入条件进行梳理,形成如表1所示的7种接口参数。
表1 货车特殊前行进入条件接口参数表
从表1可以看出,接口参数为7个,接口参数各有2个取值,若需要覆盖所有接口参数的取值,则生成的接口参数组合序列数量应为128(27)个。若接口参数个数及取值再增加,则接口参数组合序列将会成倍或成指数级增加。例如:信号类型参数个数增加到10个、列车类型参数个数增加到12个,则生成3 840个接口参数组合序列,也就是可以生成3 840 个测试用例。
因此,对于LKJ软件自动化仿真测试系统需要构建一个测试模型,将接口参数通过程序流程图的方式进行建模,形成一个完整的测试场景,提高测试效率。货车特殊前行进入条件的测试场景建模如图2所示。
自动生成测试用例技术目前尚不能解决测试失效的自动辨识问题,无法自动生成断言,需在流程图中人工设置断言,在自动分解生成接口参数组合序列后,需人工对接口参数组合序列进行全面性和正确性检查,最终形成完整的接口参数组合序列集。
图2 货车特殊前行进入条件测试场景流程图
流程图编辑采用预先定义的图形控件,通过对图形控件拖拽及对控件的属性和参数进行设置的方式完成序列集的制定,主要包括以下几类图形控件:
(1)开始/结束:定义流程图的入口和出口;
(2)判断:通过对参数的判断来控制分支方向;
(3)箭头:各个参数和步骤的连接关系;
(4)断言:对测试结果进行检查的测试断言项。
软件自动生成的接口参数序列数量受内部判断及分支的影响,通过遍历算法对活动图进行路径搜索,人工调整后形成如表2所示的货车特殊前行进入条件测试接口参数组合序列表。
由表2可知,货车特殊前行进入条件的接口参数组合序列仅有8个,仅需8个测试用例已能完成所有路径的覆盖,相对于128条用例来说已显著缩减,极大的提高自动化测试效率。
以上示例未将所有接口参数及判断逻辑全部展开,仅用于对方案的演示和说明,实际应用中接口参数及并发路径会更多,对多并发路径可采用取典型值法或将多并发路径分支继续拆分成若干个单独的测试模块。
表2 测试用例接口参数组合序列表
将上述生成的接口参数组合序列中各组参数依次传入测试模块接口中,即可自动生成LKJ软件测试用例集合。
通过对测试用例模块采用程序流程图方式建模并自动生成测试用例的方法,显著缩减无效测试用例,提高了LKJ软件测试用例编制效率。且能对未测试的路径和状态组合进行查漏,有利于测试环境的复用。如果发生软件功能模块修改,只需修改软件测试环境、接口参数和测试状态图即可重新生成所有用例,提高了测试用例的可维护性,节省了人工编制用例的时间。与LKJ软件自动化仿真测试系统相结合,可显著提高测试效率、测试覆盖率及LKJ软件测试的自动化程度。
该方案已在新一代LKJ软件仿真测试系统中试用,在一般测试场景中能够很好的满足系统自动生成用例的需求,有效提高了测试用例编辑效率。但是由于测试场景的复杂性,往往在自动测试用例编辑过程中需要人工干预和修正,如何验证生成用例模型正确性及测试覆盖的完整性将是测试用例自动生成技术未来的研究重点之一。