簡體   English   中英

在java中測試REST服務的最佳方法

[英]Best way to test a REST service in java

  1. 在Java中測試REST服務的最佳方法是什么? 開發人員通常采用哪些方法和工具集?

  2. 此外,如果您正在編寫調用第三方REST服務的其他客戶端。 測試REST客戶端的最佳方法是什么? 您是否擁有與第三方REST服務通信的JUnit測試。 您可能會遇到服務無法使用的風險/或生產REST服務無法訪問而無需某些憑據。

1.在Java中測試REST服務的最佳方法是什么? 開發人員通常采用哪些方法和工具集?

  • 您可以通過首先測試服務本身的實際代碼和功能來測試您的休息服務,並使用適用於您的項目的任何單元測試庫確保它正常運行。 接下來,您將發布REST服務並嘗試使用某種類型的http客戶端訪問RESTful方法。
    通常,最簡單的方法只是一個普通的舊瀏覽器。 如果是基於GET或PUT的請求,請輸入網址和信息。 如果是帖子,您可以使用瀏覽器插件或開發工具來幫助根據需要將數據添加到請求或標頭的正文中,並驗證您是否獲得了預期的響應。 如果它在瀏覽器中工作,它應該與您選擇的任何支持HTTP的客戶端執行類似的操作。

2.此外,如果您正在編寫調用第三方REST服務的其他客戶端。 測試REST客戶端的最佳方法是什么? 您是否擁有與第三方REST服務通信的JUnit測試。 您可能會遇到服務無法使用的風險/或生產REST服務無法訪問而無需某些憑據。

  • 您通常可以根據您使用的語言使用任何類型的Http Client庫。 通過測試REST客戶端來注意的主要缺陷是確保捕獲REST服務返回的響應並檢查狀態。 如果它是好的,你將獲得200,服務器錯誤500等。等。
    我建議您查看W3C或Wikipedia狀態代碼信息https://en.wikipedia.org/wiki/List_of_HTTP_status_codeshttps://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    此外,您應該了解可以從特定服務返回的響應類型。 這應該在服務的api文檔中提供。 api還應解釋需要通過標頭或作為REST調用的參數傳遞的任何類型的憑證或要求。

了解REST如何工作以及HTTP通常是一個很好的起點。

有幾種方法可以測試REST API,具體取決於您的需求:

  • Jersey Test - 您可以使用內存中的HTTP服務器執行和測試REST API調用。 您需要模擬您的代碼 - 使用MockitoJersey 1.19測試配置 - 模擬類 )或內存測試數據庫。
  • Rest Assured - 主要缺點是您需要單獨/單獨地從測試運行REST API項目( RestAssured測試而不運行Tomcat
  • 帶UI的工具 - SOAP UI郵遞員
  • Swagger - 生成交互式文檔 - 您可以根據代碼中的注釋方法使用准備好的數據執行REST方法的Web頁面。
  • 使用Spring Boot開發REST服務。 它有各種測試工具,您可以在沒有過多配置的情況下開箱即用。

您可以使用SoapUI創建REST服務模擬。 此外,如果您需要通過maven運行此測試,您可以使用soapui-maven-plugin自動執行soapui服務

我建議您查看REST Assured以自動測試REST服務。 以下示例從其網頁復制:

例如,如果您的HTTP服務器在“ http:// localhost:8080 / lotto / {id}”處返回以下JSON:

{
   "lotto":{
      "lottoId":5,
      "winning-numbers":[2,45,34,23,7,5,3],
      "winners":[
         {
            "winnerId":23,
            "numbers":[2,45,34,23,3,5]
         },
         {
            "winnerId":54,
            "numbers":[52,3,12,11,18,22]
         }
      ]
   }
}

您可以輕松使用REST Assured從響應中驗證有趣的事物:

@Test public void
lotto_resource_returns_200_with_expected_id_and_winners() {

    when().
            get("/lotto/{id}", 5).
    then().
            statusCode(200).
            body("lotto.lottoId", equalTo(5), 
                 "lotto.winners.winnerId", containsOnly(23, 54));

}

有關詳細信息,請參閱入門使用指南。


如果您使用Spring Boot實現了服務器應用程序,那么您可能還會發現幾年前我寫的有關集成測試Spring Boot應用程序的博客文章。 它顯示了Spring Boot測試支持如何啟動嵌入式Web服務器並在針對REST API執行基於REST Assured的測試之前將應用程序部署到該服務器。 換句話說,您既不必手動啟動Web服務器,也不需要在測試之間重新部署應用程序。 事實上,您甚至不必在代碼更改之間創建.war或.jar文件,以驗證REST API更改。

對於問題的第2部分,正確的答案取決於各種因素。 您可能需要考慮模擬的分辨率以及編寫和維護測試所花費的時間。

客戶端庫

HTTP客戶端的選擇會影響您的選擇 - 一些klients(如Spring RestTemplate)提供內置的模擬支持。 如果您有像swagger或RAML文件這樣的服務定義,那么您需要生成客戶端。

項目配置

最徹底的方法是實際讓應用程序對真實端點進行HTTP調用,涉及完整堆棧。 如果是這樣,請配置項目,以便以每個環境(或配置文件)方式注入客戶端URL。

模擬端點

你想要每單元測試模擬。 沒有'可部署的模擬'可以進行多個單元測試。 服務在localhost端口上進行模擬 - 最好是隨機選擇,以便可以進行並行測試(即在jenkins上)。

模擬數據

為了節省時間,對於深度數據結構,非常希望從文件中讀取模擬數據,而不是以編程方式構造。 文件更容易使用,特別是如果您啟用請求/響應日志記錄,修復錯誤等等更快。

懲戒

一些框架與服務松散耦合,因為它們嚴格不了解服務的性質。 通常,您會在單元測試中編碼的某個路徑上模擬響應。 這就像Wiremock和我見過的大多數測試框架。

雖然其他工具直接在類服務定義上工作,但基本上你可以使用像Mockito這樣的工具來直接模擬對象(但是包裝在真正的端點中)。 這應該不易出錯,但需要存在類(作為測試依賴性)。 為了比較,我寫了一個這樣的工具

Karate是一個從頭開始設計用於測試Web服務API的框架。 它在Stack Overflow上有自己的標記

有一個與保證的REST了詳細的對比在這里 它也被列為五大開源API測試工具之一,僅在發布后的6個月內。

免責聲明:我恰好是空手道的作者。

Karate是一個從頭開始設計用於測試Web服務API的框架。 它在Stack Overflow上有自己的標記

有一個與保證的REST了詳細的對比在這里 它也被列為五大開源API測試工具之一,僅在發布后的6個月內。

免責聲明:我恰好是空手道的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM