Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

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

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Cargando en…3
×

Eche un vistazo a continuación

1 de 56 Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Similares a pact-jvmではじめるコンシューマー駆動契約 (20)

Anuncio

Más de Hiroyuki Ohnaka (20)

Más reciente (20)

Anuncio

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/

×