Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Merpay Tech Fest 2021_Scenario Based Integration Testing Platform for Microservices

Merpay Tech Fest 2021_Scenario Based Integration Testing Platform for Microservices

Merpay Tech Fest 2021は5日間のオンライン技術カンファレンスです。

IT企業で働くソフトウェアエンジニアおよびメルペイの技術スタックに興味がある方々を対象に2021年7月26日(月)から7月30日(金)までの5日間、開催します。 Merpay Tech Festは事業との関わりから技術への興味を深め、プロダクトやサービスを支えるエンジニアリングを知れるお祭りです。 セッションでは事業を支える組織・技術・課題などへの試行錯誤やアプローチを紹介予定です。お楽しみに!

■イベント関連情報
- 公式ウェブサイト:https://events.merpay.com/techfest-2021/
- 申し込みページ:https://mercari.connpass.com/event/215035/
- Twitterハッシュタグ: #MerpayTechFest

■リンク集
- メルカリ・メルペイイベント一覧:https://mercari.connpass.com/
- メルカリキャリアサイト:https://careers.mercari.com/
- メルカリエンジニアリングブログ:https://engineering.mercari.com/blog/
- メルカリエンジニア向けTwitterアカウント:https://twitter.com/mercaridevjp
- 株式会社メルペイ:https://jp.merpay.com/

92cdcff298e89e2fcd2fb705155c2d4b?s=128

mercari
PRO

July 30, 2021
Tweet

Transcript

  1. #MerpayTechFest Session Title Scenario-Based Integration Testing Platform for Microservices Kenta

    Mori Architect Team, Merpay, Inc.
  2. #MerpayTechFest Architect Team, Merpay, Inc. Kenta Mori (@zoncoen) 2018年に株式会社メルペイに入社、 QRコード決済に関わるマイクロサービス

    開発に携わる。現在 Architectチームに所属、マイクロサービス ため シナ リオテストプラットフォーム 開発などを担当している。
  3. #MerpayTechFest Agenda Introduction Test Runner Continuous Integration Testing in the

    Real World 02 03 04 01 05 Conclusion
  4. #MerpayTechFest Introduction

  5. #MerpayTechFest Architecture of Merpay Client Service A Service B Service

    C API Gateway Authority HTTP gRPC gRPC gRPC HTTP Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub
  6. #MerpayTechFest Pros of Microservices Architecture • Better maintainability, testability, deployability

    ◦ 小さいサービスに分割することで見通しが良くなり、各チームが独立 したリリースサイクルで開発することができる • Scalability ◦ 必要なサービス みスケーリングすることで効率よくリソースを利用 することができる • Improved fault isolation ◦ メモリリーク ような問題がシステム全体に影響を与えない • Eliminate technology lock-in ◦ 各サービスが適切な技術スタックを選択することができる
  7. #MerpayTechFest Cons of Microservices Architecture • Complex communication ◦ サービス間通信が増加、複雑化する

    • Debugging problems can be harder ◦ 複数 サービスにまたがる問題 デバッグ 難しい • Deployment challengers ◦ 別 サービスに依存する機能 リリース 完全に独立で ない • Global testing is difficult ◦ 依存しているサービスも含めたテスト 容易で ない
  8. #MerpayTechFest Cons of Microservices Architecture • Complex communication ◦ サービス間通信が増加、複雑化する

    • Debugging problems can be harder ◦ 複数 サービスにまたがる問題 デバッグ 難しい • Deployment challengers ◦ 別 サービスに依存する機能 リリース 完全に独立で ない • Global testing is difficult ◦ 依存しているサービスも含めたテスト 容易で ない
  9. #MerpayTechFest Microservices Testing Strategies • Unit tests ◦ テスト可能な最小単位 コードに対するテスト

    • Component tests ◦ テスト範囲を1つ サービスに限定したテスト • Contract tests ◦ Consumer が期待する仕様を満たしているか確認するテスト • Integration tests ◦ サービス間 通信経路や相互作用 検証も含めたテスト • End-to-end tests ◦ システム全体に対するテスト From martinfowler.com
  10. #MerpayTechFest Microservices Testing Strategies External Service In-Memory Datastore External Datastore

    Service HTTP/gRPC Client Stub Client Client External Service
  11. #MerpayTechFest Microservices Testing Strategies • Unit tests ◦ テスト可能な最小単位 コードに対するテスト

    External Service In-Memory Datastore External Datastore Service HTTP/gRPC Client Stub Client External Service Client
  12. #MerpayTechFest Microservices Testing Strategies • Component tests ◦ テスト範囲を1つ サービスに限定したテスト

    External Service In-Memory Datastore External Datastore Service HTTP/gRPC Client Stub Client External Service Client
  13. #MerpayTechFest Microservices Testing Strategies • Contract tests ◦ Consumer が期待する仕様を満たしているか確認するテスト

    External Service In-Memory Datastore External Datastore Service HTTP/gRPC Client Stub Client External Service Client Consumer Provider
  14. #MerpayTechFest Microservices Testing Strategies • Integration tests ◦ サービス間 通信経路や相互作用

    検証も含めたテスト External Service In-Memory Datastore External Datastore Service HTTP/gRPC Client Stub Client External Service Client
  15. #MerpayTechFest Microservices Testing Strategies External Service In-Memory Datastore External Datastore

    Service HTTP/gRPC Client Stub Client • End-to-end tests ◦ システム全体に対するテスト Client External Service
  16. #MerpayTechFest Microservices Testing Strategies • Unit tests ◦ Go test(関数単位

    ユニットテスト) • Component tests ◦ Go test(Mock や Stub を使った1サービスに閉じたテスト) • Contract tests ◦ Pact (, schema-first development) • Integration tests ◦ Postman • End-to-end tests ◦ Appium, XCUITest, Cypress, etc.
  17. #MerpayTechFest • Unit tests ◦ Go test(関数単位 ユニットテスト) • Component

    tests ◦ Go test(Mock や Stub を使った1サービスに閉じたテスト) • Contract tests ◦ Pact • Integration tests ◦ Postman • End-to-end tests ◦ Appium, XCUITest, Cypress, etc. Microservices Testing Strategies Difficult
  18. #MerpayTechFest Test Runner

  19. #MerpayTechFest Integration Testing Service A Service B Service C API

    Gateway Authority gRPC gRPC HTTP Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub ? gRPC HTTP Client
  20. #MerpayTechFest Postman • JSON over HTTP な API サーバー テストを行うツール

    ◦ https://www.postman.com/ • GUI アプリケーションが用意されている • 既存 CI に組み込みやすい ◦ Newman を使うと CUI で実行できる • JavaScript コードが実行できる ◦ リクエストボディ 生成 ◦ レスポンスボディ 確認
  21. #MerpayTechFest Postman’s GUI

  22. #MerpayTechFest Cons of Postman • 任意 JavaScript ライブラリを追加できない ◦ 汎用的な処理

    使い回しもできない ◦ グローバル変数を使ってできなく ないが… • Pull Request ベース メンテナンスが難しい ◦ エクスポートしたテスト 定義 JSON 複雑なファイルな で、差 分が確認しにくい ◦ Not developer friendly
  23. #MerpayTechFest { "info": { "_postman_id": "3c794208-be0b-48cf-9558-04910aa40430", "name": "example", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"

    }, "item": [ { "name": "Echo Service", "event": [ { "listen": "test", "script": { "id": "de3c44f3-4ae5-4352-8b5f-35bdbe4024a2", "exec": [ "pm.test(\"response status code is OK\", () => {", " pm.response.to.have.status(200);", "})", "", "pm.test('message must be \"hello\"', function () {", " const jsonData = pm.response.json();", " pm.expect(jsonData.message).to.eql(\"hello\");", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Content-Type", "name": "Content-Type", "value": "application/json", "type": "text" } ], "body": { "mode": "raw", "raw": "{\n\t\"message\": \"hello\",\n}" }, "url": { "raw": "http://localhost:8080", "protocol": "http", "host": ["localhost"], "port": "8080" } }, "response": [] } ] } Exported JSON
  24. #MerpayTechFest Scenarigo • API サーバー シナリオテストを行うため ツール ◦ https://github.com/zoncoen/scenarigo ◦

    テストシナリオを YAML で書ける ◦ テストシナリオを使い回すことができる ◦ Go で拡張することができる ◦ HTTP だけでなく gRPC が使える
  25. #MerpayTechFest Test Scenario Example title: echo-service steps: - title: POST

    /echo protocol: http request: method: POST url: '{{env.ECHO_ADDR}}/echo' body: message: hello expect: body: message: '{{request.message}}' • Why YAML? ◦ JSON より 手で読み書きしやすい(と思う)
  26. #MerpayTechFest Test Scenario Example title: echo-service steps: - title: POST

    /echo protocol: http request: method: POST url: '{{env.ECHO_ADDR}}/echo' body: message: hello expect: body: message: '{{request.message}}' $ scenarigo run example.yaml 1. POST {{env.ECHO_ADDR}}/e cho 2. Receive response 3. Check response Scenarigo echo-service
  27. #MerpayTechFest Reuse Test Scenario title: echo-service steps: - title: login

    include: './login.yaml' < run login.yaml bind: vars: userToken: '{{vars.userToken}}' < store token - title: POST /echo protocol: http request: method: POST url: '{{env.ECHO_SERVICE_ADDR}}/echo' header: Authorization: 'Bearer {{vars.userToken}}' < use token body: message: hello expect: body: message: '{{request.message}}'
  28. #MerpayTechFest Plugin • Go で拡張可能 package main import ( "github.com/google/uuid"

    ) func UUID() string { return uuid.New().String() } $ go build -buildmode=plugin -o gen.so gen.go
  29. #MerpayTechFest Plugin • Go で拡張可能 title: echo-service plugins: gen: gen.so

    steps: - title: POST /echo protocol: http request: method: POST url: '{{env.ECHO_ADDR}}/echo' body: id: '{{plugins.gen.UUID()}}' < call Go function message: hello expect: body: id: '{{request.id}}' message: '{{request.message}}'
  30. #MerpayTechFest Integration Testing Service A Service B Service C API

    Gateway Authority gRPC gRPC Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub Scenarigo gRPC HTTP Client HTTP
  31. #MerpayTechFest Continuous Integration

  32. #MerpayTechFest Integration Testing Service A Service B Service C API

    Gateway Authority gRPC gRPC Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub Scenarigo gRPC HTTP Client HTTP
  33. #MerpayTechFest Integration Testing Service A Service B Service C API

    Gateway Authority gRPC gRPC HTTP Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub Scenarigo Webhook gRPC HTTP Client
  34. #MerpayTechFest Prow • Kubernetes 上で動く CI/CD システム ◦ Kubernetes クラスタ上でジョブを実行

    ◦ Kubernetes 自体 テストに使われている ◦ GitHub コミットをトリガーにしたり指定したスケジュールでテストを 実行することができる ◦ https://github.com/kubernetes/test-infra/tree/master/pro w • Kubernetes クラスタ上で実行される で、クラスタ外から アクセス を許可することなく各マイクロサービス テストができる
  35. #MerpayTechFest Dashboard

  36. #MerpayTechFest Result

  37. #MerpayTechFest Developer Prow Testing Frow Webhook Logs Cloud Storage hook

    horologium deck Service X plank Controller Job Controller Controller
  38. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource Create plank Controller Job Controller Controller
  39. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource plank Controller Reconcile Job Controller Controller
  40. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource plank Controller Reconcile Job Controller Controller
  41. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource plank Controller Testing by Scenarigo Job Controller Controller
  42. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource plank Controller Store Logs Job Controller Controller
  43. #MerpayTechFest Developer Prow Testing Frow Logs Cloud Storage hook horologium

    deck Service X ProwJob Custom Resource plank Controller Get Logs Access Prow Dashboard Job Controller Controller
  44. #MerpayTechFest Integration Testing Service A Service B Service C API

    Gateway Authority gRPC gRPC HTTP Cloud Spanner Cloud Spanner Cloud Storage Cloud Spanner Cloud Pub/Sub Scenarigo Webhook gRPC HTTP Client
  45. #MerpayTechFest Testing in the Real World

  46. #MerpayTechFest Run tests on local machines • テストシナリオを作成するときに 手元からテストを実行したい ◦

    開発環境 各マイクロサービス expose されてないためインター ネット越しに直接叩くこと できない • telepresence を使ってリクエストをプロキシする ◦ https://www.telepresence.io/ ◦ k8s クラスタへ リクエストを自動でプロキシするようにできる ◦ プロキシする に使う Deployment を ProwJob PodSpec に 沿って適切に作成することで、k8s 上でテストするときと同じ環境変 数や Secret を利用することができる
  47. #MerpayTechFest scenario-test Namespace Local Scenarigo Pod foo-service Namespace foo-service Secret

    Env Telepresence create
  48. #MerpayTechFest scenario-test Namespace Local Scenarigo Pod foo-service Namespace foo-service Secret

    Env Telepresence foo-service.foo-namespace .svc.cluster.local • 同一クラスタな でアクセス可能
  49. #MerpayTechFest scenario-test Namespace Local foo-service Namespace foo-service Secret Env Telepresence

    foo-service.foo-namespace .svc.cluster.local • Expose していなけれ インターネット越しにアクセス不可
  50. #MerpayTechFest scenario-test Namespace Local traffic-manager Pod foo-service Namespace foo-service via

    TUN Secret Env Telepresence • telepresence connect でトンネリング
  51. #MerpayTechFest scenario-test Namespace Local traffic-manager Pod foo-service Namespace foo-service foo-service.foo-namespace

    .svc.cluster.local via TUN Secret Env Telepresence • クラスタへ リクエストが proxy される
  52. #MerpayTechFest scenario-test Namespace Local traffic-manager Pod foo-service Namespace foo-service foo-service.foo-namespace

    .svc.cluster.local via TUN Secret Env Telepresence • クラスタへ リクエストが proxy される
  53. #MerpayTechFest scenario-test Namespace Local traffic-manager Pod foo-service Namespace foo-service foo-service.foo-namespace

    .svc.cluster.local via TUN Secret Env sshfs Telepresence • Env や Secret も参照可能
  54. #MerpayTechFest scenario-test Namespace Local traffic-manager Pod Secret Env foo-service Namespace

    foo-service foo-service.foo-namespace .svc.cluster.local via TUN Secret Env sshfs Telepresence • Env や Secret も参照可能
  55. #MerpayTechFest Other Issues • テスト用データ 作成・管理 ◦ 社内向けユーザー作成用便利ツール user-tkool ◦

    あらかじめユーザーを作成しておくことで高速化 ◦ そ 他 データ ケースバイケース • 時間に依存する機能 テスト ◦ 環境をわける ◦ リクエスト毎に時間を指定できるようにする • 非同期に処理される機能 テスト ◦ リトライする… etc.
  56. #MerpayTechFest Other Issues • 開発している機能を PR 状態でもテストしたい ◦ Dynamic Service

    Routing
  57. #MerpayTechFest Other Issues • 開発している機能を PR 状態でもテストしたい ◦ Dynamic Service

    Routing Next
  58. #MerpayTechFest Conclusion

  59. #MerpayTechFest Our Integration Testing Platform • Scenarigo ◦ HTTP/gRPC サーバー

    テストを行うツール ◦ テストシナリオを YAML で記述できる • Prow ◦ Kubernetes 上で動く CI/CD システム • Telepresence ◦ Kubernetes クラスタ上にデプロイするアプリケーション向け開発支 援ツール
  60. #MerpayTechFest Our Integration Testing Platform • シナリオテストによるプロダクト 品質向上 ◦ 各マイクロサービスを対象にしたインテグレーションテスト

    ◦ 今で 40を超えるマイクロサービスに利用されている • Future plans ◦ Visualization ◦ Coverage ◦ テスト時間削減