$30 off During Our Annual Pro Sale. View Details »

APIテスト自動化の勘所

 APIテスト自動化の勘所

Presentation slides: タワーズ・クエスト、バルテス、Postman 共催セミナー - 開発失敗につながる偏ったテストしてませんか? プロが教える本当に考えるべきテストバランスのとり方
Session title: APIテスト自動化の勘所
Date: 2024/10/29
Session Description:
Web APIはシステム間をつなぐ重要なインターフェースです。本セッションではインターフェース特有のポイントを押さえ、システムとしての品質向上を実現するためのテスト自動化手法について説明します。どこから手を付ければよいのか?どの範囲を重点的にテストすべきか?の判断のヒントになれば幸いです。

Yoichi Kawasaki

October 29, 2024
Tweet

More Decks by Yoichi Kawasaki

Other Decks in Technology

Transcript

  1. All rights reserved by Postman Inc APIテスト自動化の勘所 川崎 庸市 Postman株式会社

    Presentation slides: タワーズ・クエスト、 バルテス、Postman 共催セミナー
  2. All rights reserved by Postman Inc Postman とは? 全世界3,500 万人以上のユーザーに使われている

    APIを構 築して利用するための API プラットフォームです。 API ライフサイクルの各ステップを簡単に行えるようになり、 API の共有と開発コラボレーションを効率化できます。
  3. APIシステムは複雑である UI JavaScript Gateway Item API Search API Document API

    Item Service Search Service Document Service Item DB Search DB Document Storage UI/JS API Externa Servicel APIシステムは複数要素で構成 • 複数レイヤ(層)で構成 • 複数コンポーネントで構成 • 外部サービスも利用 • エンドユーザーは複数のAPIを組 み合わせて利用
  4. 品質担保のためには質の高いテストが必要 E2E Integration API Unit コスト 実行時間 不確実要素 テスト数 テストのピラミッド

    • UIテスト • E2Eテスト • コントラクトテスト • リグレッションテスト • インテグレーションテスト • コンポーネントテスト • ユニットテスト • ユーザビリティテスト • セキュリティテスト • パフォーマンステスト 機能要件テスト 非機能要件テスト
  5. APIテストで確認すること • API (インターフェース) テストで確認すること ◦ コントラクト通りの振る舞いであるかどうか ◦ コンポーネント/サービス間連携に問題がないか  (

    外 部サービスやデータストアなどとの連携含む ) ◦ APIのパフォーマンス・応答速度に問題がないか ◦ APIを通じたやりとりがセキュアか • API テストで確認できないこと ◦ モジュールレベルの信頼性 (→ユニットテスト) ◦ ユーザー操作 / UIレベルの振る舞い、ビジネス要件 が満たせているかどうか( E2E) Testing Strategies in a Microservices Architecture https://martinfowler.com/articles/microservice-testing/
  6. テスト設計の前に押さえておくべきこと • 要件・仕様の理解 ◦ ビジネス要件 ◦ 提供するシステムの機能・責務: APIコントラクト(契約内容)、サービスレベル ◦ システムを構成するモジュール・サービスの機能、依存関係、データフロー

    • リスク分析と優先順位の策定 ◦ テスト対象のリスクを評価し、リスクが高い部分から優先してテストを設計 ◦ 自動化テストの適用範囲の検討 • テストのゴールとスコープの明確化 ◦ ゴールとスコープを決めて必要最低限かつ効果的なテストを設計する ◦ 作りすぎてもそれが負債になることを忘れない
  7. APIの冪等性 Idempotency) • 複数回リクエストを送信しても、結果が変わらないことの確認 • 冪等性が担保されることで、リトライ / 再送処理があったとしてもデータの不整合が防げる • 冪等性のあるメソッド:

    GET, PUT, DELETE, HEAD, OPTIONS ◦ POSTは冪等性キーIdenpotency-key)の活用することで冪等性をもたせることが可能 同一PUTリクエスト送信で冪等性のチェック 冪等性キーを活用して POSTリクエストの冪等性をチェック 参考: Build Resilient Systems with Idempotent APIs https://dev.to/karishmashukla/building-resilient-systems-with-idempotent-apis-5e5p
  8. APIバージョンごとの独立性 複数のAPIバージョンがある場合、各バージョンが互いに影響を及ぼさず、バージョンごとに期待通りの動作で あることを確認 確認ポイント • バージョンごとに提供されるエンドポイントが正しく動 作するか • バージョンアップによって既存クライアントに悪影響 が出ない(変更内容が後方互換性を保っている)

    APIバージョン管理パターン • URIベース ◦ /api/v1/user や /api/v2/user • クエリパラメータベース ◦ /api/user?v=1 や /api/user?v=2 • HTTPヘッダベース ◦ Accept: application/vnd.example.v1+json • ドメイン/サブドメインベース ◦ v1.example.com や v2.example.com
  9. APIパフォーマンス • APIの応答が速く、一定のパフォーマンス基準を満たしているかを確認 • APIは多くのシステム間でデータ連携・交換を行う重要な役割を果たしていることが多く、システム全体の パフォーマンス低下に影響を及ぼす可能性がある パフォーマンスはユーザー体験である Web performance is

    user experience. As you design and develop a new site, youʼll consider many components of its user experience: layout, hierarchy, intuitiveness, ease of use, and more. Your siteʼs experience determines how much your audience trusts your brand, returns to your site, and shares it with others. Designing for performance, by Lara Callender Hogan, Dec 2014 https://www.oreilly.com/library/view/designing-for-performance/9781491903704/ https://designingforperformance.com/index.html
  10. APIセキュリティベストプラクティス • 認証・認可設定 ◦ JWTやOAuth2など適切な認証・認可設定がされているか • 機密情報 ◦ エラーメッセージに機密情報が含まれていないか •

    入力のバリデーション ◦ SQLインジェクション、XSSなどインジェクション対策がされているか • CORS Cross-Origin Resource Sharing)設定 ◦ APIが他のオリジンからのリクエストに対して、適切にアクセス許可を設定 しているか • Rate Limiting(レート制限) ◦ 過剰なリクエストがあった場合に適切な制限がかかるか • キャッシュ制御 ◦ 静的データを提供するAPIが、適切なキャッシュ制御ヘッダーを設定しているか (Cache-Controlヘッダーでキャッシュ期間が設定されているなど)
  11. シナリオテストの押さえ所 • クリティカルユーザージャーニー ◦ 実際のユースケースに近いデータで、期待通りに処理されるかを確認 ◦ 複数のデータパターンで行う。特に、ログイン/未ログイン、プラン別、ロール別など同一インターフェースでも認可レベ ルによってアクセス可能なデータが異なるパターンは入念に ◦ ユーザー主要操作/ビジネスクリティカルなシナリオはE2Eテストに寄せて効率よくAPIテストと配分する

    • 異常系シナリオにおけるエラーハンドリングや回復系処理 ◦ 通常フローだけでなく、異常系シナリオで、例外ハンドリングや回復性処理が想定通りに動作するかを確認 • 状態管理の一貫性 ◦ 状態管理が発生する場合、複数モジュール・複数サービスに渡るステートの一貫性を確認(変更されたユーザーのス テータスがサービス間で一貫性があるか?) • 同期・非同期処理 ◦ 複数モジュール・複数サービス間で非同期処理(非同期なAPI呼び出しやメッセージキューを使用する、など)が含ま れる場合、タイミングや順序に影響されず期待するレスポンスが得られるか確認 API scenario testing https://www.postman.com/templates/78475d979a364731-ab249adf6a94d0fb/API-scenario-testing/ Build Resilient Systems with Idempotent APIs https://dev.to/karishmashukla/building-resilient-systems-with-idempotent-apis-5e5p Continuous Testing of ALL your APIs https://microcks.io/blog/continuous-testing-all-your-apis/ Request ① POST /regist Request ② GET /get Request ③ POST /unregist
  12. モックの活用 • 活用メリット: テスト自動化の効率を高めることができる。テスト対象の外部依存や副作用を回避し、環境 やデータ状況に依存せずにテストを柔軟かつ安定的に実施できるようになる • 活用デメリット: モックはあくまでモックなので、依存しすぎると、実環境との乖離やテスト信頼性の低下に つながる API

    依存 箇所 依存 箇所 モック API 未完成 APIや 外部サービス モック活用シナリオ • 外部APIとの依存関係排除 • データベース連携テスト • 認証・認可システム連携テスト • 非同期処理(メッセージキュー)連携テスト • 外部サービスのタイムアウト・障害テスト
  13. テスト自動化の適用、何から優先的に? 限られたリソースの中で優先順位を付けて自動化するテストを選定するときのヒント: • 頻繁に変更される部分 ◦ 早い段階で自動化しておくことによるテスト見落としリスク軽減とテスト工数の削減 • 繰り返しテストされるが、手動テストが困難または時間がかかる部分 ◦ 早い段階で自動化しておくことによるテスト工数の削減

    • バグや障害による影響が大きい部分 ◦ テスト見落としリスク軽減。認証・認可、機密データ扱い処理、データ整合性リスク、など • 共通機能 ◦ 再利用性が高く、複数機能に影響する箇所 スライド「テスト設計の前に押さえておくべきこと 」の内容が重要になってくる
  14. APIの品質を保つためのテスト自動化のポイントについて解説しました • APIシステムの複雑性: 複数レイヤと外部サービスを利用するため、テストは多層的であるべき • API固有のテスト観点: コントラクトテスト、パフォーマンステスト、セキュリティなど、 APIの特性に応じた 検証項目がある •

    テスト自動化の優先順位のヒント : 変更頻度、ビジネス要件、リスクなど • モック活用: 外部依存を排除してテストの安定性を高めるが、実環境との差異に注意が必要 • 継続的なテスト管理の重要性 : テストコードの腐敗を防ぎ、価値あるテストを維持するために、リファクタ リングと適切な体制が不可欠 @postman_japan
  15. Postmanイベント Postman API Night(勉強会)&ワークショップ https://postman.connpass.com/ Please Follow us - Postman

    イベント情報 Postman Japan X https://twitter.com/postman_japan @postman_japan