Spring Cloud ContractSpring Cloud Contract5.0.0

Spring Cloud Contract是一個傘形專案,旨在為使用者成功實現消費者驅動的契約(Consumer Driven Contracts)方法提供解決方案。目前,Spring Cloud Contract包含Spring Cloud Contract Verifier專案。

Spring Cloud Contract Verifier是一個工具,可用於JVM應用程式的消費者驅動契約(CDC)開發。它附帶了用Groovy或YAML編寫的契約定義語言(DSL)。契約定義用於生成以下資源

  • 預設情況下,生成JSON存根定義,供WireMock(HTTP伺服器存根)在客戶端程式碼進行整合測試(客戶端測試)時使用。測試程式碼仍需手動編寫,測試資料由Spring Cloud Contract Verifier生成。

  • 如果您正在使用訊息路由,則會生成相應的路由。我們正在與Spring Integration、Spring Cloud Stream和Apache Camel整合。但是,如果您願意,也可以設定自己的整合。

  • 驗收測試(預設為JUnit或Spock),用於驗證API的服務端實現是否符合契約(服務端測試)。完整的測試由Spring Cloud Contract Verifier生成。

Spring Cloud Contract Verifier將TDD提升到軟體架構層面。

要了解Spring Cloud Contract如何支援其他語言,請檢視https://springframework.tw/blog/2018/02/13/spring-cloud-contract-in-a-polyglot-world[這篇部落格文章]。

特性

當嘗試測試與其它服務通訊的應用程式時,我們可以做以下兩件事之一

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

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

兩者都有其優點,但也有很多缺點。讓我們重點關注後者。部署所有微服務並執行端到端測試

優點

  • 模擬生產環境

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

缺點

  • 要測試一個微服務,我們需要部署6個微服務、幾個資料庫等。

  • 進行測試的環境將被單個測試套件鎖定(即,在此期間沒有人能夠執行測試)。

  • 執行時間長

  • 反饋非常滯後

  • 除錯極其困難

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

優點

  • 反饋非常迅速

  • 沒有基礎設施要求

缺點

  • 服務的實現者建立存根,因此它們可能與實際情況無關

  • 您可能通過了測試,但生產環境卻失敗了

為了解決上述問題,Spring Cloud Contract Verifier與Stub Runner應運而生。它們的核心思想是為您提供快速反饋,而無需搭建整個微服務世界。

Spring Cloud Contract Verifier的特點

  • 確保HTTP/訊息存根(在開發客戶端時使用)與實際的服務端實現行為完全一致

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

  • 提供一種釋出契約變更的方式,使其在通訊雙方立即可見

  • 在伺服器端生成樣板測試程式碼

Spring Boot 配置

[[on-the-producer-side]] = 在生產者側

要開始使用 Spring Cloud Contract,您可以將以 Groovy DSL 或 YAML 表示的 REST 或訊息契約檔案新增到 contracts 目錄中,該目錄由 contractsDslDir 屬性設定。預設情況下,它是 $rootDir/src/test/resources/contracts。

然後您可以將Spring Cloud Contract Verifier依賴和外掛新增到您的構建檔案中,示例如下

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-contract-verifier</artifactId>
    <scope>test</scope>
</dependency>

以下清單展示瞭如何新增外掛,它應該放在檔案中的 build/plugins 部分

<plugin>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-contract-maven-plugin</artifactId>
    <version>${spring-cloud-contract.version}</version>
    <extensions>true</extensions>
</plugin>

執行./mvnw clean install會自動生成測試,以驗證應用程式是否符合新增的契約。預設情況下,測試將在org.springframework.cloud.contract.verifier.tests下生成。

由於合同描述的功能尚未實現,測試會失敗。

要使它們透過,您必須新增處理HTTP請求或訊息的正確實現。此外,您必須為自動生成的測試向專案新增一個基本測試類。所有自動生成的測試都將擴充套件此基本類,並且它應該包含執行它們所需的所有設定資訊(例如RestAssuredMockMvc控制器設定或訊息測試設定)。

下面的示例來自pom.xml,展示瞭如何指定基本測試類

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-contract-maven-plugin</artifactId>
            <version>${spring-cloud-contract.version}</version>
            <extensions>true</extensions>
            <configuration>
                <baseClassForTests>com.example.contractTest.BaseTestClass</baseClassForTests> 
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

資訊:baseClassForTests 元素允許您指定您的基本測試類。它必須是spring-cloud-contract-maven-plugin中configuration元素的一個子元素。

一旦實現和測試基類到位,測試將透過,並且應用程式和存根artifact都將被構建並安裝到本地Maven倉庫中。您現在可以合併更改,並且可以將應用程式和存根artifact釋出到線上倉庫中。

[[on-the-consumer-side]] = 在消費者側

您可以在整合測試中使用 Spring Cloud Contract Stub Runner 來獲取一個正在執行的 WireMock 例項或訊息路由,以模擬實際服務。

為此,請新增對 Spring Cloud Contract Stub Runner 的依賴,示例如下

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
    <scope>test</scope>
</dependency>

您可以透過以下兩種方式將生產者端的存根安裝到您的 Maven 倉庫中

透過檢出生產者端倉庫,新增契約並執行以下命令生成存根

$ cd local-http-server-repo
$ ./mvnw clean install -DskipTests

這些測試被跳過,因為生產者端的契約實現尚未到位,因此自動生成的契約測試會失敗。

透過從遠端倉庫獲取已有的生產者服務存根。為此,請將存根artifact ID和artifact倉庫URL作為Spring Cloud Contract Stub Runner屬性傳遞,示例如下

    spring.cloud.contract.stubrunner:
      ids: 'com.example:http-server-dsl:+:stubs:8080'
      repositoryRoot: https://repo.spring.io/libs-snapshot

現在你可以用@AutoConfigureStubRunner註解你的測試類。在註解中,提供group-id和artifact-id值,讓Spring Cloud Contract Stub Runner為你執行協作方的存根,示例如下

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"},
        stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {

從線上倉庫下載存根時使用REMOTE存根模式,離線工作時使用LOCAL模式。

現在,在您的整合測試中,您可以接收由協作服務預期發出的HTTP響應或訊息的存根版本。

Spring Initializr

快速啟動您的專案

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有