介紹 Spring Cloud Contract

Spring Cloud Contract 將 TDD 提升到軟體架構層面。它允許您執行消費者驅動和生產者驅動的契約測試。

歷史

在成為 Spring Cloud Contract 之前,該專案名為 Accurest。它由來自 (Codearte) 的 Marcin GrzejszczakJakub Kubrynski 建立。

0.1.0 版本於 2015 年 1 月 26 日釋出,並在 2016 年 2 月 29 日釋出 1.0.0 版本時變得穩定。

為何需要它?

假設我們有一個由多個微服務組成的系統,如下圖所示

Microservices Architecture

測試問題

如果我們想測試上一節圖片左上角的應用程式,以確定它是否能與其他服務通訊,我們可以做以下兩件事中的一件

  • 部署所有微服務並執行端到端測試。

  • 在單元測試和整合測試中模擬其他微服務。

兩者都有其優點,但也有許多缺點。

部署所有微服務並執行端到端測試

優點

  • 模擬生產環境。

  • 測試服務之間的真實通訊。

缺點

  • 為了測試一個微服務,我們必須部署六個微服務、幾個資料庫以及其他項。

  • 測試執行的環境會被鎖定,僅用於一套測試(在此期間,其他人將無法執行測試)。

  • 它們執行時間很長。

  • 反饋來得非常晚。

  • 它們極其難以除錯。

在單元測試和整合測試中模擬其他微服務

優點

  • 它們提供非常快的反饋。

  • 它們沒有基礎設施要求。

缺點

  • 服務實現者建立的 stub 可能與實際情況毫無關係。

  • 即使測試通過了,生產環境仍可能失敗,而您可能會帶著透過的測試上線。

為了解決上述問題,Spring Cloud Contract 應運而生。其主要思想是為您提供非常快速的反饋,而無需搭建整個微服務環境。如果您使用 stub 進行開發,那麼您唯一需要的應用程式是您自己的應用程式直接使用的那些。下圖展示了 stub 與應用程式的關係

Stubbed Services

Spring Cloud Contract 讓您確信所使用的 stub 是由您呼叫的服務建立的。此外,如果您能夠使用它們,這意味著它們已經在生產者端進行了測試。簡而言之,您可以信任這些 stub。

目的

Spring Cloud Contract 的主要目的包括

  • 確保 HTTP 和訊息傳遞 stub(在開發客戶端時使用)與實際的伺服器端實現完全一致。

  • 推廣 ATDD(驗收測試驅動開發)方法和微服務架構風格。

  • 提供一種釋出契約變更的方式,使雙方能夠立即看到變更。

  • 生成可在伺服器端使用的樣板測試程式碼。

預設情況下,Spring Cloud Contract 與 Wiremock 整合,作為 HTTP 伺服器 stub。

Spring Cloud Contract 的目的不是開始在契約中編寫業務功能。假設我們有一個欺詐檢查的業務用例。如果使用者可能因 100 種不同原因而被視為欺詐,我們假設您會建立兩個契約,一個用於正面情況,一個用於負面情況。契約測試用於測試應用程式之間的契約,而不是模擬完整行為。

什麼是契約?

作為服務的消費者,我們需要定義我們到底想要達到什麼目標。我們需要明確我們的期望。這就是我們編寫契約的原因。換句話說,契約是對 API 或訊息通訊應該如何表現的約定。考慮以下示例

假設您想傳送一個包含客戶公司 ID 和希望向我們借款金額的請求。您還希望使用 PUT 方法將其傳送到 /fraudcheck URL。以下列表展示了一個檢查客戶是否應被標記為欺詐的契約,包括 Groovy 和 YAML 格式

預期契約來自可信來源。您絕不應下載或使用來自不可信位置的契約。