API 測試利器 WireMock

以前寫了一篇介紹 HttpClient 的兩種重試機制, 可是否真的會按照預期進行重試咱們不得而知。java

別人提供給咱們的 API 每每都是正常的,不少錯誤並不能穩定重現,這也形成了咱們沒法進行全面的測試。正是這種狀況下,瞭解到了 WireMock。segmentfault

本文不打算作一個入門教程,重點在於如何用 WireMock 解決實際的問題。測試

初始化調用端

首先初始化一個HttpClientui

public ZwroksApi(){
    RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(1000).build();
    DefaultServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy = new DefaultServiceUnavailableRetryStrategy();
    httpClient = HttpClients.custom()
        .setServiceUnavailableRetryStrategy(serviceUnavailableRetryStrategy)
        .setDefaultRequestConfig(requestConfig)
        .build();
}

進行了以下配置url

  1. 異常重試默認開啓,重試3次。
  2. 使用了默認的服務不可用重試策略,會重試1次,間隔1秒。
  3. 設置 SocketTimeout 爲1秒,用於模擬超時。

異常重試

超時

首先來模擬一下超時,設置了固定的 delay 2秒,因此必定會超時,按照預期會重試3次,因此一共是請求4次。.net

@Test
public void testSocketTimeOut() {
    stubFor(get(urlEqualTo("/test"))
            .willReturn(aResponse()
                        .withStatus(HttpStatus.SC_OK)
                        .withHeader("Content-Type", "text/xml")
                        .withBody("ok")
                        .withFixedDelay(2000)));
    zwroksApi.test();
    verify(4, getRequestedFor(urlEqualTo("/test")));
}

可是結果呢日誌

Expected exactly 4 requests matching the following pattern but received 1

具體的緣由在以前那篇文章也已經提過,SocketTimeoutExceptionInterruptedIOException 的子類,不會重試。code

如何超時也進行重試,在上一篇中也有講,這裏就不贅述了。xml

錯誤返回

WireMock 中提供了幾種錯誤返回,使用也很簡單教程

@Test
public void testBadResponse() {
    stubFor(get(urlEqualTo("/test"))
            .willReturn(aResponse().withFault(Fault.CONNECTION_RESET_BY_PEER)));
    zwroksApi.test();
    verify(4, getRequestedFor(urlEqualTo("/test")));
}

這裏在運行時會拋錯 java.net.SocketException: Connection reset,這種異常是會進行重試的,因此這裏測試能夠經過。

服務不可用重試

調用的代碼以下,我但願在返回503的時候進行重試

@Test
public void testServiceUnavailable() {
    stubFor(get(urlEqualTo("/test"))
            .willReturn(aResponse()
                        .withStatus(HttpStatus.SC_SERVICE_UNAVAILABLE)
                        .withHeader("Content-Type", "text/xml")
                        .withBody("service unavailable")));
    zwroksApi.test();
    verify(2, getRequestedFor(urlEqualTo("/test")));
}

這裏測試也是能夠經過的。WireMock 提供了獲取請求日誌的能力,除了次數,咱們能夠看看是否兩次請求是間隔了一秒。

List<ServeEvent> allServeEvents = getAllServeEvents();
    long firstTime = allServeEvents.get(1).getRequest().getLoggedDate().getTime();
    long lastTime = allServeEvents.get(0).getRequest().getLoggedDate().getTime();
    assert lastTime - firstTime > 1000;

這裏只是介紹了一小部分 WireMock 的功能,更多的功能能夠去官網看文檔,很是好懂。

相關文章
相關標籤/搜索