Slide 1

Slide 1 text

All rights reserved by Postman Inc Postmanを活用した 効率的なAPIテスト自動化 のススメ 川崎庸市 Postman株式会社

Slide 2

Slide 2 text

テクノロジーエバンジェリスト Postman 株式会社 川崎 庸市 @yokawasa @postman_japan

Slide 3

Slide 3 text

アジェンダ ● イントロ ○ APIテストの目的・種類 ○ Postman概要 ● 本題: Postmanを活用したテスト自動化 ○ 変数とスクリプト ○ コレクションランナーによるコレクションAPI群のテスト実行 ○ モニターによる複数エリアからの定期的なAPIテスト実行 ○ モックサーバーによるテスト自動化の偽陽性の削除 ○ CLIを活用したCI/CD経由のテスト自動実行

Slide 4

Slide 4 text

APIのテスト どうしてますか?

Slide 5

Slide 5 text

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 DB Externa Servicel APIシステムは複数要素で構成 ● 複数レイヤ(層)で構成 ● 複数コンポーネントで構成 ● 外部サービスも利用 ● エンドユーザーは複数のAPIを組 み合わせて利用 品質を担保するには質の高いテストが 必要となる

Slide 6

Slide 6 text

テストの目的とは? テスト活動を通じて、プロダクトについ て最大限に学び、品質に影響をおよぼ しうる問題を発見すること 引用: Mark Winteringham, Web APIテスト技法 ( "Testing Web APIs"の邦訳版) テストの目的と価値を明らかにするために役に立つテストのモデル

Slide 7

Slide 7 text

テストの目的とは? テスト活動を通じて、プロダクトについ て最大限に学び、品質に影響をおよぼ しうる問題を発見すること 引用: Mark Winteringham, Web APIテスト技法 ( "Testing Web APIs"の邦訳版) テストの目的と価値を明らかにするために役に立つテストのモデル テスト活動を通じてこの部分を最大化し、自動化により API動作確認や潜在的な品質低下の検知を効率的・継続的に行う

Slide 8

Slide 8 text

代表的なAPIテスト ● ユニットテスト ○ 個々のAPIエンドポイントの結果・機能を検証 ● インテグレーションテスト ○ 複数コンポーネントが期待通りに連携し機能しているかを検証(ルーティング、バリデーションチェック、アプリロジック、データ層、外部サー ビスなどの連携) ● E2E テスト ○ 複数のエンドポイントや APIを含む主要なユーザージャーニー、シナリオの検証 ● リグレッションテスト ○ アップデートや修正を実施した後も、期待どおりに動作するかを検証 ● コントラクトテスト ○ リクエスト、レスポンス内容やフォーマットなど APIが仕様通りに実装されているかを検証 ● パフォーマンステスト ○ 異なる負荷でシステムがどの程度の性能を発揮するかを検証

Slide 9

Slide 9 text

API テストツール

Slide 10

Slide 10 text

All rights reserved by Postman Inc Postmanとは? 全世界2,500 万人以上のユーザーに使われている APIを 構築して利用するためのAPIプラットフォームです。 APIライフサイクルの各ステップを簡単に行えるようになり、 APIの共有と開発コラボレーションを効率化できます。

Slide 11

Slide 11 text

Postman アプリ ドキュメントを見ながら 作業できる🚀 整形されたレスポンスが見られる🚀 パラメータを変えてすぐ試せる🚀 エンドポイントを打ち込 む必要がない🚀 API のセットを整理し ておける🚀

Slide 12

Slide 12 text

アプリだけじゃない 豊富なPostman利用オプション ● Postmanアプリ ○ Windows、macOS、Linux上のデスクトップアプリ ● Postmanウェブ ○ ウェブブラウザから利用できる ● Postman CLI、Newman ○ コマンドライン(CLI)。自動化、CI/CDなどで利用可能 ● Postman VS Code拡張機能 ○ VS Code拡張としてPostmanの機能が利用可能 ● Postman API ○ Postman自身のAPを活用して他システムとの連携可能 ● Postman Collection SDK ○ Node.jsモジュール。コレクション管理が可能 ● インテーグレーション機能 ○ さまざまなプラットフォームとの統合サポート Postman CLI例 Postman VS Code拡張機能例

Slide 13

Slide 13 text

RESTだけじゃない 利用可能なリクエスト

Slide 14

Slide 14 text

API 提供側 ライフサイクル API 利用側 ライフサイクル 単一プラットフォームで 提供者と利用者両方の APIライフサイクルをサポート テスト 開発 設計 定義 デプロイ デプロイ 配布 監視 監視 テスト 評価 統合 発見 セキュリ ティ

Slide 15

Slide 15 text

All rights reserved by Postman Inc Postmanを活用したテスト自動化

Slide 16

Slide 16 text

テスト自動化で押さえておくべきポイント ● 変数とスクリプトの活用 ○ APIテスト記述 ○ API実行順序制御 ● コレクションランナーによるコレクションのAPIテスト群の実行 ○ 手動実行 ○ スケジュール実行 ○ APIパフォーマンステスト ● モニターによる複数エリアからの定期的なAPIテスト実行 ● モックサーバーによるテスト自動化の偽陽性の削除 ● CLIを活用したCI/CD経由のテスト自動実行

Slide 17

Slide 17 text

変数 変数として保存された値はPostman内で {{変数名}}表記で再利用できます ● 変数の種類 ○ グローバル変数 ○ コレクション変数 ○ 環境変数(Environment) ● 変数スコープ ○ 変数の種類ごとに異なる ● 変数タイプ ○ default ○ secret (グローバルと環境変数のみ) ● 動的変数 ○ {{$guid}}, {{$timestamp}}, {{$randomInt}}, etc. 変数スコープ https://learning.postman.com/docs/sending-requests/variables/ 同じ名前の変数が2つの異なるスコープで宣言されている場合、狭 い方のスコープの変数に格納されている値が使用される

Slide 18

Slide 18 text

変数 使用例 (1)リクエストURLの一部に対しての変数使用例 (3)クエリーパラメータの変数使用例 (2)ヘッダーでの変数使用例 (4)リクエストボディでの変数使用例

Slide 19

Slide 19 text

変数 補足記事 https://is.gd/yBjVSU

Slide 20

Slide 20 text

Postmanスクリプトとは? ● Postman サンドボックスで実行 ● Built-inのJavaScript APIをpm、postmanオブジェクトを通じて利用可能 ● Mochaベースのテストフレームワークを利用、AssertionライブラリとしてChaiが利用可能 ● 豊富なスニペットとサンプルスクリプト集が用意されている ● 新機能: Postbot(AIを活用したスクリプト生成アシスタント) スクリプト Postbot スニペット ローコード 支援機能

Slide 21

Slide 21 text

2種類のスクリプト実行ステージ PostmanではPre-requestとTestの2種類のステージでスクリプトの実行が可能 Pre-request リクエスト実行前に実行 Test レスポンス取得後に実行 リクエスト 送信 レスポンス 取得

Slide 22

Slide 22 text

リクエスト単位のテスト実行 実行 各テストの実行結果が出力 Testステージに5つのテストを記述

Slide 23

Slide 23 text

コレクションランナーで複数リクエストのテスト実行 実行 実行結果詳細表示 サマリー結果表示 順番入れ替え可能 実行方法選択 手動 / スケジュール実行 イテレーション数 遅延秒数 データファイル 指定可能 選択 コレクションメニュー コレクションランナー実行方法設定

Slide 24

Slide 24 text

コレクションランナー実行時にデータファイルの活用 コレクションランナー実行時に外部データファイル( CSVまたはJSON)からPostman変数にデータ注 入が可能。1イテレーションあたりファイル行数分のテストが実行される データファイル(CSV) コレクションランナー実行方法設定 Postman変数設定

Slide 25

Slide 25 text

コレクションランナーでテストのスケジュール実行 ● コレクションごとにスケジュール設定 ● テスト実行頻度 ○ 5分毎〜設定可能。ただし無料プランは一時間毎〜 ● テストはPostmanクラウド内から実行 ● アラート通知設定 ○ テストが失敗したらチームメンバーに通知可能 ● リトライ、タイムアウトなど設定可能 イテレーション数 データファイル 指定可能 アラート通知設定 スケジュール設定

Slide 26

Slide 26 text

コレクションランナーでAPIパフォーマンステストの実行 コレクションのAPI群に対して、手軽にクライアントから負荷をかけ、APIのパフォーマンスや性能フィード バックが得られる。大規模ピークシナリオ・テスト向けではない 仮想ユーザー数 テスト時間 負荷のかけ方 固定 / ランプアップ 実行 コレクションランナー実行方法設定

Slide 27

Slide 27 text

モニターで複数エリアから定期的にAPIテスト実行 ● コレクションごとにモニターを設定 ● テスト実行頻度 ○ 5分毎〜設定可能。ただし無料プランは一時間毎〜 ● テスト実行リージョン選択 ○ 複数リージョンからの APIテスト実行が可能 ● スタティックIP設定 ○ 要Professional / Enterpriseプラン ● アラート通知設定 ○ メール通知、or インテグレーション設定 でslack、 PagerDutyなど他チャンネルへの通知も可能 ● リトライ、タイムアウトなど設定可能 テスト実行リージョンの選択

Slide 28

Slide 28 text

スクリプトと変数を活用したリクエスト実行順序制御 スクリプトと変数を活用することで複数リクエストの実行順序を制御できます。これによりさまざまなパター ンのシナリオテストの実行が可能になります // グローバル変数設定 pm.globals.set("variable_key", "variable_value"); pm.globals.get("variable_key"); // コレクション変数設定 pm.collectionVariables.set("variable_key", "variable_value"); pm.collectionVariables.get("variable_key"); // 選択している環境への環境変数設定 pm.environment.set("variable_key", "variable_value"); pm.environment.get("variable_key"); postman.setNextRequest("request_name") 変数操作用関数(Get/Set) 次に実行するリクエストを決定する関数 Request A POST /pet Request B POST /order Request C GET /pet/ petId orderId pm .environm ent.set pm .environm ent.get pm.environment.get pm.environment.set postman.setNextRequest(“Request C”) 変数でリクエスト間で データを共有 postman.setNextRequestで 次実行するリクエストを指定

Slide 29

Slide 29 text

シナリオテスト例 - リクエストのループ ある数分のデータセットが完了するまであるリクエストをループする例。ここではRequest Aで取得した ユーザー数分の位置情報が取れるまでRequest Bをループする Request A GET users Request B GET positions userList postman.setNextRequest(“Request B”) index Request C GET weather Lat Lon サンプルコレクション - Using Request Workflows

Slide 30

Slide 30 text

モックサーバーを活用したテスト自動化の偽陽性の削減 テストの自動化において厄介なものの1つに偽陽性(false positive)がある。偽陽性とは失敗すべきでない ときに失敗してしまうことを指し、偽陽性のあるテストのことをFlakyテストと呼ぶ。 テスト自動化において偽陽性が発生しうるケースに外部システムとの連携がある。例えば、外部システムの 障害や期待しない挙動が頻繁に発生する場合、その度にテストはエラーになる。このようなケースにおいて、 外部システムをモックにすることはとても有効である。 Register API 外部サービス 認証 API POST /regist Flaky この部分にモックに変える 参考: Mark Winteringham, Web APIテスト技法 ( "Testing Web APIs"の邦訳版) データ処理

Slide 31

Slide 31 text

モックサーバーとは? 実際のサーバーと同じような振る舞いをする架空のサーバのこと。Postmanではモックサーバーはクラウ ドに作成され専用URLが発行される(デフォルトパブリックでプライベート設定可能) ● あるモックサーバーは必ずどれかのコレクションに紐 付けられる ● コレクションに保存された Examplesデータにもとづき モックレスポンスを返却する ● モックサーバーはリクエスト情報(パス、メソッドなど)を 元にマッチングアルゴリズムにもとづき返却する Examplesデータを選定してレスポンスを返却する マッチングアルゴリズムの詳細 - How the matching algorithm works サンプルモックサーバー URL https://27df2756-20d7-4f61-bb09-xxxxyyyzzz.mock.pstmn.io

Slide 32

Slide 32 text

CLIを活用したCI/CD経由のテスト自動実行 コード リポジトリ ビルド ユニット テスト サービス E2E テスト デプロイ リリース CI CD 繰り返し

Slide 33

Slide 33 text

2つのCLI - Postman CLIとNewman Postmanで利用可能な2種類のコマンドラインインターフェースとその違いについて。実行コードの可視性 (中身の把握)要件など特別な理由がない限りPostman CLIの利用を推奨 Postman CLI (Postmanサポート) Newman (OSS/コミュニティサポート) - Postmanによりサポート - ダウンロード可能パッケージとして配布 - コレクション実行結果をデフォルトでPostman に送信 - ライブラリとしては利用できない - Postmanにサインイン可能で、アカウントに紐 づいたPostman管理アセット情報を事前エク スポートすることなく利用可能(ただし、 Postmanサーバにアクセスが必要) - スタンドアロン実行も可能 - API Linting(optional)が実行できる - OSSとしてコミュニティサポート - npmパッケージとして配布 - ライブラリとして利用可能 - Postmanにサインインできない。よって、CLI から利用するコレクション情報は事前にエクス ポートしておく必要がある https://learning.postman.com/docs/postman-cli/postman-cli-overview/#comparing-the-postman-cli-and-newman 補足

Slide 34

Slide 34 text

Postman CLIからのコレクションテスト実行 CI/CD - GitHub Actionsサンプル設定例 Postman CLIからの コレクションテスト実行 例が表示 CI/CDパイプラインか らの実行例 コレクションランナー実行方法設定 CLIから実行を選択

Slide 35

Slide 35 text

Postman CLIからのコレクションテスト実行例 # Postmanにログイン postman login --with-api-key {{postman-api-key}} # コレクションテスト実行 # -e で環境 (Environment) の指定が可能 postman collection run {{collection-ID}} \ -e {{environment-ID}} コレクションテスト実行コマンド例 Postman CLIでのcollection run実行イメージ 実行結果の詳細は Postmanサーバに自動的に保存され後で閲覧が可能

Slide 36

Slide 36 text

CI/CD デモ GitHub Actions経由のPostmanテスト自動実行 https://github.com/yokawasa/postman-testing-cicd-sandbox

Slide 37

Slide 37 text

ありがとうございました