杨国胜?杨毅?王海?栾衡
摘要:在常规的MATIP服务测试过程中,通常采用定制的MATIP服务端与客户端程序作为通信载体,交互能力与适应能力弱,阻碍了自动化测试的开展。DSL指的是专注于某特定领域,为解决特定任务而设计的语言,常用来解决特定的领域问题。通过抽象MATIP会话模型,提出一种描述MATIP会话的DSL,支持业务人员快速构建个性化的测试场景,降低MATIP测试的复杂度。基于MATIP会话DSL,实现了MATIP测试服务插件,通过与CI/CD工具的对接,将MATIP服务的测试集成到DevOps流程中,推进了MATIP服务的自动化测试,做到了质量保证和效率提升。
关键词:MATIP;领域特定语言;自动化测试
一、前言
中国民用航空局《智慧民航建设路线图》明确提出加强民航基础设施保障,实现智慧出行、智慧空管、智慧机场、智慧监管;深化民航大数据场景应用,形成良好数据开放生态,实现跨业务领域数据资源的融合创新和挖掘分析[1]。作为民航信息系统的运营主体,各航司与民航信息服务提供商不断深入传统业务变革,促进了以业务目标和客户需求为中心的企业转型。在敏捷和精益[2]的影响下,企业软件研发过程提倡快速交付和持续优化,而测试工作贯穿整个研发过程,因此测试效率显得至关重要,直接影响整体的交付速度。在敏捷和 DevOps[3]模式下,频繁的交付加重了业界对测试的担忧,为应对这样的挑战,持续测试的概念被提出,并逐渐成为业界的共识。
MATIP[4]作为航空运输业专用传输协议,具有专业性强、受众范围小的特点,若在测试过程中过多关注MATIP会话与连接层面的问题,势必使得测试人员偏离业务主线、降低测试效率。同时,由于缺乏通用工具的支持,设计过程缺乏普适性,不利于与DevOps工具的结合及持续测试的执行。
二、相关技术介绍
在常规的MATIP服务测试过程中,通常采用定制的MATIP服务端与客户端程序作为通信载体,辅以数据库对交互报文进行存储,其会话策略在启动前通过参数的形式进行设置,之后保持不变,导致交互能力与适应能力弱,阻碍了自动化测试的开展。
HTTP具有简单、灵活、扩展性强的优点,基于HTTP的服务可以使用成熟稳定的工具(如浏览器等)方便地进行测试,对自动化测试支持程度高,使测试人员聚焦于业务需求的测试。DSL指的是专注于某特定领域,为解决特定任务而设计的语言,常用来解决特定的领域问题[5]。通过对MATIP会话模型的抽象,设计并实现用以描述MATIP处理的DSL,继而使用DSL对MATIP的会话建立与维护、心跳保持、报文收发、链路异常等场景进行声明式语义描述,有利于减少业务场景构建过程中的重复工作,丰富业务场景,提高测试效率,降低构建成本。同时,DSL可以提高代码的易读性,有利于组织内部统一语言的形成,便于内部交流,支持业务专家进行新型业务场景的快速构建。基于HTTP封装MATIP服务测试接口,利用DSL描述MATIP服务交互场景,是一种推动MATIP服务自动化测试的有效途径。
三、MATIP会话模型DSL
(一)MATIP会话中的数据类型
MATIP会话的生命周期包括连接建立、创建会话、数据交互、会话维持、会话关闭等阶段。因为MATIP协议建立在TCP/IP协议栈之上,一个MATIP会话开始于MATIP客户端和MATIP服务端的连接建立,此过程中的数据交互包括客户端对服务端的选择和服务端对客户端连接的验证。创建会话阶段,对于MATIP客户端,输出数据为打开会话SO控制报文,报文格式如图1所示。H1、H2用来标识会话,Flow ID用于多路复用时的数据流区分。输入数据为确认打开OC控制报文,用来表述接受或拒绝一个会话。与之相对,对于MATIP服务端,客户端发送的SO控制报文作为输入数据,MATIP服务端根据SO报文中的会话标识H1、H2及其他控制信息确定是否接受该会话打开请求,并生成用于表述拒绝或接受该会话的确认打开OC控制报文作为输出数据。在会话创建之后,客户端和服务端开始进行双向数据交互,根据MATIP数据格式按需发送或接收数据,具体数据MATIP数据格式参照RFC2351[4]。在MATIP会话的实现中,在长时间没有数据交互的情况下,为节省资源通常会终止空闲的MATIP会话。为了避免工作MATIP会话在空闲时被误终止,需要通过MATIP心跳报文进行会话维护。MATIP会话的关闭可由服务端和客户端的任何一方发起,输出数据为MATIP关闭会话SC控制报文,接收端在收到该控制报文后进行本地资源清理。
(二)MATIP会话模型DSL定义
在MATIP会话模型DSL的定义过程中,采用类SQL形式的语法定义。定义如下关键字:matip、scenario、create、alter、destroy、exec、display、which、and、or、not等。matip代表MATIP会话对象,scenario代表场景对象,create、alter、destroy、exec、display分别代表创建、修改、销毁、执行和查询相关的对象,which、and、or、not用于相关属性的设置或筛选,常用的语句如下:
create matip m1 mode=client and svrIp=10.1.1.1 and svrPort=350 and h1h2=EE10;//創建MATIP会话对象m1,其作为客户端连接目标服务器10.1.1.1的350端口,H1、H2为十六进制数值的字符串表示,用于标识与同一节点间多个不同的会话,十六进制取值范围0000——FFFF,共支持65536个不同的会话;创建MATIP会话时,本例中H1H2分别为EE和10,其余属性为缺省值
alter matip m1 timeout=30000 and interval=20;//修改MATIP会话对象m1在同步场景中应答超时时间为30000毫秒,连续请求间隔20毫秒
display matip which mode=client;//展示所有作为客户端的MATIP会话对象
destroy matip which h1h2=EE10;//销毁h1h2为EE10的MATIP会话对象,等同语句destroy matip m1
create scenario s1 which matip=m1 and action=tpcall and dataType=database and data=d1.t1 and counts=10 and interval=20;//创建名为s1的交互场景,使用名为m1的MATIP会话对象发起10次同步调用,两次之间的间隔为20毫秒,数据来源为数据库表d1.t1
exec scenario s1;//执行场景s1
display scenario s1;//展示场景s1的执行状态
四、基于MATIP会话DSL测试MATIP服务的方法与实现
借助于MATIP会话DSL对业务场景的描述,测试人员可以方便地构建业务测试场景。为实现DSL描述场景的正确执行,并与DevOps工具进行有机结合,提出一种基于MATIP会话DSL测试MATIP服务的方法。在架构上采用分层架构模式,接口层对外提供Restful风格接口,方便与DevOps工具集成。中间层提供报文处理和DSL解析功能,同时利用缓存为运行中的各场景提供数据支持。底层MATIP处理组件封装MATIP操作,维护MATIP连接资源池并实现MATIP数据的收发。任务管理组件负责各后台场景任务的执行。具体实现如图2所示,由接口层、报文处理组件、DSL解释器、MATIP处理组件、缓存和任务管理组件等模块组成。
(一)接口层
接口层负责与外部环境进行交互,承担着数据的输入输出、身份认证和访问控制等职责。接口层对外提供Restful API,便于与Devops工具进行集成。在功能上,接口层提供MATIP会话和业务场景的创建、更新、查询、执行与销毁等服务接口。
(二)报文处理组件
报文处理组件负责对输入的请求报文进行解析和有效性校验。在确保请求数据的正确性和完整性的前提下,将解析出的DSL串输入DSL解释器,并根据DSL处理结果完成应答报文,用于接口层返回。
(三)DSL解释器
DSL解释器根据输入字符串依次进行词法、语法和语义分析,将请求中描述MATIP场景的DSL语句映射为具体的操作集合。以下列用于创建MATIP会话对象的资源定义DSL语句为例,“create matip m1 mode=client and svrIp=10.1.1.1 and svrPort=350 and h1h2=EE10;”DSL解释器在获得执行操作和对象的类型、名称及属性后,调用MATIP处理组件中DSL协同模块提供的接口,创建一个名为m1的MATIP会话对象作为客户端尝试建立与测试桩服务10.1.1.1:350的连接,并以EE10作为H1、H2尝试打开会话并维持会话。若成功创建会话对象,DSL解释器会将新创建的会话对象添加进MATIP处理组件的Matip客户端连接池中,待后续使用,并在缓存中增加该对象的静态镜像。DSL解释器将上述操作执行的结果(创建会话对象成功与否的信息)作为输出。在对资源执行DSL语句的处理上,DSL解释器首先会查询缓存中是否存在该资源对象,若不存在直接返回错误提示信息,若存在,则从对应的MATIP连接池中取出目标对象,执行相应的处理。以下列资源执行DSL语句为例,“exec scenario s1;”DSL解释器从缓存中查找业务场景s1的信息,根据s1的属性信息获取在该场景中使用哪个MATIP会话进行哪些操作,生成一个后台任务,由任务管理组件进行调度处理。DSL解释器针对输入的处理按阶段划分如图3所示。
1.阶段1
接收并解析输入语句,检查DSL语句是否正确,并生成对应的抽象语法树AST。
2.阶段2
对AST进行语义分析,将DSL语句中的对象转化为实际的MATIP会话对象和场景对象。在转换过程中针对操作类型的不同,结合缓存模块中存储的对象信息,完成对操作对象的检查。例如create和exec操作均需要检查待创建的同名对象是否已经存在,在create操作中,若同名对象已经存在,返回错误信息;而exec操作相反,在操作对象不存在时返回错误信息。
3.阶段3
在生成执行计划阶段,DSL解释器按资源对象类型和操作类型进行区分,若为matip会话对象的非查询类display操作,利用MATIP处理组件提供的接口进行计划编排,若为matip会话对象或场景对象scenario的查询类display操作,则使用缓存提供的查询接口进行计划编排,若为场景对象scenario的exec操作,则创建后台任务。
4.阶段4
执行阶段负责发起阶段3生成的计划和后台任务的执行。特別对于后台任务,DSL解释器只负责将任务发送至任务管理组件,由后者负责任务的调度执行。
5.阶段5
将阶段4的执行结果作为输出进行返回,返回结果内容:创建MATIP会话对象m1成功、更新MATIP会话对象m1的interval属性成功、场景对象scenario对象s1的执行任务被添加等。
(四)缓存
存储当前所有MATIP会话对象和业务场景对象的静态镜像,包含对象的执行状态、处理的业务量、成功和失败次数等,用于生成应答结果。在scenario对象的执行过程中,承载业务处理的MATIP会话对象定期向缓存更新任务的执行状态,为DSL解释器的执行提供基础数据。
(五)MATIP处理组件
MATIP处理组件封装MATIP连接建立、断开、连接维持、打开会话、接受会话、拒绝会话、心跳处理和数据发送等功能,由DSL协同模块、Matip Listener、Matip客户端连接池、Matip服务端连接池和Matip工作协程等多个模块组成,通过这些模块功能的组合,实现MATIP服务端和客户端交互的诸多场景。DSL协同模块通过向DSL解释器提供调用接口,实现DSL语句的执行调用。Matip Listener作为Matip服务端启动侦听,用于以业务驱动端为MATIP服务端的测试场景下,接收对方的连接请求。Matip客户端连接池和Matip服务端连接池分别对不同模式下的MATIP会话对象进行管理,以满足不同的测试需求。Matip工作协程为具体执行业务场景的协程,根据DSL语句的内容完成MATIP数据收发。
(六)任務管理组件
任务管理组件负责维护各业务场景中的后台任务,以“exec scenario s1”为例,DSL语句的返回结果为是否成功添加场景对象s1的执行任务,任务管理组件根据该场景对象s1的属性信息负责其任务的具体执行,从对应的MATIP连接池中选取用于执行数据收发的MATIP连接,按照场景中定义的数据收发频率,从指定的数据源发送请求并接收应答。同时,任务管理组件负责任务的管理与维护,执行任务的撤销、中断、更新和重启等。
五、应用
MATIP会话DSL的提出与使用降低了测试MATIP服务的复杂性,业务人员使用MATIP会话DSL可以方便、迅速地构建个性化的测试场景,提升了测试效率。结合基于MATIP会话DSL测试MATIP服务在企业内部的实现,中国航信Devops平台完成了CI/CD工具与MATIP测试服务插件的对接,将MATIP服务的测试集成到DevOps流程中,以确保软件质量并提高开发效率。目前,该平台上构建的MATIP关联测试用例达600多个,支持了中国航信业务系统与外航、GDS之间的MATIP业务测试。
六、结语
本文介绍了DSL在MATIP服务测试中的应用,通过定义与实现MATIP会话DSL,为业务人员构建个性化MATIP测试场景提供了便利。基于该DSL实现的MATIP服务测试插件完成了与Devops工具的集成,推动了MATIP服务自动化测试的开展。领域特定语言DSL针对特定领域进行设计,具有简化维护、提升效率、提高团队协作和降低技术门槛等优势。在测试领域,尤其针对专业性强、受众范围小的业务场景,通过实现相应的DSL,提供高层次的抽象,不仅有助于降低测试复杂度,更有利于促进团队沟通与协作,实现业务知识积累。
参考文献
[1]中国民用航空局.智慧民航建设路线图.[EB/OL].[2022-01-06].https://www.gov.cn/xinwen/2022-01/21/5669771/files/f7402a57bcf349b0ae8d1224a0f35737.pdf.
[2]何勉.精益产品开发——原则、方法与实施[M].北京:清华大学出版社,2017.
[3]朱少民,李洁.敏捷测试--以持续测试促进持续交付[M].北京:人民邮电出版社,2021.
[4]A.Robert.Mapping of Airline Reservation, Ticketing,and Messaging Traffic over IP (RFC-2351),1998.
[5]Martin Fowler.领域特定语言[M].北京:人民邮电出版社,2021.
作者单位:中国民航信息网络股份有限公司
责任编辑:张津平、尚丹