この記事は リクルートライフスタイル Advent Calendar 2016 の14日目の記事です。
はじめに
みなさんmicroserviceを進めていますか?
リクルートライフスタイルでも徐々にmicroserviceの流れが押し寄せつつあります。
今回はそんなmicroserviceに役立つConsumer-Driven Contract testingというテスト方法について書こうと思います。
本当はライブラリを使って実演までしたかったのですが…この記事の量が多くなってしまい、趣旨がずれてしまうので別の機会に書こうと思います。
microserviceのテストの問題点
microserviceのテストの問題点についてこれから説明していきます。
まずは複数のmicroserviceでできた以下のようなサービスがあるとします。
さて、ここでv1というmicroserviceに対してテストをしよう、と考えた場合、どうしますか?
以下のような方法が思いつくと思います。
- 全てのmicroserviceをデプロイしてEtoEテストをする
- 他のサービスをスタブ化して単体テストをする
全てのmicroserviceをデプロイしてEtoEテストをする
メリット
- 本番同等をテストすることができる
- 本物のmicroservice間の連携をテストすることができる
デメリット
- 1つのmicroserviceをテストしたいだけなので、他の全てのmicroserviceとそれに紐づくDBをデプロイする必要がある
- 1つのmicroserviceをテストしている間は、他のmicroserviceをテストすることができない
- テスト時間がかかる
- フィードバックが非常に遅い
- デバッグが大変(他のmicroserviceが原因かもしれない。。。)
他のサービスをスタブ化して単体テストをする
メリット
- フィードバックが非常に早い
- インフラ(インスタンス、デプロイなど)の必要がない
デメリット
- 単体テストを正常に終了しても、本番環境(もしくは検証用の環境)にデプロイしたら落ちる可能性がある
- 呼び出し先のmicroserviceに変更があった場合に、変更による影響を単体テストでは検知できない
このようにどちらの方法であったとしても、デメリットが大きく、
実現性がない、もしくはテストが効果的でないという状態になってしまうかと思います。
これらの問題への対策がConsumer-Driven Contract testingになります。
Consumer-Driven Contract testingとは
Consumer-Driven Contract(以後はCDC)は以下のようにConsumerとProdiverの間で結ぶ契約(Contract)になります。
CosumerがContractを定義し、ProviderはContractを守るようにしなければなりません。
ここでConsumerはサービスを受ける側、Providerはサービスを提供する側になります。
Consumer=client,Provider=serverといいかえることもできると思います。
CDC testingは上記の考えにもとづいたテスト方法で、
-
Conumerは期待するリクエスト/レスポンスをContractとして定義、ConsumerはContractを前提にモック化してテストを実施
-
ProviderはConsumerとContractを合意
-
ProviderはContractが守られていることを示すテストを実施
このようにContractを元にテスト実施することで、Consumer,Providerの連携を含めたテストが可能となり、microservice間のテストをフィードバック早く実施できるようになります。
ライブラリ
代表的なライブラリにPact,Spring Cloud Contractなどがあります。
補足
CDC testingは、技術トレンドを評価するThoughtWorksの2016年版でAdopt(企業での使用が推奨されることを意味する)とされているぐらい、標準的になりつつあるテスト方法です。
ぜひ使っていってください。
https://www.thoughtworks.com/radar/techniques/consumer-driven-contract-testing
参考
http://martinfowler.com/articles/consumerDrivenContracts.html
https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html
http://www.slideshare.net/makingx/consumer-driven-contracts-rest-api-m3tech