模拟工具之WireMock研究

2018-02-24 13:55黎素珍
电脑知识与技术 2018年34期
关键词:软件测试

黎素珍

摘要:随着分布式服务的广泛应用,项目业务拆分后一般由不同业务团队承建。各团队的开发进度不一致而出现业务间依赖不可用的问题越来越突出。使用Mock技术可以十分便利的解决外部依赖。文中在介绍Mock概念的基础上,引入了WireMock工具,并着重阐述WireMock的两种运用方法。

关键词:软件测试;接口测试;模拟服务;模拟对象;WireMock

中图分类号:TP311     文献标识码:A     文章编号:1009-3044(2018)34-0255-02

1 引言

随着互联网时代的快速发展,分布式服务的应用越来越广泛,日常服务出现粒度细、业务复杂的特点。在自身的业务系统及其业务线上都存在许多独立部署的接口、服务。Mock技术,很大程度上保证了在研发、测试过程中,自身所依赖的服务随时都可以使用,从而不阻碍各个团队自身的研发、测试进度。一般来说,我们通过构建Mock Service,并配置不同的输入、数据和场景的方式,对依赖的接口进行Mock。构建Mock Service的工具有许多,比如:moco、Mountebank、VCR、soapUI等,本文将介绍一款轻量级的Mock Service——WireMock。

2 Mock概述

Mock的意思是模拟,即通过某种技术手段创建一个虚拟的对象,模拟某些不易构造或是不易获取的对象的行为,返回预先的设计结果。

2.1 Mock的粒度

根据需要测试的对象大小,Mock的粒度是有区别的,从小到大主要分为三个粒度:

1) mock一个函数:与待测试函数有关的交互全部使用mock方式替换。

2) mock整个类或接口:与待测试的类或是接口的交互全部使用mock方式替换;

3) mock整个系统:与待测试的系统外部的交互全部使用mock方式替换。

总而言之,模拟外部依赖时需要明确的区分内、外的边界,以找到合适的切入点。在制定测试策略时可参照测试金字塔以便区分不同层次的测试关注点,如图1。测试的粒度越大,测试的成本、效率、缺陷定位的难易程度均呈线性增长。WireMock工具的Mock粒度应属于第二种。

2.2 Mock的好处

WireMock测试工具主要用于接口测试领域。根据分层测试定义,最底层由开发人员编写的单元测试保证代码质量[1],最顶层由功能测试人员进行手工或者UI自动化测试来保证功能的可用。接口测试的意义则在于能更早的发现问题、缩短研发周期及发现更加底层的问题等等。而对接口进行Mock的好处则在于:

1) 消除依赖项,研发团队可以并行工作,且不影响研发进度;

2) 提前进入测试,更早的发现问题,提高测试效率。接口定义完成后,测试人员创建Mock,把接口提前添加到自动化测试平台,起到TDD的效果;

3) 有效地增加覆盖面:当某些场景无法通过正常方式操作时,可以模拟接口入参实现复杂的业务逻辑。

3 WireMock的应用

WireMock,是一个开源的测试工具,最初是由Tom Akehurst在2011年创建的。它具有支持HTTP响应存根、请求验证、代理/拦截、录制/回放以及故障植入等功能。WireMock可使用的HTTP方法包括GET、POST、PUT、DELETE、HEAD、TRACE、OPTIONS等,并支持自定义header、数据模板、URL Template、Query parameters匹配以及显示指定文件内容等等。工具是使用Java语言开发的,有两种较为普遍使用方式:1)jar包单独部署作为独立的HTTP服务使用,这种方式基本能满足大多数需求;2)通过引入依赖的方式在代码中使用。

3.1 作为服务独立运行

在官网下载一个独立的可运行jar包,输入命令:java –jar wiremock-standalone-2.19.0.jar来启动WireMock。若未指定端口号,程序默认绑定端口号为8080,启动后在当前目录下会创建两个空文件夹:__files和mappings:

1) __files文件夹用来放置测试的响应,如返回的json或字符串。当存根映射不匹配URL时,也支持从__files中读取匹配文件进行响应。假设__files/sample路径下存在test.html文件,且存根映射与请求的URL不匹配,当请求http://<host>:<port>/sample/test.html时,程序将返回__files下对应的文件信息。

2) mappings文件夹放置的*.json文件,用作请求响应配置。*.json文件的名称随意,可以添加多个任意的文件。

3.1.1 模拟 POST请求接口

在mappings文件夹下创建一个*.json文件,以POST方法为例进行Mock,内容如图2。

客户端发送POST请求http:// <host>:<port>/lwebtest/UserLogin来调用模拟的UserLogin接口。當请求body内容与定义匹配(符合equalTo的内容),则返回Response响应。响应可分为body直接返回和指定file返回(支持json、xml、html等)。此外,WireMock还提供了其他匹配符,如:matches、binaryEqualTo、equalToXml、matchesXPath等。

mappings文件夹中的*.json文件,除上述手动创建外,可以通过录制生成,步骤如下:

1) 在浏览器中输入WireMock的录制地址:http:// /__admin/recorder/

2) 在Target URL中输入目标URL后,再点击Record按钮进入录制状态。

3) 以上述UserLogin接口为例(WireMock部署的端口号为9000):使用Fiddler工具的Composer模块发送Post请求:http://localhost:9000/lwebtest/UserLogin;WireMock接收到请求后,向目标服务器转发请求http://localhost:8080/lwebtest/UserLogin,再将目标服务器返回的结果返回,并记录请求及响应的内容。

4) 点击Stop按钮后停止录制。此时,在mappings文件夹中会新生成一个.json文件,文件记录了步骤3)中请求和响应内容。

5) 若后续再进行POST访问http://localhost:9000/lwebtest/UserLogin接口时,WireMock将从已录制的json文件中获取对应的响应信息进行返回。录制的json文件可以进行修改,以便模拟不同的请求及响应内容。注意,修改文件后内容不能马上生效,需重新启动WireMock。

3.2 作为引入依赖的方式使用

WireMock自带了一些JUnit的规则,用以服务器生命周期管理,并能进行配置/撤销任务。接下来以Maven工程里JUnit使用WireMock为切入点进行说明。

首先,在pom.xml文件中,添加依赖:

<dependency>

<groupId>com.github.tomakehurst</groupId>

<artifactId>wiremock</artifactId>

<version>2.19.0</version>

<scope>test</scope>

</dependency>

其次,为使WireMock支持基于测试用例进行启动、停止,需将下文代码添加到测试类(或父类)中:

@Rule

public WireMockRule wireMockRule = new WireMockRule(WireMockConfiguration.options().port(9000));

之后就可進行测试用例的编写。WireMock 的打桩可分为两种方式:Java代码和json api。

1) Java代码方式打桩:以图3为例,测试代码mock了一个get请求/lwebtest/bookinfo,返回结果中定义了状态码(200)、头部信息(Content-Type)及body内容。本例还引用了必要的匹配器和asserThat方法进行断言。在最后使用了WireMock的verify对请求进行验证。

2) json api方式打桩:通过文件或者代码配置,在工程中/test/resources目录下创建__files和mappings文件夹。然后,在mappings目录下创建需要的*.json文件;之后就可以在测试代码中使用http请求json中的url路径。

4 结论

WireMock是国外接口测试领域针对API的知名Mock测试工具。它在易用性上存在些许不足之处,如需要编写大量Mock API的规则,无法自动生成数据等。不过,相较其他Mock工具而言,WireMock的优势仍十分明显:在隔离外部调用时,可以避免多服务之间的复杂情况(譬如网络、其他研发小组的服务可用性等),并能以可重复的方式来模拟任何场景;可以较好地模拟一些大粒度的异常场景,如:网络错误、Down机、SSL验证失败、请求响应不匹配等等。WireMock运行十分稳定,且反馈周期短,非常适合小型项目。

参考文献:

[1] 虫师.Web接口开发与自动化测试——基于Python语言[M].北京:电子工业出版社,2017.

[2] 潘诗瑶,黄建明.Web应用系统中的MOCK测试技术[J].软件,2016,37(12):214-218.

[3] 赵文杰.软件开发中的自动化单元测试浅谈[J].计算机光盘软件与应用,2014,17(21):74+76.

【通联编辑:梁书】

猜你喜欢
软件测试
基于OBE的软件测试课程教学改革探索
基于MBD模型自动生成测试用例的软件测试方法
计算机软件测试方法的研究
EXCEL和VBA实现软件测试记录管理
关于软件测试技术应用与发展趋势研究
一种航空机载软件测试项目的进度改进模型
军用软件测试文档生成设计与实现
软件测试工程化模型及应用研究
智能电能表软件测试技术概述
《软件测试》课程教学策略研究