拓展閱讀
test 之 jmockit-01-overview
jmockit-01-test 之 jmockit 入門使用案例
mockito-01-overview mockito 簡介及入門使用
PowerMock
Mock Server
ChaosBlade-01-測試混沌工程平臺整體介紹
jvm-sandbox 入門簡介
wiremock
WireMock是一個流行的開源工具,用于API模擬測試,每月下載量超過500萬次。它可以幫助您創(chuàng)建穩(wěn)定的測試和開發(fā)環(huán)境,隔離與不穩(wěn)定的第三方服務(wù)的依賴,并模擬尚不存在的API。
WireMock于2011年由Tom Akehurst作為Java庫啟動,現(xiàn)在已經(jīng)涵蓋多種編程語言和技術(shù)棧。
它可以作為庫或客戶端包裝器在許多語言中運行,也可以作為獨立的服務(wù)器運行。項目及其生態(tài)系統(tǒng)背后有一個龐大的社區(qū)。
WireMock支持多種創(chuàng)建模擬API的方法 - 在代碼中、通過其REST API、作為JSON文件以及通過記錄代理到另一個目標的HTTP流量。
WireMock具有豐富的匹配系統(tǒng),允許將傳入請求的任何部分與復(fù)雜和精確的條件進行匹配。
通過基于Handlebars的模板系統(tǒng),可以動態(tài)生成任何復(fù)雜度的響應(yīng)。
最后,由于其眾多的擴展點和全面的API,WireMock易于集成到任何工作流程中。
關(guān)鍵特性
WireMock可以在單元測試中運行,也可以作為獨立進程或容器運行。
其關(guān)鍵特性包括:
- 可通過URL、頭部和正文內(nèi)容模式進行HTTP響應(yīng)存根匹配
- 支持通過流暢的Java API、JSON文件和HTTP傳輸?shù)腏SON進行配置
- 存根的錄制和回放
- 請求驗證
- 故障和響應(yīng)延遲注入
- 按請求的條件代理
- 用于請求檢查和替換的瀏覽器代理
- 具有狀態(tài)的行為模擬
- 可擴展性
WireMock生態(tài)系統(tǒng)
WireMock具有針對其他語言和測試框架的實現(xiàn)和適配器。它支持多種技術(shù)棧的適配器和實現(xiàn),包括Python、.NET、Golang和Rust。
對于JVM生態(tài)系統(tǒng),有適用于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分發(fā),可以通過常見的構(gòu)建工具的依賴管理包含在您的項目中。
要將標準的WireMock JAR添加為項目依賴項,請將以下依賴項放在構(gòu)建文件的dependencies部分中。
在我們的測試中,我們還將使用AssertJ來驗證響應(yīng)。為了發(fā)送請求,我們將使用Java 11+中可用的嵌入式HTTP客戶端。
如果您想添加一個Java 1.8測試,您將需要添加一個外部的HTTP客戶端實現(xiàn),如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規(guī)則
WireMock提供了一些JUnit規(guī)則來管理服務(wù)器的生命周期和設(shè)置/拆卸任務(wù)。
要使用WireMock的流暢API,請?zhí)砑右韵聦?dǎo)入語句:
import static com.github.tomakehurst.wiremock.client.WireMock.*;
為了在每個測試用例中自動啟動和停止WireMock,請將以下內(nèi)容添加到您的測試類(或其超類):
@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 test
stubFor(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 response
final 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>");
}
拓展測試類
為了對由規(guī)則創(chuàng)建的WireMock服務(wù)器的設(shè)置有更多的控制,您可以將通過流式構(gòu)建的Options對象傳遞給規(guī)則的構(gòu)造函數(shù)。
讓我們以更改端口號為例:
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
...
@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));
您可以讓W(xué)ireMock(更準確地說是JVM)選擇隨機的、空閑的HTTP和HTTPS端口。如果您想要并發(fā)運行測試,這是一個很好的選擇。
@Rule
public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());
可以用下面的發(fā)現(xiàn)對應(yīng)的端口信息:
int port = wireMockRule.port();
int httpsPort = wireMockRule.httpsPort();
wiremock 是如何實現(xiàn) http 服務(wù)的模擬的?原理是什么
WireMock實現(xiàn)HTTP服務(wù)的模擬的基本原理是攔截和模擬HTTP請求,并根據(jù)預(yù)定義的規(guī)則返回相應(yīng)的模擬響應(yīng)。
以下是WireMock的基本原理:
-
代理模式: WireMock 可以作為一個代理服務(wù)器,攔截客戶端發(fā)出的HTTP請求。當 WireMock 作為代理運行時,它會監(jiān)聽指定的端口,并將接收到的請求發(fā)送到實際的目標服務(wù)器。WireMock 在中間攔截這些請求,允許你模擬響應(yīng)。
-
Stubbing: 在 WireMock 中,模擬服務(wù)的期望行為通過 stub(存根)來定義。一個 stub 定義了一個匹配規(guī)則和一個對應(yīng)的響應(yīng)。當收到符合匹配規(guī)則的請求時,WireMock 將返回預(yù)定義的響應(yīng),而不是將請求轉(zhuǎn)發(fā)到實際的目標服務(wù)器。
-
匹配規(guī)則: WireMock 提供了豐富的匹配規(guī)則,可以根據(jù)請求的URL、HTTP方法、請求體、查詢參數(shù)等條件進行匹配。這使得可以精確地定義哪些請求應(yīng)該由 WireMock 進行模擬響應(yīng)。
-
DSL(領(lǐng)域特定語言): WireMock 使用了DSL,即一種特定于領(lǐng)域的語言,用于定義 stubs。DSL 提供了清晰而簡潔的語法,使得創(chuàng)建和配置 stubs 變得直觀和易讀。
-
內(nèi)嵌服務(wù)器: 除了代理模式,WireMock 還可以作為一個獨立的HTTP服務(wù)器運行。在這種情況下,它監(jiān)聽指定的端口并直接處理客戶端發(fā)出的請求,而不需要實際的目標服務(wù)器。
-
錄制和回放: WireMock 具有錄制和回放功能,可以用于記錄實際服務(wù)的請求和響應(yīng),然后將其用作模擬服務(wù)的期望行為。這有助于創(chuàng)建與實際服務(wù)行為一致的 stubs。文章來源:http://www.zghlxwxcb.cn/news/detail-811070.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-811070.html
到了這里,關(guān)于test mock-03-wiremock 模擬 HTTP 服務(wù)的開源工具 flexible and open source API mocking的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!