Spring Cloud ContractSpring クラウド契約 4.2.0

Spring Cloud Contract は、ユーザーがコンシューマードリブン契約アプローチをうまく実装するのに役立つソリューションを保持する包括的なプロジェクトです。現在、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 と統合しています。ただし、必要に応じて独自の統合を設定できます。

  • API のサーバー側の実装が契約に準拠しているかどうかを検証するために使用される受け入れテスト(JUnit または Spock のデフォルト)。Spring Cloud Contract Verifier によって完全なテストが生成されます。

Spring Cloud Contract Verifier は、TDD をソフトウェアアーキテクチャのレベルに移行します。

Spring Cloud Contract が他の言語をどのようにサポートしているかを確認するには、https://spring.io/blog/2018/02/13/spring-cloud-contract-in-a-polyglot-world[this (英語) のブログ投稿を参照してください。

機能

他のサービスと通信するアプリケーションをテストする場合、次の 2 つのいずれかを実行できます。

  • すべてのマイクロサービスをデプロイし、エンドツーエンドのテストを実行します

  • ユニット / 統合テストで他のマイクロサービスをモックする

どちらにも長所がありますが、多くの短所もあります。後者に注目しましょう。すべてのマイクロサービスをデプロイし、エンドツーエンドのテストを実行します

利点:

  • 本番をシミュレートします

  • サービス間の実際の通信をテストします

短所:

  • 1 つのマイクロサービスをテストするには、6 つのマイクロサービス、いくつかのデータベースなどをデプロイする必要があります。

  • テストが実施される環境は、テストの単一のスイートに対してロックされます(つまり、その間に他の誰もテストを実行できません)。

  • 走り続ける

  • 非常に遅いフィードバック

  • デバッグが非常に難しい

ユニット / 統合テストで他のマイクロサービスをモックする

利点:

  • 非常に速いフィードバック

  • インフラストラクチャ要件なし

短所:

  • サービスの実装者がスタブを作成するため、現実とは無関係かもしれません

  • テストが成功し、本番で失敗しても、本番に行くことが可能

前述の課題を解決するために、スタブランナーを備えた Spring Cloud Contract Verifier が作成されました。彼らの主なアイデアは、マイクロサービスの全世界を設定する必要なく、非常に高速なフィードバックを提供することです。

Spring Cloud Contract Verifier の機能:

  • HTTP/ メッセージングスタブ(クライアントの開発時に使用)が実際のサーバー側の実装とまったく同じことを実行していることを確認します

  • 受け入れテスト主導の開発方法とマイクロサービスのアーキテクチャスタイルを促進する

  • 通信の両側ですぐに見える契約の変更を公開する方法を提供する

  • サーバー側で使用されるボイラープレートテストコードを生成する

Spring Boot 構成

[[on-the-producer-side]] = プロデューサー側

Spring Cloud Contract の使用を開始するには、Groovy DSL または YAML で表現された REST またはメッセージング契約を含むファイルを、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>

INFO: baseClassForTests 要素を使用すると、基本テストクラスを指定できます。これは、spring-cloud-contract-maven-plugin 内の構成要素の子である必要があります。

実装とテストの基本クラスが配置されると、テストに合格し、アプリケーションとスタブアーティファクトの両方がビルドされ、ローカル Maven リポジトリにインストールされます。これで変更をマージでき、アプリケーションとスタブアーティファクトの両方をオンラインリポジトリに公開できます。

[[on-the-consumer-side]] = コンシューマー側

統合テストで Spring Cloud Contract スタブランナーを使用して、実際のサービスをシミュレートする実行中の WireMock インスタンスまたはメッセージングルートを取得できます。

これを行うには、次の例に示すように、Spring Cloud Contract スタブランナーに依存関係を追加します。

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

Maven リポジトリにインストールされているプロデューサー側のスタブは、次の 2 つの方法のいずれかで取得できます。

Producer 側のリポジトリをチェックアウトし、次のコマンドを実行して契約を追加し、スタブを生成します。

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

プロデューサー側の契約実装がまだ整っていないため、テストがスキップされているため、自動生成された契約テストは失敗します。

リモートリポジトリから既存のプロデューサーサービススタブを取得します。そのためには、次の例に示すように、スタブアーティファクト ID とアーティファクトリポジトリ URL を Spring Cloud Contract スタブランナープロパティとして渡します。

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

これで、テストクラスに @AutoConfigureStubRunner でアノテーションを付けることができます。次の例に示すように、アノテーションで、Spring Cloud Contract スタブランナーのグループ ID とアーティファクト ID の値を指定して、コラボレーターのスタブを実行します。

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

オンラインリポジトリからスタブをダウンロードする場合は REMOTE stubsMode を使用し、オフライン作業の場合は LOCAL を使用します。

これで、統合テストで、コラボレーターサービスによって送信されると予想されるスタブバージョンの HTTP レスポンスまたはメッセージを受信できるようになりました。

Spring Initializr

プロジェクトのクイックスタート

サポートの取得

Tanzu Spring は、1 つのシンプルなサブスクリプションで OpenJDK ™、Spring、Apache Tomcat ® のサポートとバイナリを提供します。

さらに学習したい方に (英語)

今後のイベント

Spring コミュニティで今後開催されるすべてのイベントをチェックしてください。

すべて表示 (英語)