![](/img/trans.png)
[英]Java 8 - Best way to read and store a file received in REST service
[英]Best way to test a REST service in java
在Java中測試REST服務的最佳方法是什么? 開發人員通常采用哪些方法和工具集?
此外,如果您正在編寫調用第三方REST服務的其他客戶端。 測試REST客戶端的最佳方法是什么? 您是否擁有與第三方REST服務通信的JUnit測試。 您可能會遇到服務無法使用的風險/或生產REST服務無法訪問而無需某些憑據。
1.在Java中測試REST服務的最佳方法是什么? 開發人員通常采用哪些方法和工具集?
2.此外,如果您正在編寫調用第三方REST服務的其他客戶端。 測試REST客戶端的最佳方法是什么? 您是否擁有與第三方REST服務通信的JUnit測試。 您可能會遇到服務無法使用的風險/或生產REST服務無法訪問而無需某些憑據。
了解REST如何工作以及HTTP通常是一個很好的起點。
有幾種方法可以測試REST API,具體取決於您的需求:
您可以使用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這樣的工具來直接模擬對象(但是包裝在真正的端點中)。 這應該不易出錯,但需要存在類(作為測試依賴性)。 為了比較,我寫了一個這樣的工具 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.