背景
業務でApidogについて調査することがありました。ネットで調べていましたが、公式のドキュメントはあるものの、Apidogについてのナレッジが少ないと感じたため、共有として執筆します。今回はテストシナリオを作成する方法を基本と応用に分けて説明しようと思います。
アジェンダ
・Apidogとは
・基礎的なテストシナリオの作成
・応用的なテストシナリオの作成
・最後に
Apidogとは
概要
Apidogは、APIドキュメント、APIのデバッグ、APIのMock、及びAPIの自動テストを統合したコラボレーションプラットフォームです。 Postman + Swagger + Mock + JMeter の機能を取り入れて、同一のシステムで共通のデータを使用して、異なるシステム間のデータ同期問題の解決に取り組んでいます。(公式から引用)
基礎的なテストシナリオの作成
前提
今回はシンプルなHTTPリクエストとレスポンスを返してくれるサービスhttps://httpbin.org/
を使って説明してみようと思います。このAPIについての説明はこちらを読んでください。
手順
①APIを定義
②APIケースを作成
③シナリオを作成
④シナリオ実行
①APIの定義
テストで使用するAPIを定義します。
API>新しいAPIを選択
エンドポイントの設定、APIの説明、Request・Responseの型を入力すれば完了です。
②APIケースの作成
APIケース(APIテストケース)を定義します。
試しにレスポンスのparam1
の値が、ABC
かどうか検証したいと思います。
テスト>新しいAPI Caseを選択し、ケース名を入力します。
後処理のタブ>後処理を追加>アサーションを選択し、各設定を行います。
JSONPath式の入力欄内のボタンを押すと、JSONPath 抽出ツールが出てくるため、対象の(今回ではparam1)を選択するとPathが出てきます。もし、JSONPath 抽出ツール内にResponseのJSONが出てこない場合は一度APIリクエストすると、抽出ツール内にレスポンスの値が読み込まれるため実施してみると良いです。
③シナリオを作成
自動テストタブ>テストシナリオを新規作成を押下し各設定を行います。
ステップを追加>APICaseからインポートする>②で作成したAPIケースを選択(param2をテストするAPIケースを作成しておきました。)するとシナリオが出来上がります。
以下、作成したシナリオです。
④シナリオ実行
シナリオを実行すると、レポートが作成され、テストの結果が合格か不合格か確認できます。
それぞれ詳細も見れ、リクエスト・レスポンス情報、アサーション結果を確認できます。
応用的なテストシナリオの作成
要件
期待値のJSONの基本要素数を取得して、各要素ごとにレスポンスの値(実測値)と期待値の比較を行います。
具体的にいうと以下の期待値の型があった場合、JSONの要素、args
,headers
,origin
,url
の値をレスポンスの値と比較するテストです。この場合、基本要素数は4なので、4回アサーションが生成されるイメージです。これをfor文を使って実装します。
{
"args": {
"param1": "ABC",
"param2": "DEF",
},
"headers": {
"Accept": "/",
"Accept-Encoding": "gzip",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "Apidog/1.0.0 (https://apidog.com)",
"X-Amzn-Trace-Id": "Root=1-67443824-3f16b63258706de665ab7694"
},
"origin": "XXX.XXX.XXX.XXX",
"url": "https://httpbin.org/get?param1=ABC¶m2=DEF¶m3=GHI¶m4=JKL"
}
全体像
手順
①環境変数の定義
②期待値のJSONファイルから基本要素数を取得
③for文に②の値を設定する。
④for文の中身を実装
①環境変数の定義
まず、期待値のJSONファイルから基本要素数を取得し、それを変数に格納したいです。(この変数を使ってfor文に扱いたい。。) そこでこの環境変数を定義します。環境変数に値を代入→取得の流れで変数を扱います。
以下画像が今回のシナリオで使った環境変数です。
expect
:期待値のJSONファイル
count
:for文内で使用するカウンタ
expect_length
:取得した基本要素数
で設定しています。
②期待値のJSONファイルから基本要素数を取得
シナリオ内には、アサーションではなくコードベースで処理を書いて自由に操作できる「Script」もあります。そこで処理を書いていきます。まず、環境変数で定義したexpect
の項目数を取得します。(※expectは文字列のため、JSON型に変換しています。) 環境変数の値の出し入れには、このpm.environment
に対してget
やset
メソッドを扱います。その後、expect_length
に値を代入します。
③for文に②の値を設定する
for文は以下のように設定しています。反復回数は②で取得したexpect_length
(基本要素数)に設定しています。環境変数は{{}}
で括って設定すると使えます。
④for文の中身を実装
ここからゴリゴリ実装していきます。
流れとしては
・コード内で、期待値を格納する変数expectedValue
とレスポンス値を格納する変数response
を定義し、それぞれ初期化。
・上記で初期化した変数のkeyのみを取得する変数、expectedValuekeys
とresponsekeys
を初期化。
・環境変数count
を取得して、expectedValuekeys
とresponsekeys
のcount
番目のkeyを取得。
・expectedValue
とレスポンス値response
を3keyをもとに比較。
・count
の値を+1して環境変数の値を更新。
です。
テスト結果
レスポンスの実測値と期待値は以下です。アサーションがきちんとできることを確認するために、origin
とX-Amzn-Trace-Id
をあえて違うようにしました。
実測値
{
"args": {
"param1": "ABC",
"param2": "DEF",
"param3": "GHI",
"param4": "JKL"
},
"headers": {
"Accept": "/",
"Accept-Encoding": "gzip",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "Apidog/1.0.0 (https://apidog.com)",
"X-Amzn-Trace-Id": "Root=1-67443824-3f16b63258706de665ab7694"
},
"origin": "XXX.XXX.XXX.XXX",(IPのためマスク)
"url": "https://httpbin.org/get?param1=ABC¶m2=DEF¶m3=GHI¶m4=JKL"
}
期待値
{
"args": {
"param1": "ABC",
"param2": "DEF",
"param3": "GHI",
"param4": "JKL"
},
"headers": {
"Accept": "/",
"Accept-Encoding": "gzip",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "Apidog/1.0.0 (https://apidog.com)",
"X-Amzn-Trace-Id": "Root=1-67440432-21ba4e74377521c1608b66e2" →レスポンスと違う
},
"origin": "54.89.142.0", →レスポンスと違う(適当なIP)
"url": "https://httpbin.org/get?param1=ABC¶m2=DEF¶m3=GHI¶m4=JKL"
}
テスト結果は以下です。意図して違った設定にした部分もテスト結果が失敗になっているので、正しくアサーションができています。
最後に
良い文献を見つけることができず、環境変数を使うところが非常に苦労しました。。この記事が誰かの役にたってくれると嬉しいです。