Apidogを使ってテストシナリオを作成する

## 背景
業務でApidogについて調査することがありました。ネットで調べていましたが、公式のドキュメントはあるものの、Apidogについてのナレッジが少ないと感じたため、共有として執筆します。今回はテストシナリオを作成する方法を基本と応用に分けて説明しようと思います。

## アジェンダ
・Apidogとは
・基礎的なテストシナリオの作成
・応用的なテストシナリオの作成
・最後に

## Apidogとは
### 概要
Apidogは、APIドキュメント、APIのデバッグ、APIのMock、及びAPIの自動テストを統合したコラボレーションプラットフォームです。 Postman + Swagger + Mock + JMeter の機能を取り入れて、同一のシステムで共通のデータを使用して、異なるシステム間のデータ同期問題の解決に取り組んでいます。([公式](https://apidog.com/jp/help/overview/introduction)から引用)

## 基礎的なテストシナリオの作成
### 前提
今回はシンプルなHTTPリクエストとレスポンスを返してくれるサービス`https://httpbin.org/`
を使って説明してみようと思います。このAPIについての説明は[こちら](https://qiita.com/sameyasu/items/adacceb8a1bee893599b)を読んでください。
### 手順
①APIを定義
②APIケースを作成
③シナリオを作成
④シナリオ実行

### ①APIの定義
テストで使用するAPIを定義します。
API>新しいAPIを選択
![API作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/31b7e64d-b97d-119d-01d6-06f5ba2455d5.png)
エンドポイントの設定、APIの説明、Request・Responseの型を入力すれば完了です。
![API設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/c61655dc-4297-6499-3cd1-ebdfc171c381.png)
### ②APIケースの作成
APIケース(APIテストケース)を定義します。
試しにレスポンスの`param1`の値が、`ABC`かどうか検証したいと思います。
テスト>新しいAPI Caseを選択し、ケース名を入力します。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/28bc1b6d-6f53-b932-1792-60380f0e404b.png)
後処理のタブ>後処理を追加>アサーションを選択し、各設定を行います。
JSONPath式の入力欄内のボタンを押すと、JSONPath 抽出ツールが出てくるため、対象の(今回ではparam1)を選択するとPathが出てきます。もし、JSONPath 抽出ツール内にResponseのJSONが出てこない場合は一度APIリクエストすると、抽出ツール内にレスポンスの値が読み込まれるため実施してみると良いです。
![画像13131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/26a2d586-5a16-a667-4374-582dfa14e846.png)
### ③シナリオを作成
自動テストタブ>テストシナリオを新規作成を押下し各設定を行います。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/8c4c3bc9-e638-6a2a-b8b0-65b8eeb147db.png)
ステップを追加>APICaseからインポートする>②で作成したAPIケースを選択(param2をテストするAPIケースを作成しておきました。)するとシナリオが出来上がります。
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/0f28547e-1143-25ce-954c-3f6fcafa0622.png)
以下、作成したシナリオです。
![テストシナリオ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/bf6109cc-a47e-9543-11b7-f103b5e72cc2.png)
### ④シナリオ実行
シナリオを実行すると、レポートが作成され、テストの結果が合格か不合格か確認できます。
![レポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/a2c70109-1407-cbda-909f-7a36e9f2b870.png)
それぞれ詳細も見れ、リクエスト・レスポンス情報、アサーション結果を確認できます。
![画像11111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/1bfcce34-d215-75ed-78a3-b56b3b6b6cfe.png)


## 応用的なテストシナリオの作成
### 要件
期待値の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&param2=DEF&param3=GHI&param4=JKL"
}
### 全体像
先に実装したシナリオの全体を見せておきます。
![画像12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/66dce277-b9b7-0c7d-4848-7f2b733c198d.png)


### 手順
①環境変数の定義
②期待値のJSONファイルから基本要素数を取得
③for文に②の値を設定する。
④for文の中身を実装
### ①環境変数の定義
まず、期待値のJSONファイルから基本要素数を取得し、それを変数に格納したいです。(この変数を使ってfor文に扱いたい。。)　そこでこの環境変数を定義します。環境変数に値を代入→取得の流れで変数を扱います。
以下画像が今回のシナリオで使った環境変数です。
`expect`：期待値のJSONファイル
`count`：for文内で使用するカウンタ
`expect_length`：取得した基本要素数
で設定しています。
![環境変数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/60948269-5797-2ec2-75ad-c6b4957bb5b2.png)
### ②期待値のJSONファイルから基本要素数を取得
シナリオ内には、アサーションではなくコードベースで処理を書いて自由に操作できる「Script」もあります。そこで処理を書いていきます。まず、環境変数で定義した`expect`の項目数を取得します。(※expectは文字列のため、JSON型に変換しています。)　環境変数の値の出し入れには、この`pm.environment`に対して`get`や`set`メソッドを扱います。その後、`expect_length`に値を代入します。
![要素数取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/d3ff901b-65fe-ab40-588a-8372570fa2bd.png)

### ③for文に②の値を設定する
for文は以下のように設定しています。反復回数は②で取得した`expect_length`(基本要素数)に設定しています。環境変数は`{{}}`で括って設定すると使えます。
![for文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/6ebfb060-8e33-f715-34e6-02682a6e1599.png)

### ④for文の中身を実装
ここからゴリゴリ実装していきます。
流れとしては
・コード内で、期待値を格納する変数`expectedValue`とレスポンス値を格納する変数`response`を定義し、それぞれ初期化。
・上記で初期化した変数のkeyのみを取得する変数、`expectedValuekeys`と`responsekeys`を初期化。
・環境変数`count`を取得して、`expectedValuekeys`と`responsekeys`の`count`番目のkeyを取得。
・`expectedValue`とレスポンス値`response`を3keyをもとに比較。
・`count`の値を+1して環境変数の値を更新。
です。
![for文中身.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/bcab15f9-1fbe-18cb-fc14-47180d3c2bad.png)
### テスト結果
レスポンスの実測値と期待値は以下です。アサーションがきちんとできることを確認するために、`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&param2=DEF&param3=GHI&param4=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&param2=DEF&param3=GHI&param4=JKL"
}

テスト結果は以下です。意図して違った設定にした部分もテスト結果が失敗になっているので、正しくアサーションができています。
![テスト結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/84a00ca0-ae76-2cdc-bcb6-7d4876e748b3.png)
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/2f0a07e7-62a2-1459-df79-601bf89f92b7.png)
![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/772ccaa9-2ddf-62cf-235d-bd382dd00f32.png)
![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/b0d530f3-18c3-cc10-6944-265b0000e7aa.png)
![dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945173/e7eafb2d-793c-aeb8-c422-3a9a215ba451.png)


## 最後に
　良い文献を見つけることができず、環境変数を使うところが非常に苦労しました。。この記事が誰かの役にたってくれると嬉しいです。