自动化测试技术中Mock框架的建设与应用
2017-07-05孟燕
孟 燕
(杭州科技职业技术学院 信息工程学院,浙江 杭州 311402)
自动化测试技术中Mock框架的建设与应用
孟 燕
(杭州科技职业技术学院 信息工程学院,浙江 杭州 311402)
随着商业应用系统的增多,为了快速响应用户需求、加快版本交付、提高版本交付质量,有必要采用自动化测试来代替部分手工测试进行项目质量守护。自动化测试分为面向界面的Watchman自动化测试、面向后台处理过程的Utplugin自动化测试和面向单元测试的Junit自动化测试,但缺乏面向接口的自动化测试。联机接口的存在,使得应用系统可以实时访问,快速对外提供业务反馈,但也加大了应用耦合度,给自动化测试带来不便。为此,开展面向接口的Mock框架自动化测试建设,可以在测试中为应用解耦、接口测试提供必要条件,从而丰富自动化测试分层的框架,提高接口程序自动化守护的质量。
Mock;自动化测试;应用解耦
随着商业应用系统信息化水平的提高,为了满足业务发展的需要,客户对软件产品研发规模和频度的要求也越来越高。而传统的测试方法只会在整个软件开发完毕且代码“冻结”后才进行,加之耗时较长,不利于敏捷和迭代,约束了对业务需求的快速响应。为此,笔者开展自动化测试框架研发活动,旨在通过自动化测试工具加快应用开发成果集成,提高产品开发、测试的效率和质量,形成有效质量守护。在自动化测试框架研发过程中发现,随着商业应用系统复杂度和广度不断深入,为了支持各应用系统的联动,衍生了上下游接口的相互访问,并形成了功能强大的全功能系统。在项目开发过程中,存在各种应用内部或外部的调用关系,甚至与第三方系统建设存在依赖关系,而本系统极其缺乏这类自动化测试接口工具,为了降低日常研发测试的外部依赖程度,需要梳理接口自动化测试工具Mock的定义,明确Mock的建设目标[1-3]。
通过Mock自动化技术中使用虚拟对象来替代真实的对象,可以消除测试案例中对主机接口、第三方应用和数据库依赖等单节点的测试障碍,使开发人员或测试人员将精力集中在业务流程测试方面,从而更好地提高应用系统测试质量。
近年来,国内外大型IT企业在Mock自动化研究中取得了一系列快速突破,如2013年开源社区GITHUB推出了基于MIT协议的开源Java测试框架Mockito[4],Mockito试图通过移除“期望规范”来去除期望-运行-验证模式,因此使接口耦合度降到最低,这样的突出特性简化了接口测试代码,使其更容易阅读和修改。 2014年6月,Facebook发布了一个Mock的开源工具Jest[5],用于快速、可靠地测试Web聊天应用,对于每一个需要测试的功能,Jest基于所模拟的功能创建一个与真实模块具有相同形状的对象,并给出测试返回值。
1 Mock定义与Mock框架系统建设的目标
Mock是指在测试一个对象A时,系统构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是该系统事先设定且符合预期的。通过这些Mock对象来测试A在正常逻辑、异常逻辑或压力情况下工作是否正常。引入Mock最大的优势在于:Mock的行为固定,其能确保当访问该Mock的某个方法时总是能够获得一个没有任何逻辑直接返回的预期结果。Mock对象的优点在于隔绝其他模块出错引起本模块的测试错误,隔绝其他模块的开发状态,只要定义好接口,不用管其开发是否完成。
本系统Mock建设的目标,首先必须是一个轻量的Web系统,其不仅能支持应答而且至少需要支持4个层次的服务提供与用户扩展,即协议层、解析层、匹配层和执行引擎。其中,解析层提供常用的XML解析,用于解析接口报文交互用的XML报文;匹配层和执行引擎能满足个性化接口测试需求。当某层能力不足时,用户可结合需求扩展,并继续复用其他层次的现有能力,降低模拟器建设工作量。通过这4个层次的服务化,使得Mock取代第三方完成接口应答或响应,返回预期结果,从而实现接口程序测试的无人值守。
2 Mock框架架构图
Mock框架主要解决的测试场景有:①真实对象具有不可确定的行为,可能会产生不可预测的结果(如股票的行情) ;②真实对象很难被创建(如具体的Web容器);③真实对象的某些行为很难触发(如网络错误) ;④测试需要询问真实对象的被调用方式(如测试可能需要验证某个回调函数是否被调用了);⑤有些对象操作耗时较多,而被测系统依赖于这类操作较多(如大文件读写操作);⑥一些异常逻辑在正常测试中是很难触发的,通过Mock可以人为地控制触发异常逻辑。
假定被测系统的应用系统依赖于第三方应用提供的接口。当第三方应用不可用时,系统会将其替换为Mock,可提供各类接口模拟服务。Mock框架架构如图1所示。
图1 Mock框架架构
3 Mock分层系统的设计与实现
3.1 Mock应用系统的设计思想
Mock的设计思想是将接口的操作与数据的操作相分离,在实现桩程序时,只考虑对各种通信接口的包装,而将条件和结果数据的构造交给使用者。这样,同样一个桩程序,只要是基于相同的通信协议,就可以模拟出任意行为,如①模拟一个HTTP或TCP接口,提供HTTP或TCP服务与应答;②根据不同上送的服务请求,返回不同的应答报文,如XML应答或JSON应答[6];③对各类网络异常、交易异常提供用户级、系统级的返回断言信息进行容错处理。
3.2 Mock各分层具体实现逻辑
Mock分层系统实现如图2所示,协议层、解析层、匹配层和执行引擎进行报文解析、格式化、规则匹配和应答功能,具体描述如下:①协议层主要处理接口协议的技术细节,屏蔽各种协议的技术差异,让解析层专注于业务数据的解析,将接口中业务数据根据不同的协议类型提取出来,再由解析器采用不同规则解析出具体的字段;②解析层提供各类解析器,用于解析不同格式的业务报文,解析后形成一系列键值,可为后续处理提供统一的数据格式;③匹配层[7]允许用户指定不同的匹配方式和条件,例如当收到http接口请求时,预先使用固定的规则解析上送报文,形成一系列键值对,为匹配器的使用奠定基础,然后用户可以根据键值对的情况,选择不同匹配方式和条件,指定不同的返回报文;④执行引擎将一系列接口和执行命令组合形成一系列原子命令,从而仿真各种测试场景[8-9]。
图2 Mock分层系统实现
4 Mock各分层系统原型与评价指标
4.1 Mock系统原型
现通过IE或其他途径发起以下http请求来简述其原型实现过程。http://192.168.0.1:8080/TPS/udx/dpy?app=ndis&month=201408Mock在8080端口将收到接口请求,会这样响应(其他协议类型的接口处理流程类似):
(1)协议处理。按http协议处理请求数据,解析到具体访问的服务和业务数据,端口:8080,服务:/TPS/udx/dpy,业务数据:app=ndis&month=201408(实际上业务数据并非这样一个字符串,但业务数据的含义与该字符串是等价的,在这里业务数据并没有键值对的概念,其还是一个整体)。根据端口和请求的服务(/TPS/udx/dpy),Mock在现有Mock设置中寻找匹配的设置,若寻找不到则考虑是否转发。而当前接口请求与上面的Mock设置可以相匹配时,则将基于该Mock设置进入下一响应步骤。
(2)解析业务数据。使用当前Mock设置指定的解析器对业务数据进行解析,得到两个键值对,业务数据app和month在这里被解析和细化为ndis和201408。
(3)依次匹配并执行原子命令。由于当前Mock设置了两个匹配器(两个匹配条件),将按顺序逐一进行验证。第一个匹配器为字段匹配器,要求存在字段app且值为ndis,从上一响应步骤的键值对可知,该要求是满足的。此时匹配器匹配通过,将按顺序执行该匹配器下挂的所有原子命令:当前仅配置了一个Uri资源返回命令,Mock会从Uri(dpy_ndis.json)指定的资源文件以UTF-8编码获取文本,并作为应答报文返回给调用方。由于第一个匹配器匹配通过,将不再进行第二个匹配器的匹配工作。尽量找到一个能响应接口的Mock设置:若当前Mock设置的所有匹配器均未能匹配通过,Mock会根据IP和请求的服务,寻找下一个合适的Mock设置,并使用其尝试去作响应,再回到第2个响应步骤匹配均失败时,再次考虑转发。若所有合适的Mock设置中所有匹配器均不通过,Mock将再次考虑是否转发接口。Mock处理流程图如图3所示。
4.2 Mock接口测试评价指标
采用传统接口测试与采用Mock接口测试的各个测试指标对比,如表1所示,可看出Mock接口自动化测试无论是对减少测试人力投入、提高测试质量还是减少环境依赖,都具有重要的研究意义[10]。
图3 Mock处理流程图
测试衡量指标传统接口测试Mock接口测试测试投入开发与测试投入占比2∶1无人值守,报表系统支撑自动发邮件报告案例执行情况测试路径覆盖率测试路径覆盖不全,且异常场景测试需要消耗更昂贵的投入所有if...else路径覆盖并生成程序覆盖率进度和分支覆盖率进度报告测试依赖搭建测试环境、准备测试数据常常需要一周时间且上下游沟通成本高自动化生成测试数据,不依赖测试环境准备测试容错性测试环境一旦出现问题或者受第三方接口开发进度影响,测试将受阻模拟第三方接口提供服务与应答测试案例复用性、测试质量测试案例复用率低、系统上线后暴露出很多问题通过可度量、可预测、可重复的自动化流程系统地提高软件的质量和安全性
通过上述实践说明,在测试过程中如果存在第三方未完成开发或存在缺陷依赖的情况下,会导致自动化测试作业中断[11],减弱自动化测试的效果,这时Mock能成功地与第三方系统开发进度解耦,减少各种环境依赖,取代第三方完成接口应答或响应,返回预期结果,提高自动化测试的稳定性与通过率,从而提高自动化测试守护的质量。
5 结论
笔者通过Mock框架的建设与实施,阐述了Mock在模拟下游接口的响应和应答上的可替代性和稳定性[12],Mock通过支持多种协议的解析和匹配,可为测试过程中的关键节点解耦,提高合作方测试的独立性,从而较大地提高测试效率,最大程度地完成测试路径覆盖。与此同时,通过对Mock原型的研发和不断升级,发现需要从应用研发场景、测试案例设计、代码重构来对接口功能进行全流程和持久的质量守护,并最终实现接口自动化测试的无人值守,提高产品的质量,从而有效减少人工测试的压力。
[1] GRAHAM D,FEWSTER M.自动化测试最佳实践[M].朱少民,张秋华,赵亚男,译.北京:机械工业出版社,2013:15-18 .
[2] KOSKELA L.测试驱动开发的艺术[M].李贝,译.北京:人民邮电出版社,2011:21-24.
[3] 朱菊,王志坚,杨雪,等.基于数据驱动的软件自动化测试框架[J].计算机技术与发展,2006,16(5):18-23.
[4] KOSKELA L.代码覆盖率简介[EB/OL].(2004-01-01).http://www.javaranch.com/ newsletter/200401.
[5] 南柯.Pageobject模式实现页面元素分离[EB/OL].(2013-01-05) .http://www.51testing.com/html/87/300987-831789.html.
[6] FOWLER M.Continuous integration[EB/OL]. (2010-03-01).http://www.martinfowler.com/articles/continuousIntegration.html.
[7] 李首文,何贵兵.自动技术在软件测试过程中的研究与实施[J].科技信息,2011(15):113-114.
[8] 吴莹.基于Selenium的Web自动化测试框架[J].科技传播,2011(18):223-224.
[9] 张永梅,陈立潮,马礼,等.软件测试技术研究[J].测试技术学报,2002(2):75-76.
[10] 姚砺,束永安.软件测试自动化关键技术的研究[J].安徽大学学报(自然科学版),2003,27(4):27-33.
[11] 刘腾.软件测试技术与自动化测试框架模型的研究与应用[J].电脑知识与技术,2009(26):28-31.
[12] 吕诚昭,孟洛明.一个软件测试自动化系统:TSBAG[J].北京邮电学院学报,1993,16(1):8-14.
MENG Yan:Lect.; College of Information Engineering, Hangzhou Vocational College of Science and Technology, Hangzhou 311402, China.
Test Automation Technology in the Construction and Application of Mock Framework
MENG Yan
With the increasing of business system, in order to react to demand of users quickly, improve the quality and speed of project, it’s necessary to adopt auto-test to substitute manual test. Auto-test includes many types, such as interface-orient watchman test, process-orient utplugin test and java-orient test,but lack of interface-orient auto-test. The existence of online interface makes the application system can be real-time access, and provide business feedback quickly, but also increased the application of coupling.For the inconvenience of automated testing, this article hopes to interface-based Mock framework for automated testing and construction. For the application of decoupling, as soon as possible to carry out the interface test to carry out the necessary conditions to enrich the automation test layered framework to improve the quality of interface program automation daemon.
Mock; auto-test; application of decoupling
2095-3852(2017)03-0364-04
A
2017-01-07.
孟燕(1981-),女,浙江杭州人,杭州科技职业技术学院信息工程学院讲师,主要研究方向为软件工程.
TP311.51
10.3963/j.issn.2095-3852.2017.03.024