3 秒ツアー

この非常に短いツアーでは、Spring Cloud Contract を使用して説明します。これは次のトピックで構成されます。

ここでもう少し長いツアーを見つけることができます。

次の UML 図は、Spring Cloud Contract 内の各部分の関連を示しています。

getting-started-three-second

プロデューサー側

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>2.1.2.RELEASE</version>
                <extensions>true</extensions>
                <configuration>
                    <baseClassForTests>com.example.contractTest.BaseTestClass</baseClassForTests> (1)
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
1baseClassForTests 要素を使用すると、基本テストクラスを指定できます。これは、spring-cloud-contract-maven-plugin 内の configuration 要素の子である必要があります。

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

コンシューマー側

統合テストで 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 リポジトリにインストールされているプロデューサー側のスタブは、次の 2 つの方法のいずれかで取得できます。

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

    $ cd local-http-server-repo
    $ ./mvnw clean install -DskipTests
プロデューサー側の契約実装がまだ整っていないため、テストがスキップされているため、自動生成された契約テストは失敗します。
  • リモートリポジトリから既存のプロデューサーサービススタブを取得することによって。これを行うには、次の例に示すように、スタブアーティファクト ID とアーティファクトリポジトリ URL を Spring Cloud Contract Stub Runner プロパティとして渡します。

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

これで、テストクラスに @AutoConfigureStubRunner のアノテーションを付けることができます。次の例に示すように、アノテーションで Spring Cloud Contract Stub Runner の group-id 値と artifact-id 値を指定して、コラボレーターのスタブを実行します。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"},
		stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {
	. . .
}
オンラインリポジトリからスタブをダウンロードする場合は REMOTEstubsMode を使用し、オフライン作業には LOCAL を使用します。

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