通用技术 可视化管理 WireMock 数据,WireMock UI

yun · 2023年07月07日 · 最后由 yun 回复于 2023年08月25日 · 4682 次阅读

1. WireMock 介绍

WireMock 是一款虚拟服务工具,即我们常说的 HTTP Mock 服务。

WireMock 起始于 Tom Akehurst 在 2011 年的一个业余项目,现在已经非常成熟,拥有强大的 HTTP Mock 功能,并具备成熟的生态。

下面列举一些 WireMock 的核心特性:

  • Request Matching:请求匹配,匹配模式多种多样,比如根据 Method、URL、Params、Headers、Body 等内容匹配,也可以使用包含、相等、正则、JSON 提取、XPath 提取、And/Or 运算符等方式匹配。
  • Response Templating:响应模板,可以动态生成 Mock 数据,也可以根据请求数据动态生成响应数据。
  • Simulating Faults:模拟响应错误,比如空响应。
  • Delay:响应延时,比如固定延时时间、随机延时时间、模拟弱网等等。
  • Scenarios:场景管理,通过使用场景,我们可以控制 Mock 的匹配顺序。
  • Webhook:在响应返回后,可执行异步回调操作,适合一些异步接口。
  • 流量透传:比如我们只希望个别接口走 Mock,而其他接口都走真实服务。
  • 代理转发:所有请求都走真实服务。
  • 流量录制:当使用 WireMock 时,录制所有经过 WireMock 的流量数据。
  • 请求日志:所有发送到 WireMock 的请求都会被记录下来。
  • 二次开发:比如我们可以实现自己的 Admin API、将 WireMock 数据存储到数据库而非本地文件、增加自定义的请求匹配器、自定义的响应模板等等。

HTTP Mock 大体上有两种接入方式,一类是虚拟服务模式或者叫直连模式,一类是代理人模式。两种接入方式各有利弊,这里不做过多阐述,有兴趣的可自行了解。

  • 虚拟服务模式的典型代表有:WireMock/easy mock/ServiceV 。
  • 代理人模式的典型代表有:Mitmproxy/Lyrebird/Anyproxy。

WireMock 和 Lyrebird 都同时支持虚拟服务模式和代理人模式接入(代理模式接入时,如果请求为 HTTPS 需要安装/导入工具自签名的 CA 根证书)。WireMock 使用代理方式接入时可以通过 host header 区分来自不同域名的相同路径的请求,从而给出不同的响应内容。

2. WireMock UI

WireMock 虽然功能强大,但缺乏简单易用的可视化界面是阻碍我们使用它的一大因素。目前市面上的 WireMock UI 要么过于老旧,项目停止维护,不可使用;要么使用受限,比如官方推出的 WireMock 云服务 WireMock Cloud ,免费版有使用限制。

如果初次上手,推荐使用 WireMock 云服务进行体验。不用自己进行部署维护,只需注册账号即可创建自己的 Mock 项目,简单易用。

有了开源免费的 wiremock-ui,我们再也不用手搓 StubMapping 了。下面简单介绍一下 wiremock-ui(这里的 WireMock UI 特指本开源项目,下同)的使用。详细用法请阅读官方文档:https://wiremock.org/docs/

3. WireMock UI 的使用

3.1 启动 WireMock 实例

Windows CMD 启动命令(3.0.0 beta 10 版本,生产使用推荐稳定版 2.35):

"D:\Program\Java\jdk-11.0.11\bin\java.exe" ^
 -cp wiremock-standalone-3.0.0-beta-10.jar;wiremock-webhooks-extension-2.35.0.jar ^
 com.github.tomakehurst.wiremock.standalone.WireMockServerRunner ^
 --extensions org.wiremock.webhooks.Webhooks ^
 --global-response-templating --filename-template={{{id}}}.json -port=3010

也可以使用官方提供的 Docker 镜像启动。

3.2 添加项目信息

1、访问在线网站 https://qadoc.cn/wiremock ,初始页面如下。

2、点击 WireMock 图标,进入项目信息管理页面,添加项目信息(点击单元格开始编辑,实时保存)。

3.3 Mock 初体验

1、切换到主页面,选择刚添加的项目,添加如下所示的一条 Mock 数据(列表项中的红色星号表示数据有修改未保存)。


2、点击 “预览”,可以看到最终发送给 WireMock 服务的预览数据。

{
  "metadata": {
    "wmui": {
      "description": "",
      "createTime": "",
      "updateTime": "",
      "responseBodyType": "text"
    }
  },
  "request": {
    "method": "GET",
    "urlPath": "/example/get",
    "queryParameters": {
      "id": {
        "hasExactly": [
          {
            "equalTo": "A"
          },
          {
            "equalTo": "B"
          },
          {
            "equalTo": "C"
          }
        ]
      }
    }
  },
  "response": {
    "status": 200,
    "statusMessage": "",
    "headers": {
      "Content-Type": "text/plain"
    },
    "body": "This is Response Body Info.",
    "fromConfiguredStub": true
  },
  "name": "多值 QueryParam 的 GET 请求",
  "priority": 5,
  "persistent": true,
  "postServeActions": []
}

3、点击保存,访问 http://localhost:3010/example/get?id=A&id=B&id=C

3.4 动态响应

1、添加包含动态响应的 Mock 数据。


2、访问 http://localhost:3010/response/template ,可以看到如下响应信息。

3.5 请求日志

切换到 Logs 菜单,可以查看请求日志(保存在内存中,未持久化)。

4. 友情提示

  • 如果需要 HTTPS 访问 Mock 服务,可以使用公网域名 + Nginx 代理。
  • 正式使用前,建议先测试保存的 Mock 数据是否正确持久化(有时可能启动命令参数不对,导致持久化的文件名错误,比如没有 .json 结尾(也可能是 3.0 beta 版本 bug),总之正式使用推荐 2.35 稳定版,并且使用前测试下)。
  • WireMock 是有状态服务,数据保存在内存和持久化数据中。如果使用同一份持久化数据启动了两个实例服务 A 和 B,只通过 UI 修改了 A 的数据,那么 B 内存中的数据并未更新。

如果使用本项目过程中发现问题,请在项目的 Issues 中提交。

共收到 5 条回复 时间 点赞

很不错的工具,研究一下

这个和 Charles/Fiddler 对比起来有什么区别呢

yun #3 · 2023年07月10日 Author
凯丽 回复

1、主要使用场景上的区别:

  • Charles/Fiddler 的主要使用场景是正向代理,拦截查看客户端发送的请求,也可以修改客户端的请求或服务器的响应信息。这点 Wiremock 也可以做到,只要启动时加上 --enable-browser-proxying 参数即可。
  • WireMock 的主要使用场景是虚拟服务,比如模拟银行的服务,请求链路为客户端(比如手机)- 网关 - 服务端 - 银行测试环境服务端,Wiremock 可以替换这里的银行测试环境服务端。

2、Mock 规则上的区别:

在 Mock 规则的编写上,Wiremock 是比 Charles/Fiddler 更为方便的,支持多种请求匹配模式和响应模板。可以直接代理转发或流量透传。Mock 规则的管理上也更方便。

3、抓包上的区别:

但如果只是查看客户端请求响应信息,那么 Charles/Fiddler 更为方便强大,有多种过滤和显示方式,同时请求数据实时渲染。

4、性能上的区别:

如果要寻求一个虚拟服务工具,虽然 Charles/Fiddler/Anyproxy 这类工具也可以做到,但性能上有很大的损耗。Wiremock 作为专门的虚拟服务工具,一般服务端直连虚拟服务,省去中间代理环节,且所有 Mock 规则都存在内存,处理更高效。

我项目里面从来不用界面。都是 testcase 执行的过程中,用测试代码动态设置 mock 的返回的。每个 testcase 跑完了,清空 wiremock 的 mock 设置,接收到的 request 的记录

yun #5 · 2023年08月25日 Author
chris 回复

本地管理 Mock 数据也是一种使用方式,我们是在平台上管理 Mock 数据,数据存放在数据库。如果 Mock 数据不需要根据测试用例上下文动态生成,其实也可以提前通过界面创建好,用例里通过 Mock ID 引用来动态更新 Mock 服务数据。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册