test mock-03-wiremock 模拟 HTTP 服务的开源工具 flexible and open source API mocking

拓展阅读

test 之 jmockit-01-overview

jmockit-01-test 之 jmockit 入门使用案例

mockito-01-overview mockito 简介及入门使用

PowerMock

Mock Server

ChaosBlade-01-测试混沌工程平台整体介绍

jvm-sandbox 入门简介

wiremock

WireMock是一个流行的开源工具,用于API模拟测试,每月下载量超过500万次。它可以帮助您创建稳定的测试和开发环境,隔离与不稳定的第三方服务的依赖,并模拟尚不存在的API。

WireMock于2011年由Tom Akehurst作为Java库启动,现在已经涵盖多种编程语言和技术栈。

它可以作为库或客户端包装器在许多语言中运行,也可以作为独立的服务器运行。项目及其生态系统背后有一个庞大的社区。

WireMock支持多种创建模拟API的方法 - 在代码中、通过其REST API、作为JSON文件以及通过记录代理到另一个目标的HTTP流量。

WireMock具有丰富的匹配系统,允许将传入请求的任何部分与复杂和精确的条件进行匹配。

通过基于Handlebars的模板系统,可以动态生成任何复杂度的响应。

最后,由于其众多的扩展点和全面的API,WireMock易于集成到任何工作流程中。

关键特性

WireMock可以在单元测试中运行,也可以作为独立进程或容器运行。

其关键特性包括:

  • 可通过URL、头部和正文内容模式进行HTTP响应存根匹配
  • 支持通过流畅的Java API、JSON文件和HTTP传输的JSON进行配置
  • 存根的录制和回放
  • 请求验证
  • 故障和响应延迟注入
  • 按请求的条件代理
  • 用于请求检查和替换的浏览器代理
  • 具有状态的行为模拟
  • 可扩展性

WireMock生态系统

WireMock具有针对其他语言和测试框架的实现和适配器。它支持多种技术栈的适配器和实现,包括Python、.NET、Golang和Rust。

对于JVM生态系统,有适用于Spring Boot、Quarkus、Kotlin、Testcontainers等的库。

WireMock还可以在Android支持上运行,并即将提供官方的gRPC和GraphQL适配器。

快速入门:使用Java和JUnit 4进行API模拟

在本指南中,我们将使用WireMock和JUnit 4编写API单元测试。

先决条件

  • Java 11或17
  • Maven或Gradle,使用最新版本
  • 一个基于Maven和Gradle的Java项目
  • 一个我们将用作演练场的单元测试文件

将WireMock依赖项添加到您的项目

WireMock通过Maven Central分发,可以通过常见的构建工具的依赖管理包含在您的项目中。

要将标准的WireMock JAR添加为项目依赖项,请将以下依赖项放在构建文件的dependencies部分中。

在我们的测试中,我们还将使用AssertJ来验证响应。为了发送请求,我们将使用Java 11+中可用的嵌入式HTTP客户端。

如果您想添加一个Java 1.8测试,您将需要添加一个外部的HTTP客户端实现,如Apache HttpClient。

<dependency><groupId>org.wiremock</groupId><artifactId>wiremock</artifactId><version>3.3.1</version><scope>test</scope>
</dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.24.2</version><scope>test</scope>
</dependency>

添加WireMock规则

WireMock提供了一些JUnit规则来管理服务器的生命周期和设置/拆卸任务。

要使用WireMock的流畅API,请添加以下导入语句:

import static com.github.tomakehurst.wiremock.client.WireMock.*;

为了在每个测试用例中自动启动和停止WireMock,请将以下内容添加到您的测试类(或其超类):

@Rule
public WireMockRule wireMockRule = new WireMockRule(8089); // No-args constructor defaults to port 8080

写一个测试

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;...@Test
public void exampleTest() {// Setup the WireMock mapping stub for the teststubFor(post("/my/resource").withHeader("Content-Type", containing("xml")).willReturn(ok().withHeader("Content-Type", "text/xml").withBody("<response>SUCCESS</response>")));// Setup HTTP POST request (with HTTP Client embedded in Java 11+)final HttpClient client = HttpClient.newBuilder().build();final HttpRequest request = HttpRequest.newBuilder().uri(wiremockServer.getRequestURI("/my/resource")).header("Content-Type", "text/xml").POST().build();// Send the request and receive the responsefinal HttpResponse<String> response =client.send(request, HttpResponse.BodyHandlers.ofString());// Verify the response (with AssertJ)assertThat(response.statusCode()).as("Wrong response status code").isEqualTo(200);assertThat(response.body()).as("Wrong response body").contains("<response>SUCCESS</response>");
}

拓展测试类

为了对由规则创建的WireMock服务器的设置有更多的控制,您可以将通过流式构建的Options对象传递给规则的构造函数。

让我们以更改端口号为例:

import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
...@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));

您可以让WireMock(更准确地说是JVM)选择随机的、空闲的HTTP和HTTPS端口。如果您想要并发运行测试,这是一个很好的选择。

@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());

可以用下面的发现对应的端口信息:

int port = wireMockRule.port();
int httpsPort = wireMockRule.httpsPort();

wiremock 是如何实现 http 服务的模拟的?原理是什么

WireMock实现HTTP服务的模拟的基本原理是拦截和模拟HTTP请求,并根据预定义的规则返回相应的模拟响应。

以下是WireMock的基本原理:

  1. 代理模式: WireMock 可以作为一个代理服务器,拦截客户端发出的HTTP请求。当 WireMock 作为代理运行时,它会监听指定的端口,并将接收到的请求发送到实际的目标服务器。WireMock 在中间拦截这些请求,允许你模拟响应。

  2. Stubbing: 在 WireMock 中,模拟服务的期望行为通过 stub(存根)来定义。一个 stub 定义了一个匹配规则和一个对应的响应。当收到符合匹配规则的请求时,WireMock 将返回预定义的响应,而不是将请求转发到实际的目标服务器。

  3. 匹配规则: WireMock 提供了丰富的匹配规则,可以根据请求的URL、HTTP方法、请求体、查询参数等条件进行匹配。这使得可以精确地定义哪些请求应该由 WireMock 进行模拟响应。

  4. DSL(领域特定语言): WireMock 使用了DSL,即一种特定于领域的语言,用于定义 stubs。DSL 提供了清晰而简洁的语法,使得创建和配置 stubs 变得直观和易读。

  5. 内嵌服务器: 除了代理模式,WireMock 还可以作为一个独立的HTTP服务器运行。在这种情况下,它监听指定的端口并直接处理客户端发出的请求,而不需要实际的目标服务器。

  6. 录制和回放: WireMock 具有录制和回放功能,可以用于记录实际服务的请求和响应,然后将其用作模拟服务的期望行为。这有助于创建与实际服务行为一致的 stubs。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/228195.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git(安装,常用命令,分支操作,gitee,IDEA集成git,IDEA集成gitee,IDEA集成github,远程仓库操作)

文章目录 1. Git概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git简史1.5 Git工作机制1.6 Git和代码托管中心 2. Git安装3. Git常用命令3.1 设置用户签名3.1.1 说明3.1.2 语法3.1.3 案例实操 3.2 初始化本地库3.2.1 基本语法3.2.2 案例实操3.2.3 结果查看 3…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

Python中的用户交互函数详解,提升用户体验!

更多Python学习内容&#xff1a;ipengtao.com 用户进行交互的Python应用程序&#xff0c;有许多常用的用户交互函数可以帮助创建更具吸引力和友好的用户界面。本文将介绍一些常用的Python用户交互函数&#xff0c;并提供详细的示例代码&#xff0c;以帮助大家更好地理解它们的用…

kubeadm来搭建k8s集群。

我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群搭建 主机配置建议&#xff1a;2c 4G 主机节点 IP …

学习动态规划解决不同路径、最小路径和、打家劫舍、打家劫舍iii

学习动态规划|不同路径、最小路径和、打家劫舍、打家劫舍iii 62 不同路径 动态规划&#xff0c;dp[i][j]表示从左上角到(i,j)的路径数量dp[i][j] dp[i-1][j] dp[i][j-1] import java.util.Arrays;/*** 路径数量* 动态规划&#xff0c;dp[i][j]表示从左上角到(i,j)的路径数量…

【JavaScript】垃圾回收与内存泄漏

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

【ArcGIS微课1000例】0082:地震灾害图件制作之DEM晕渲图(山体阴影效果)

以甘肃积石山县6.2级地震为例,基于震中100km范围内的DEM数据,制作数字高程模型山体阴影晕渲图。 文章目录 一、效果展示二、实验数据三、晕渲图制作一、效果展示 基于数字高程模型制作的山体阴影晕渲图如下所示: 二、实验数据 本试验所需要的数据包括: 1. 震中位置矢量数…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

Redis(Linux版本7.2.3)

1、停止Redis服务器 [roottssvr1-c1 sysconfig]# ps -ef | grep redis root 322 1 0 10月30 ? 02:58:53 ./bin/redis-server 0.0.0.0:6379 root 32664 12498 0 14:45 pts/0 00:00:00 grep --colorauto redis [roottssvr1-c1 sysconfig]# [roottssvr…

Linux 查看系统类型和版本(内核版本 | 发行版本)

Linux 查看系统类型和版本 首先普及下linux系统的版本内容1. 查看linux系统内核版本2. 查看linux系统发行版本 首先普及下linux系统的版本内容 内核版本和发行版本区别 内核版本就是指 Linux 中最基层的代码&#xff0c;版本号如 Linux version 3.10.0-327.22.2.el7.x86_64发行…

【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果

最终效果 文章目录 最终效果素材第一人称人物移动开门效果显示原理渲染相机跟着我们视角移动门的摄像机跟着我们旋转近裁剪面设置传送配置代码实现传送效果结束完结素材 https://assetstore.unity.com/packages/3d/props/interior/door-free-pack-aferar-148411

骑砍战团MOD开发(30)-游戏大地图map.txt

骑砍1战团mod开发-大地图制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rz4y1c7wH/ 一.骑砍游戏大地图 骑砍RTS视角游戏大地图 大地图静态模型(map.txt) 军团/城镇图标(module_parties.py). 骑砍大地图的战争迷雾和天气通过API进行管理和控制: # Weather-h…

雪花算法(Snowflake)介绍和Java实现

1、雪花算法介绍 (1) 雪花算法(SnowFlake)是分布式微服务下生成全局唯一ID&#xff0c;并且可以做到去中心化的常用算法&#xff0c;最早是Twitter公司在其内部的分布式环境下生成ID的方式。 雪花算法的名字可以这么理解&#xff0c;世界上没有两片完全相同的雪花&#xff0c;…

用ChatGPT挑选钻石!著名珠宝商推出-珠宝GPT

根据Salesforce最新发布的第五版《互联网购物报告》显示&#xff0c;ChatGPT等生成式AI的出现、快速发展&#xff0c;对零售行业和购物者产生了较大影响。可有效简化业务流程实现降本增效&#xff0c;并改善购物体验。 著名珠宝商James Allen为了积极拥抱生成式AI全面提升销售…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

PromQL语法

PromQL&#xff08;Prometheus Query Language&#xff09;是 Prometheus 内置的数据查询语言&#xff0c;它能实现对事件序列数据的查询、聚合、逻辑运算等。它被广泛应用在 Prometheus 的日常应用当中&#xff0c;包括对数据查询、可视化、告警处理当中。简单地说&#xff0c…

dev express 15.2图表绘制性能问题(dotnet绘图表)

dev express 15.2 绘制曲线 前端代码 <dxc:ChartControl Grid.Row"1"><dxc:XYDiagram2D EnableAxisXNavigation"True"><dxc:LineSeries2D x:Name"series" CrosshairLabelPattern"{}{A} : {V:F2}"/></dxc:XYDi…

Windows实现MySQL5.7主从复制(详细版)

使用免安装版本&#xff08;官网下载地址&#xff09; 在Windows上安装两种MySQL服务并同时开启服务 1.下载配置 打开解压文件所在位置&#xff0c;就新建一个配置文件my.ini。 2.主库安装 主库的my.ini配置文件如下&#xff1a; [mysqld] #设置主库端口&#xff0c;注意须是…

Leetcode—1572.矩阵对角线元素的和【简单】

2023每日刷题&#xff08;七十三&#xff09; Leetcode—1572.矩阵对角线元素的和 实现代码 class Solution { public:int diagonalSum(vector<vector<int>>& mat) {int n mat.size();if(n 1) {return mat[0][0];}int sum 0;int i 0, j n - 1;while(i &…

怎么解决 Nginx反向代理加载速度慢?

Nginx反向代理加载速度慢可能由多种原因引起&#xff0c;以下是一些可能的解决方法&#xff1a; 1&#xff0c;网络延迟&#xff1a; 检查目标服务器的网络状况&#xff0c;确保其网络连接正常。如果目标服务器位于不同的地理位置&#xff0c;可能会有较大的网络延迟。考虑使用…