Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
#ccc_g11
Copyright 2017 Hiroyuki Onaka
この作品は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。
pact-jvmではじめる
コンシューマー駆動契約
2017/4/24 ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
最近よく聞く話
• ユニットテスト
• 「このコンポーネントのテストモックだらけでわ
かりづらいんですけど…」
• エンドツーエンドのテスト
• 「テストケースが増え...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
今日は、そんな自動テストに悩むみなさんへの
処方箋として、「コンシューマー駆動契約」に
ついてお話しします。
#ccc_g11
Copyright 2017 Hiroyuki Onaka
問題点の整理
#ccc_g11
Copyright 2017 Hiroyuki Onaka
モックか直接呼び出すか、それが問題
#ccc_g11
Copyright 2017 Hiroyuki Onaka
今までなら、モックを使うかどうかの判断は簡単
だった
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「マイクロサービスアーキテクチャー」
By Paul Downey (CC-BY 2.0)
https://www.flickr.com/photos/psd/131...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
複雑になるサービスの依存関係
BY Rose and Trev Clough(CC-BY SA 2.0) http://www.geograph.org.uk/pho...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「なんかモックだらけになるんですけど…」
By Matthew Black from London, UK (325000 Uploaded by oxyman)
[...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
よろしい、ならばエンドツーエンドだ
#ccc_g11
Copyright 2017 Hiroyuki Onaka
エンドツーエンドテストつらい…
• データのセットアップつらい…
• 実行時間つらい…
• コード何もいじってないのにテスト落ちた、
つらい…
• 昔あった「結合一発...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• 各種パブリッククラウド上でのサービス構築
に代表されるように、テストを書くときに依
存するサービス/ミドルウェアが増えた。
• マイクロサービスアーキテクチャーが...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
それにもかかわらず、テストをはじめとして開
発の方法論がいわゆる三層アーキテクチャーに
最適化されすぎているが故の問題。
#ccc_g11
Copyright 2017 Hiroyuki Onaka
ではどうするか
#ccc_g11
Copyright 2017 Hiroyuki Onaka
v
Sam Newman(著) 佐藤直生(監訳)
「マイクロサービスアーキテクチャ」
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「ストーリーではなくジャーニーをテストする」
「これに対抗する最善の方法は、少数の中核となるジャー
ニーに焦点を絞ってシステム全体をテストする方法です。こ
の中核とな...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「ストーリーではなくジャーニーをテストする」
どうやって…?
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「テスト自動化ピラミッド」
Mike Cohn 「Suceeding with agile」
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「テスト自動化ピラミッド」
• テスト自動化のレイヤーを「UI」
「Service」「Unit」の3つに分類したもの。
• 「Service」に対するテストが、アプリ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
マイクロサービスアーキテクチャーにおけるサー
ビステスト
• 外部に対するサービス呼び出しをモック化した
上で、個々のサービスの機能に対して、ユー
ザーインターフェー...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• それでは、サービステストを実現する手段と
してのコンシューマー駆動契約とその実装で
あるpact-jvmについて見てみましょう。
#ccc_g11
Copyright 2017 Hiroyuki Onaka
コンシュー
マー駆動契約
とPact
#ccc_g11
Copyright 2017 Hiroyuki Onaka
コンシューマー駆動契約
• クライアント(コンシューマー)がサービス(プ
ロバイダー)に対してどのような振る舞いを
期待するかを記述したファイル(エクスペク
テーショ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• サービスは、クライアントからエクスペク
テーションを受け取り、自らがエクスペク
テーションの通り振る舞うかを、サービスの
ビルドの中で検証する。
• エクスペクテ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
Pact
• オーストラリアのオンライン不動産サービス
RealEstate.com.auで開発された、コン
シューマー駆動契約を使用したテストツール
がオープンソー...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• 当初はRubyで開発されていたが、その後他
の言語へも移植。
• エクスペクテーションがJSONで記述されて
いて、特定の言語からは独立したフォーマッ
トになって...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
pact-jvm
• PactのJVM言語向け移植版
• https://github.com/DiUS/pact-jvm
#ccc_g11
Copyright 2017 Hiroyuki Onaka
サンプルの解
説
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• 動物園で飼育されている動物のモデルを返す
サービス
• そのサービスを使用して動物園の情報を扱うク
ライアント
• サンプルコードは以下にあります
https:/...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
Animal Service
Consumer
(Zoo App)
Provider
(Animal Service)
Animal Service
Client
#ccc_g11
Copyright 2017 Hiroyuki Onaka
GET /animals/serval
{
"animals":
[
{"id": 1, "name": "サーバルちゃん"}
]
}
#ccc_g11
Copyright 2017 Hiroyuki Onaka
プロバイダーとしてのAnimal Service
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
エクスぺくてーションの出力
クライアントでテストを実行すると、
target¥pacts¥test_consumer-
test_provider.json に、JS...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
サービス側のテスト
エクスペクテーション(先ほどのJSON)をコン
シュマー(クライアント)から受け取って、プロ
バイダー(サービス)のビルドで、サービスの振
る舞い...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
#ccc_g11
Copyright 2017 Hiroyuki Onaka
エクスペクテーションとの
マッピング
アプリケーションの起動
テスト対象のポートの指定
#ccc_g11
Copyright 2017 Hiroyuki Onaka
実行結果
#ccc_g11
Copyright 2017 Hiroyuki Onaka
コンシュー
マー駆動契約
のポイント
#ccc_g11
Copyright 2017 Hiroyuki Onaka
コンシューマー駆動契約のポイント
• 検証の厳密さ
• Provider Stateの扱い
• エクスペクテーションの引き渡し
#ccc_g11
Copyright 2017 Hiroyuki Onaka
検証の厳密さ
例えば、エクスペクテーションとしてレスポン
スがapplication/jsonというContent-Typeを返
すことを期待した場合。
サービス(プ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
Provider Stateの扱い
エクスペクテーションの検証時には、プロバーダー
(サービス)のバックエンドのデータベースや、対向
先のサービスのモックをセットアッ...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
上記二つの理由により、クライアントとサービ
スの間のやりとりを全て検証するのではなく、
サービスのクライアントの契約として必要な部
分に検証を絞る必要があります。
#ccc_g11
Copyright 2017 Hiroyuki Onaka
エクスペクテーションをサービス側で検証する
には、クライアントが作成したエクスペクテー
ションをサービス側に引き渡す必要があります。
• CIサーバーの成果物(Art...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
まとめ
#ccc_g11
Copyright 2017 Hiroyuki Onaka
コンシューマー駆動契約の使いどころ
• 正直、悩ましい
• サービス側をリファクタリングした時に、クラ
イアント側でのテストなしでクライアントと
サービス側のインター...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
• 「テスト自動化ピラミッド」の考え方はコン
シューマー駆動契約を導入しなくても有効
• アプリケーションのレイヤーそれぞれにどの
ようなテストを書き、テストの網をは...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
まとめ
ユニットテストとエンドツーエンドテスト双方
を補完し、クライアントとサービス相互のイン
ターフェース仕様の検証に絞った使い方が出来
るかが、コンシューマー駆動...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
情報源
• Pactのドキュメント
• https://docs.pact.io/
• 実践 Pact:マイクロサービス時代のテストツール
• http://tech...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
「Testing Java Microservices」
• 2017年夏出版予定
• http://www.manning.com/books/testing-
j...
#ccc_g11
Copyright 2017 Hiroyuki Onaka
ありがとうございました!
• 大中浩行(Onaka,Hiroyuki)
• @setoazusa
• グロースエクスパートナーズ株式会社
アーキテクチャソリューション...
Upcoming SlideShare
Loading in …5
×

pact-jvmではじめるコンシューマー駆動契約

7,984 views

Published on

2017/4/24 JJUG ナイト・セミナー「テスティング特集」

Published in: Software
  • Be the first to comment

pact-jvmではじめるコンシューマー駆動契約

  1. 1. #ccc_g11 Copyright 2017 Hiroyuki Onaka この作品は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。 pact-jvmではじめる コンシューマー駆動契約 2017/4/24 JJUG ナイト・セミナー「テスティング特集」 大中浩行(@setoazusa)
  2. 2. #ccc_g11 Copyright 2017 Hiroyuki Onaka 最近よく聞く話 • ユニットテスト • 「このコンポーネントのテストモックだらけでわ かりづらいんですけど…」 • エンドツーエンドのテスト • 「テストケースが増えてきてメンテナンスがつら いです…」
  3. 3. #ccc_g11 Copyright 2017 Hiroyuki Onaka 今日は、そんな自動テストに悩むみなさんへの 処方箋として、「コンシューマー駆動契約」に ついてお話しします。
  4. 4. #ccc_g11 Copyright 2017 Hiroyuki Onaka 問題点の整理
  5. 5. #ccc_g11 Copyright 2017 Hiroyuki Onaka モックか直接呼び出すか、それが問題
  6. 6. #ccc_g11 Copyright 2017 Hiroyuki Onaka 今までなら、モックを使うかどうかの判断は簡単 だった
  7. 7. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「マイクロサービスアーキテクチャー」 By Paul Downey (CC-BY 2.0) https://www.flickr.com/photos/psd/13109673843
  8. 8. #ccc_g11 Copyright 2017 Hiroyuki Onaka 複雑になるサービスの依存関係 BY Rose and Trev Clough(CC-BY SA 2.0) http://www.geograph.org.uk/photo/1490900
  9. 9. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「なんかモックだらけになるんですけど…」 By Matthew Black from London, UK (325000 Uploaded by oxyman) [CC BY-SA 2.0 (http://creativecommons.org/licenses/by-sa/2.0)], via Wikimedia Commons https://commons.wikimedia.org/wiki/File%3AMock_up_of_a_British_Rail_Class_325_cab_at_the_National_Railway_Museum.jpg
  10. 10. #ccc_g11 Copyright 2017 Hiroyuki Onaka よろしい、ならばエンドツーエンドだ
  11. 11. #ccc_g11 Copyright 2017 Hiroyuki Onaka エンドツーエンドテストつらい… • データのセットアップつらい… • 実行時間つらい… • コード何もいじってないのにテスト落ちた、 つらい… • 昔あった「結合一発勝負」とどう違うんや
  12. 12. #ccc_g11 Copyright 2017 Hiroyuki Onaka • 各種パブリッククラウド上でのサービス構築 に代表されるように、テストを書くときに依 存するサービス/ミドルウェアが増えた。 • マイクロサービスアーキテクチャーがその流 れを加速している。
  13. 13. #ccc_g11 Copyright 2017 Hiroyuki Onaka それにもかかわらず、テストをはじめとして開 発の方法論がいわゆる三層アーキテクチャーに 最適化されすぎているが故の問題。
  14. 14. #ccc_g11 Copyright 2017 Hiroyuki Onaka ではどうするか
  15. 15. #ccc_g11 Copyright 2017 Hiroyuki Onaka v Sam Newman(著) 佐藤直生(監訳) 「マイクロサービスアーキテクチャ」
  16. 16. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「ストーリーではなくジャーニーをテストする」 「これに対抗する最善の方法は、少数の中核となるジャー ニーに焦点を絞ってシステム全体をテストする方法です。こ の中核となるジャーニーで対象になっていない機能は、互い に分離してサービスを分析するテストで対処する必要があり ます。このジャーニーは相互に合意され、共同で所有される 必要があります。音楽専門店の例では、CD の注文、商品の 返品、新規顧客の作成といった(高価値な対話であり極めて 少数の)動作に焦点を絞るでしょう。」 Sam Newman(著) 佐藤直生(監訳) 「マイクロサービスアーキテクチャ」
  17. 17. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「ストーリーではなくジャーニーをテストする」 どうやって…?
  18. 18. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  19. 19. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「テスト自動化ピラミッド」 Mike Cohn 「Suceeding with agile」
  20. 20. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「テスト自動化ピラミッド」 • テスト自動化のレイヤーを「UI」 「Service」「Unit」の3つに分類したもの。 • 「Service」に対するテストが、アプリケー ションのインターフェスに対するテストを、 UI(ユーザーインターフェース)を迂回して実 行することが特徴。
  21. 21. #ccc_g11 Copyright 2017 Hiroyuki Onaka マイクロサービスアーキテクチャーにおけるサー ビステスト • 外部に対するサービス呼び出しをモック化した 上で、個々のサービスの機能に対して、ユー ザーインターフェースを迂回して実行する。 • ユニットテストよりも広い範囲をカバーするテ ストを、エンドツーエンドのテストよりも安定 かつ高速に実行できる。
  22. 22. #ccc_g11 Copyright 2017 Hiroyuki Onaka • それでは、サービステストを実現する手段と してのコンシューマー駆動契約とその実装で あるpact-jvmについて見てみましょう。
  23. 23. #ccc_g11 Copyright 2017 Hiroyuki Onaka コンシュー マー駆動契約 とPact
  24. 24. #ccc_g11 Copyright 2017 Hiroyuki Onaka コンシューマー駆動契約 • クライアント(コンシューマー)がサービス(プ ロバイダー)に対してどのような振る舞いを 期待するかを記述したファイル(エクスペク テーション)を作成する。 • エクスペクテーションは、クライアントのビ ルド上で作成される。
  25. 25. #ccc_g11 Copyright 2017 Hiroyuki Onaka • サービスは、クライアントからエクスペク テーションを受け取り、自らがエクスペク テーションの通り振る舞うかを、サービスの ビルドの中で検証する。 • エクスペクテーションを作成する過程と検証 する過程が、分割されていることが特徴。
  26. 26. #ccc_g11 Copyright 2017 Hiroyuki Onaka Pact • オーストラリアのオンライン不動産サービス RealEstate.com.auで開発された、コン シューマー駆動契約を使用したテストツール がオープンソース化されたもの。 • https://docs.pact.io/
  27. 27. #ccc_g11 Copyright 2017 Hiroyuki Onaka • 当初はRubyで開発されていたが、その後他 の言語へも移植。 • エクスペクテーションがJSONで記述されて いて、特定の言語からは独立したフォーマッ トになっていることが特徴。
  28. 28. #ccc_g11 Copyright 2017 Hiroyuki Onaka pact-jvm • PactのJVM言語向け移植版 • https://github.com/DiUS/pact-jvm
  29. 29. #ccc_g11 Copyright 2017 Hiroyuki Onaka サンプルの解 説
  30. 30. #ccc_g11 Copyright 2017 Hiroyuki Onaka • 動物園で飼育されている動物のモデルを返す サービス • そのサービスを使用して動物園の情報を扱うク ライアント • サンプルコードは以下にあります https://github.com/azusa/pact-jvm- example
  31. 31. #ccc_g11 Copyright 2017 Hiroyuki Onaka Animal Service Consumer (Zoo App) Provider (Animal Service) Animal Service Client
  32. 32. #ccc_g11 Copyright 2017 Hiroyuki Onaka GET /animals/serval { "animals": [ {"id": 1, "name": "サーバルちゃん"} ] }
  33. 33. #ccc_g11 Copyright 2017 Hiroyuki Onaka プロバイダーとしてのAnimal Service
  34. 34. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  35. 35. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  36. 36. #ccc_g11 Copyright 2017 Hiroyuki Onaka エクスぺくてーションの出力 クライアントでテストを実行すると、 target¥pacts¥test_consumer- test_provider.json に、JSONが出力されます。
  37. 37. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  38. 38. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  39. 39. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  40. 40. #ccc_g11 Copyright 2017 Hiroyuki Onaka サービス側のテスト エクスペクテーション(先ほどのJSON)をコン シュマー(クライアント)から受け取って、プロ バイダー(サービス)のビルドで、サービスの振 る舞いを検証します。
  41. 41. #ccc_g11 Copyright 2017 Hiroyuki Onaka
  42. 42. #ccc_g11 Copyright 2017 Hiroyuki Onaka エクスペクテーションとの マッピング アプリケーションの起動 テスト対象のポートの指定
  43. 43. #ccc_g11 Copyright 2017 Hiroyuki Onaka 実行結果
  44. 44. #ccc_g11 Copyright 2017 Hiroyuki Onaka コンシュー マー駆動契約 のポイント
  45. 45. #ccc_g11 Copyright 2017 Hiroyuki Onaka コンシューマー駆動契約のポイント • 検証の厳密さ • Provider Stateの扱い • エクスペクテーションの引き渡し
  46. 46. #ccc_g11 Copyright 2017 Hiroyuki Onaka 検証の厳密さ 例えば、エクスペクテーションとしてレスポン スがapplication/jsonというContent-Typeを返 すことを期待した場合。 サービス(プロバイダー)がapplication/json; charset=uif-8というContent-Typeを返した場 合、機能的には等価だが検証には失敗する。
  47. 47. #ccc_g11 Copyright 2017 Hiroyuki Onaka Provider Stateの扱い エクスペクテーションの検証時には、プロバーダー (サービス)のバックエンドのデータベースや、対向 先のサービスのモックをセットアップする必要があ ります。 よって、クライアントのテストとサービスのテスト が、テストデータの関係を通じて密結合することに なります。
  48. 48. #ccc_g11 Copyright 2017 Hiroyuki Onaka 上記二つの理由により、クライアントとサービ スの間のやりとりを全て検証するのではなく、 サービスのクライアントの契約として必要な部 分に検証を絞る必要があります。
  49. 49. #ccc_g11 Copyright 2017 Hiroyuki Onaka エクスペクテーションをサービス側で検証する には、クライアントが作成したエクスペクテー ションをサービス側に引き渡す必要があります。 • CIサーバーの成果物(Artifact)で引き渡す • Pact Brokerを使用する • https://github.com/bethesque/pact_broker
  50. 50. #ccc_g11 Copyright 2017 Hiroyuki Onaka まとめ
  51. 51. #ccc_g11 Copyright 2017 Hiroyuki Onaka コンシューマー駆動契約の使いどころ • 正直、悩ましい • サービス側をリファクタリングした時に、クラ イアント側でのテストなしでクライアントと サービス側のインターフェースを検証できると いうのはメリット • だが、サービス間の依存関係がそれなりに複雑 でない場合は、オーバースペックではないのか
  52. 52. #ccc_g11 Copyright 2017 Hiroyuki Onaka • 「テスト自動化ピラミッド」の考え方はコン シューマー駆動契約を導入しなくても有効 • アプリケーションのレイヤーそれぞれにどの ようなテストを書き、テストの網をはってリ スクを潰して行くかを考えていく中で、コン シューマー駆動契約の考え方も生きてくる。
  53. 53. #ccc_g11 Copyright 2017 Hiroyuki Onaka まとめ ユニットテストとエンドツーエンドテスト双方 を補完し、クライアントとサービス相互のイン ターフェース仕様の検証に絞った使い方が出来 るかが、コンシューマー駆動契約を推進する上 でのポイントになります。
  54. 54. #ccc_g11 Copyright 2017 Hiroyuki Onaka 情報源 • Pactのドキュメント • https://docs.pact.io/ • 実践 Pact:マイクロサービス時代のテストツール • http://techlife.cookpad.com/entry/2016/06/28/1642 47 • すいーとみゅーじっく vol.1 TDDってなんだ • https://fieldnotes.booth.pm/items/484459
  55. 55. #ccc_g11 Copyright 2017 Hiroyuki Onaka 「Testing Java Microservices」 • 2017年夏出版予定 • http://www.manning.com/books/testing- java-microservicess
  56. 56. #ccc_g11 Copyright 2017 Hiroyuki Onaka ありがとうございました! • 大中浩行(Onaka,Hiroyuki) • @setoazusa • グロースエクスパートナーズ株式会社 アーキテクチャソリューション部 テクニカルリード • http://hiroyuki.fieldnotes.jp/

×