搶佔先機
VMware 提供培訓和認證,助力您加速發展。
瞭解更多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 / 訊息傳遞樁(用於開發客戶端時)執行的操作與實際的服務端實現完全一致
推廣驗收測試驅動開發方法和微服務架構風格
提供一種釋出合同更改的方式,使通訊雙方能立即看到更改
生成服務端使用的樣板測試程式碼
[[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 響應或訊息的樁版本。