LKJ自动化测试脚本定义及生成技术研究

2019-09-12 07:09白鸿钧张明凯李冠军杨清祥
铁路通信信号工程技术 2019年8期
关键词:测试用例脚本手动

白鸿钧,张明凯,李冠军,杨清祥

(河南思维轨道交通技术研究院有限公司,郑州 450000)

列车运行监控装置(LKJ)是中国铁路用于防止列车冒进信号、运行超速事故和辅助司机提高操纵能力的重要行车设备。LKJ 车载设备内的嵌入式软件是实现列车运行控制的灵魂,其运行结果的正确与否,直接关系到列车的运行安全。车载控制软件逻辑正确性测试一直是LKJ 系统生产厂家的重要工作。业内对LKJ 车载控制软件的测试方法进行了广泛探索,一般采用手工测试和自动化测试两种方式进行测试。

手工测试难以实现待测软件逻辑的全覆盖,工作量大,花费时间长,且测试结果受限于测试工程师的专业知识。针对手工测试存在的问题,LKJ 生产厂家[1-3]及其他列控系统或设备生产厂家[4]对自动化测试方法进行了探索。实践证明,给通用的脚本语言增加LKJ 业务逻辑相关的关键字形成专用的脚本语言,以此专用脚本语言来定义测试用例,解释执行测试用例驱动硬件设备发送信号和采集LKJ 的反馈数据,判断是否符合预期,是可行的技术路线。

笔者参与研发的LKJ 自动化模拟仿真测试系统(Automatic Simulation and Test System,ASTS)在Python 语言基础上定义了专用于LKJ测试的脚本语言,采用图形编辑和手动录制的方式形成了系列、规模化的脚本库,成功运用于LKJ 功能、性能的自动化测试。

1 脚本语言定义

测试用例需要以某种编程语言来体现,编程语言的选择是系统成功的关键。在选定语言的基础上,增加LKJ 业务逻辑相关的语言特征和底层支持函数库,形成应用于LKJ 特定测试场景的脚本语言。LKJ 相关的业务逻辑判断在脚本语言中实现,脚本语言调用底层支持函数,底层支持函数驱动硬件,产生信号,获取LKJ 反馈,判断反馈结果是否符合预期,从而判定LKJ 软件工作是否正常。

1.1 脚本语言的选用

自动化测试的场景是:测试工程师编辑生成测试用例后发送到仿真测试平台,仿真平台执行测试用例,驱动硬件设备,产生各种信号,获取LKJ 反馈,比较LKJ 反馈是否符合预期,从而判断LKJ车载控制软件逻辑是否正确。测试中可能需要调整测试用例,考虑到测试工程师熟悉LKJ 业务,但不一定具备编程能力的情形,不能要求测试工程师按照软件开发的思路来编辑测试用例,编译后生成执行。测试用例依托的脚本语言必须具备动态执行、高效率两个特性,并且测试用例必须能够可视化呈现,因此,采用以下设计原则选择脚本语言。

1)考虑到脚本的可扩充性要求,应采用业内通用的脚本语言。

2)应采用动态语言。动态语言在执行时动态加载,不需要预先编译。

3)语言性能应满足时效性要求。

通过对Python 语言特征的分析以及Python 混合编程的特点分析[5-6],确定Python 语言满足以上要求,选用Python 作为测试用例的脚本语言。

1.2 脚本定义

在Python 语言的基础上,增加LKJ 业务逻辑相关的关键字,比如设定列车运行速度、检查线路限速数值、获取LKJ 输出信息等,生成了ASTS 脚本语言。新增的关键字解释执行时调用底层的C++函数库[7-9],实现业务逻辑。ASTS 脚本语言对Python 的扩充包括以下5 个方面。

1.2.1 设定LKJ测试所需的输入信号

设定LKJ 测试所需的输入信号,包括开关量信号和模拟量信号,为LKJ 提供外部信号条件,比如设定各路速度的速度值、各路压力信号的管压值、列车手柄状态、机车信号等。另外,还定义了具备内置业务逻辑的关键字,比如跟踪速度函数,可以持续跟踪LKJ 限速的变化,自动调整输入速度信号数值,使得速度贴近限速运行,直到满足某个条件时退出速度跟踪。

1.2.2 设定LKJ运行状态

设定LKJ 运行状态,可以改变LKJ 的运行控制参数和设备自身状态,使LKJ 处于测试所需的工作状态,测试能够启动和持续进行。比如校正LKJ的时间,设定司机发车参数(发车的车站号、运行线路、目的车站等),设定列车的检修参数(计算列车速度所需的机车轮径、速度传感器每周脉冲数等),对LKJ 各插件单元的嵌入式软件进行版本更新。

1.2.3 获取LKJ反馈信息

仿真测试系统能够接入LKJ 内部总线,侦听总线数据,获取系统内部通信数据;也可以采集屏幕显示器(DMI)视频显示和音频输出,通过图像识别和音频识别,获取视频音频信息。脚本语言定义了相关的关键字,以实现获取LKJ 信息反馈的功能。

DMI 图像识别通过图像二值化、字符串定位与剪裁、字符分割、字符识别等4 个过程识别字符点阵,采用“点阵对比”方式与标准字库中的字符点阵进行对比,识别出图像中的字符。

DMI 音频识别基于快速傅里叶变换(FFT)预先建立标准语音文件的识别特征库,采集到某段语音后分析该语音的声音特征,与识别特征库中的语音特征进行匹配,采用“最大可能性”原则,判定为哪一条标准语音。

1.2.4 测试结果判断

以断言Assert 的方式进行测试结果判断,判断LKJ 的信息输出和动作输出是否符合预期。

1.2.5 测试进度控制

定义了多种测试进度控制关键字,比如以动态延时(ASTS_Delay)和测试过程挂起的方式控制脚本的执行进度,保证测试过程满足业务逻辑要求,也可以使测试过程暂停和继续,实现“断点续测”。

1.3 脚本文件结构

脚本文件是结构化的,由文件头和文件体组成。文件头定义了文件的名称、功能等,文件体是操作要素的序列和期望结果。

1.3.1 文件头

文件头是脚本描述,描述脚本的种类、编制人等。文件头包括以下要素。

1)脚本名称(#ASTS_Script_Name):用关键字说明脚本的功能,例如:特殊前行模式测试。

2)脚本种类(#ASTS_Script_Type):基本用例/测试实例/测试序列。

3)脚本ID(#ASTS_Script_ID):ID 由业务种类+ 序号组成。业务种类包括LKJ 种类(LKJ2000、LKJ-15S)、设备种类(主机、显示器、其他设备)、测试种类(区分控制模式)和测试种类细分等。当业务种类无法区分复杂或重复业务时,以序号做区分。

4)功能简述(#ASTS_Script_Func):简单说明脚本的功能。

5)当前版本(#ASTS_Script_Version):该脚本的版本号。

6)发布日期(#ASTS_Script_ReleaseDate)。7)初创人(#ASTS_Script_Author)。

8)来源(#ASTS_Script_Creater):人工编制或手工测试录制。

9)脚本运行所要求的LKJ 软件版本(#ASTS_Script_LKJ_Version):LKJ 软件、LKJ 控制条件版本号。

10) 脚本运行所要求的LKJ 数据版本(#ASTS_Script_LKJ_Data_Version):LKJ 数据版本号。

11)其他:包含脚本解释所需的Package 列表等,用于脚本解释器引入package。

以上1 ~10 项要素以Python 脚本注释的方式存在。

1.3.2 文件体

文件体由一系列功能相关的操作要素和测试结果判断组成。操作要素内容包括动作名称、动作参数等,比如 “设定速度输出数值80 km/h”。脚本例子如下。

pdll.ASTS_SetTestProgress(1,20) //设置测试进度

pdll.ASTS_TimeOut=5000 //设置超时值pdll.ASTS_InitTimeOut() //初始化超时计数

while(pdll.ASTS_CheckTimeOut()

pdll.ASTS_SetKey(1) //发送按键

pdll.ASTS_Delay(100) //延时100 ms

pdll.ASTS_SetAllGangya(800,600,0,500,500,500) //设置列车管压

pdll.ASTS_SetGongKuang(1,0,1,0,1,1,1,1) //设置手柄信号

pdll.ASTS_SetJtcXinHao(2,1,3) //设置机车信号

pdll.ASTS_SetSudu(5,0,1) //设置速度

pdll.ASTS_SetFollowSudu(-1,361,-1,-1,5) //设置跟随速度信号

while(pdll.ASTS_CheckTimeOut()

if(pdll.ASTS_GetLKJFlag(1,7) == 21 or pdll.ASTS_GetLKJFlag(2,7) == 21): //采集LKJ反馈信息

pdll.ASTS_Assert(1) //保存测试结果

else:

pdll.ASTS_Assert(0) 保存测试结果

pdll.ASTS_Delay(1)

pdll.ASTS_Delay(1)

2 脚本语言生成

测试脚本可以由测试人员在文本编辑软件中直接输入语句来生成,也可以通过图形拖拽方式生成。在实际测试工作中,测试人员习惯先进行手动测试,记录下自己的测试过程,之后将测试过程转化为脚本,经合并拼接后录入到系统。

2.1 测试脚本的图形化编辑

ASTS 将脚本功能或语句抽象为图形控件,每个图形控件内置特定的业务逻辑。编辑测试脚本时,根据业务功能,选定相应的图形控件,按顺序拖动到编辑区,设定控件属性,即可生成测试脚本。图形化编辑可视化强,智能化程度高,大大减轻了脚本编辑的工作量。

2.2 手动测试录制脚本

在实际测试工作中,测试人员经常先进行手动测试,手动测试过程通过才能转化为自动测试用例。手动测试过程记录智能转换为测试用例脚本,将会在很大程度上减少测试人员的工作量。

通过对用户手动测试过程的分析和提炼,ASTS实现了自动记录测试人员的手动测试过程,并转化为测试脚本的软件方法。

如图1 所示,手工录制脚本的过程如下。

1)记录用户的工作环境描述,形成文本块T1

记录用户的登录名称和时间。通过特定的软件通信协议读取当前设备的硬件版本和软件版本。由用户指定本次手动测试的主要目的。

2)由用户指定需要跟踪的LKJ 反馈项目

脚本文件中的期望结果是判断脚本执行是否成功的标志,非常重要。实际测试中,LKJ 反馈输出具有很强的时效性,如果让用户在测试中选择确定输出项目的话,可能会错过时机,从而记录下错误的反馈输出结果。手工录制脚本前,在软件界面中由用户点击选择要跟踪的LKJ 反馈输出项目,比如跟踪“紧急制动输出状态”。形成文本块T3,T3 的形式如“跟踪:紧急制动输出状态”。

图1 手工录制脚本的流程Fig.1 Manual scripts record process

3)记录用户的点击操作过程

用户点击“开始录制脚本”启动手动测试,系统记录用户的手动测试过程(包括设定项目、项目数值和相对开始的时间),形成文本块T2。比如记录下某用户的操作过程的文本块T2:

设定速度,速度值=0 km/h,操作时间=0 s;

设定信号灯,绿灯,操作时间=5 s;

设计开车参数,设定司机号=1234,时间=8 s;

设定速度,速度=20 km/h,操作时间=58 s;

设定速度,速度=40 km/h,操作时间=80 s;

设定信号:信号=红灯,操作时间=103 s;

4)获取跟踪结果

用户点击“获取跟踪结果”,系统自动读取当前被测试系统的反馈结果,并与指定的输出结果跟踪项目进行匹配,修订文本块T3。比如此时T3 内容为“紧急制动输出状态=输出”。

5)脚本规范化

对文本块T2 进行规范化处理,规范化处理的目的是将操作过程映射到操作元素。过程如下。

对每一步操作内容,遍历操作要素描述库,查找对应的操作要素。比如“设定速度”的要素类型为2。

根据操作要素类型,确定操作内容是否完整,如果不完整,则补充默认值。比如操作过程的第3步“设定开车参数”,用户没有设定发车车站号,则系统自动取默认值。

将文本块T1、T2、T3 进行组合,形成脚本文件。

此时生成了完整的描述性文本文件,文件中的元素基本与脚本一一对应,可以很容易地转换为脚本。生成的描述性文本如下所示。

文件头:用于测试红灯停车模式的脚本,运行于LKJ-15S 中,要求软件版本为V1.0.1,自身版本V1.0,由张三录制,录制时间2018 年7 月27 日。

操作元素序列如下。

设定速度参数:要素类型=2,操作时间=0 s,速度值=0 km/h;

设定信号灯:要素类型=3,操作时间=5 s,信号=绿灯;

设计开车参数:要素类型=1,操作时间=8 s,设定司机号=1234,设定发车车站号=25;

设定速度:操作要素=2,操作时间=58 s,速度=20 km/h;

设定速度:操作要素=2,操作时间=80 s,速度=40 km/h;

设定信号:操作要素=3,操作时间=103 s,信号=红灯。

期待输出:紧急制动输出=输出。

3 结论

ASTS 应用于LKJ 的自动化测试,实践表明,测试脚本的设计合理,动态解释执行灵活,且执行效率高。脚本的图形化生成方式、手工录制生成方式大大减轻了测试工程师的工作量,学习曲线平滑,测试工程师的工作经验很容易地转化为系统的测试用例。

进一步,自定义的脚本语言可以根据应用需求,方便地扩展到其他自动化设备的测试场景,具有很大的应用前景。

猜你喜欢
测试用例脚本手动
酒驾
测试用例自动生成技术综述
回归测试中测试用例优化技术研究与探索
安奇奇与小cool 龙(第二回)
基于SmartUnit的安全通信系统单元测试用例自动生成
7招教你手动设置参数
自动推送与网站匹配的脚本
风行S5001.6L手动尊享型
宝骏5601.8L手动豪华型
C4世嘉 1.6L手动豪华型