使用WireMock模拟HTTP API服务

\

要点:

\\
  • 使用 WireMock可以极大减少创建连线测试桩所需要的时间\\t
  • 在JUnit里使用 WireMock可以更容易地编写各种测试用例\\t
  • 我们会给出一个单独使用 WireMock的例子\\t
  • 我们还会为手动测试人员介绍如何使用 WireMock的UI\\t
  • 还有其它一些内容\
\\

开场:我所知道的连线模拟工具

\\

在我的职业生涯中,我有幸在很多大公司工作过。在工作过程中,我发现在开发上存在的一个普遍现象:开发团队总是重复开发一些相似的工具。我亲眼所见两个不同银行的开发团队在公司内部(基于不同的代码库)开发出三个以上基于HTTP的连线模拟工具(有时候也被叫作服务可视化工具)。我还在一个媒体公司看到它们同一楼层的几个团队居然开发了五个这种工具。还有一个航空企业,它开发了至少一种这样的工具。

\\

这些基于HTTP的模拟工具主要有两方面的用途:

\\
  1. 在自动化测试里,它们提供了可以用于创建远程虚拟服务的接口,这样就可以在CI(持续集成)环境里构建系统,比如TeamCity或Jenkins。\\t
  2. 它们提供了Web界面,那些对技术细节不是很了解的测试人员可以在上面做一些探索性的测试。\

因为同一个工具同时被用于自动化测试和手动测试,自然会有很多重叠的地方。测试人员可以使用开发人员创建的桩,这样有助于他们之间的沟通。同时这样也会减少在创建测试桩上所做的工作,相比测试人员和开发人员要分别创建自己的桩,这种方式避免了很多重复性工作。不过有些团队没有测试人员,所以他们只需要编程接口而不需要Web界面。

\\

业界使用现成的工具

\\

让我们从日志和数据存储方面来一窥整个行业对这些工具的使用情况。

\\

如果有必要,你可以在一两天内轻松实现一个简单的日志框架。不过经验告诉我们,从头写一个日志框架并不是一个好主意。所以我们会使用logback、slf4j或其它一些现成的日志框架。

\\

日志还只是个简单的问题,如果我们要考虑更复杂的数据存储,我们只能使用市场上现成的解决方案,比如Oracle、MongoDB或Neo4J,具体要根据实际需要来选择。

\\

我们举个测试框架的例子。你不会为每个项目从头写一个测试框架,所以你会使用JUnit或者其它任何一个可用的框架,有时候可能会基于这些框架做一些定制开发。

\\

总的来说,针对那些常见的问题,总有一些现成的解决方案。

\\

WireMock:一个现成的连线模拟(虚拟服务)工具

\\

在预打包的测试框架解决方案方面,连线模拟工具(虚拟服务)会是一个更好的选择。WireMock就是这样一个备受关注的开源框架,它使用Java编写,可以在JUnit里使用,也可以作为独立的HTTP服务运行。

\\

在JUnit里使用WireMock

\\

假设我们有一个天气预报程序,它通过调用HTTP API从forecast.io获取伦敦的风速数据。预报程序获得的数据是JSON字符串,需要对它们进行解析,抽取出当前风速,再通过REST接口返回给用户。

\\

我们现在使用JUnit编写测试用例,需要使用桩来模拟forecast.io提供的Web服务:

\\
\public class WeatherApplicationTest {\    @Rule\    public WireMockRule forecastIoService = new WireMockRule();\}
\\

然后我们把预报程序加入到测试用例里。预报程序的start和stop方法分别放在JUnit的setup和teardown方法里。我们先测试一个正常的用例servesWindSpeedBasedOnForecastIoResponse:

\\
\public class WeatherApplicationTest {\    @Rule\    public WireMockRule forecastIoService = new WireMockRule();\\    private WeatherApplication weatherApplication = new WeatherApplication();\\    @Before\    public void setUp() {\        weatherApplication.start();\    }\\    @After\    public void tearDown() {\        weatherApplication.stop();\    }\\    @Test\    public void servesWindSpeedBasedOnForecastIoResponse(){\        // TODO\    }\}
\\

成功的测试用例

\\

测试过程是这样的:先发送请求到预报程序,预报程序从forecast.io获取响应数据,然后对其进行解析,加入后缀,再把它返回给用户。

\\

首先我们使用断言检查我们想要的风速数据格式是以英里每小时(mph)为后缀的:

\\
\@Test\public void servesWindSpeedBasedOnForecastIoResponse() {\    assertEquals(\"12.34mph\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值