Spring Cloud ContractSpring Cloud Contract4.2.1

Spring Cloud Contract 是一個傘形專案,包含幫助使用者成功實施消費者驅動合同 (Consumer Driven Contracts) 方法的解決方案。目前 Spring Cloud Contract 包含 Spring Cloud Contract Verifier 專案。

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

  • 預設情況下,生成用於 WireMock (HTTP 伺服器樁) 的 JSON 樁定義,以便在對客戶端程式碼進行整合測試(客戶端測試)時使用。測試程式碼仍需手動編寫,但測試資料由 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 如何支援其他語言,請檢視 這篇部落格文章

特性

在測試與其它服務通訊的應用時,我們可以選擇以下兩種方法之一:

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

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

這兩種方法各有優缺點。讓我們先關注第一種。部署所有微服務並執行端到端測試

優點

  • 模擬生產環境

  • 測試服務間的真實通訊

缺點

  • 為了測試一個微服務,我們可能需要部署 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 中配置元素的子元素。

實現和測試基礎類就緒後,測試將透過,並且應用程式和樁 artifacts 都將在本地 Maven 倉庫中構建和安裝。您現在可以合併更改,並可以在線上倉庫中釋出應用程式和樁 artifacts。

[[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 的屬性傳遞,如下例所示

    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 社群所有即將到來的活動。

檢視全部