Chrome拡張機能 Talend API Testerを使ってAPIのテスト（APIの実行結果を次のAPI実行のパラメータに利用する）

# 概要

Google Chromeの拡張機能[Talend API Tester](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm)は、HTTPやREST APIの動作確認が簡単に行えます。
Assersion機能も搭載されており、実行結果の自動テストも可能です。

この記事では、Talend API Testerを使って、[Qiita API](https://qiita.com/api/v2/docs)をサンプルにテストを行います。

# 事前準備

## Qiita APIを利用するためのトークンを発行する

https://qiita.com/settings/applications
にアクセスして個人用アクセストークンを発行しておく。

## Tablend API TesterをChromeにインストールしておく

Google Chromeの拡張機能[Talend API Tester](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm)をインストールする。

# 新規Projectの作成

Chromeを起動して、拡張機能のTablend API Testerにアクセスし、左ペインの下部にある`+Project`ボタンを押下して新規Projectを作成する。

![img.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/45a3b65d-b944-cb5c-2127-1a057a62d36f.gif)

# QiitaAPIへのRequestを作成する

Project名の右側にある縦の３点リーダークリック -> Add a request を選択で新規のRequestを作成できます。
<img width="1305" alt="スクリーンショット 2020-07-16 7.34.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/6f929dbb-c8a5-ed7c-51e6-18912522ba7d.png">

## Qiita記事一覧取得APIの実行

GET /api/v2/authenticated_user/items
https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems
このGETのAPIは、認証中のユーザーの記事一覧情報を取得するAPIです。
新規作成したRequestに対して以下の設定を行います。

**Requestの設定**

|項目|設定値|
|:--|:--|
|Request名|GetQiitaItems|
|METHOD|GET|
|URI|https://qiita.com/api/v2/authenticated_user/items|

**HTTP Headerの設定**

|項目|設定値|
|:--|:--|
|Authorization|Bearer ffbe8e50fcb278079a4095dc48b9ac9fb41d87f2|

Bearerで指定しているトークン情報は、[Qiitaの個人用トークン](https://qiita.com/settings/applications)の設定で取得したトークンの情報を設定

設定が完了したら、画面右側にある`Send`ボタンを押下するとAPIの実行結果を確認することができる。

![img.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/6e675a2d-991c-b335-583a-1cab52b53a59.gif)

## 記事一覧取得APIのAssertionチェックを行う

`+Add assertion`ボタンを押下する。

<img width="1305" alt="スクリーンショット 2020-07-16 7.45.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/934fa84b-f2a5-6569-50f4-c9489f6692e5.png">

デフォルトで追加されるAssertionは、Responseのステータスコードが200番であることをチェックするものが追加されます。
（Responseが正常に返却されたかチェックしているだけ。）

それ以外にもResponseのBODY部分をチェックすることもできます。
例えば以下のような感じです。

<img width="980" alt="スクリーンショット 2020-07-16 7.59.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/63536a5d-697e-43fa-6d4f-61c282bd4d0c.png">

ここでは、ResponseのBodyがJSONなので、`JSON body`の内容をチェックしています。

`$..title[(@.length-1)]`は、ResponseのJSON内にあるtitleの項目を配列で取得し、その配列の最後の要素に対してアクセスしています。
つまり、authenticated_user/items の実行結果の最後のitem（Qiita記事)のタイトルをチェックしています。

ここで指定しているセレクタの方法は[JSON Path](https://help.talend.com/reader/HujBrzfhc9BvOeZxdRW3_A/gTx6Tx87MnK1_WsuBtSfQg)でいろいろな指定方法が確認できます。

ここで設定したAssertionが失敗すると当然グリーン→レッドになります。
APIのテスト自動化には使えそうですね。
（もちろんIDE環境やCI環境でテストを自動化し実行する方がいいとは思いますが、私自身は開発者ではなく、システム開発を依頼する側で、そのシステムの受入を行う位置付けなので、こういったツールが使い物にならないかなぁと思って検証しています。。。）

<img width="980" alt="スクリーンショット 2020-07-16 8.03.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/ed0d2547-6551-ec5f-14c3-719edf0e7ca4.png">

## 指定した記事IDの記事情報を取得 （ここで別のAPIの結果を流用）

GET /api/v2/items/:item_id
https://qiita.com/api/v2/docs#get-apiv2itemsitem_id

:item_idで指定したIDの記事情報を取得するAPIです。
ここで :item_id の部分には、GET /api/v2/authenticated_user/items で取得した記事一覧のIDを利用したいとします。

この場合、1つのAPIをテストするのに、別のAPIの実行結果をパラメータに指定したくなってしまいます。
ここでは、簡単に別のAPIの実行結果をパラメータに指定する方法を紹介します。

**Requestの設定**

|項目|設定値|
|:--|:--|
|Request名|GetQiitaItem|
|METHOD|GET|
|URI|https://qiita.com/api/v2/items/|

※items/の後の部分に別のAPIの実行結果を埋め込むので、いったんこのようにURIを指定します。

**HTTP Headerの設定**

|項目|設定値|
|:--|:--|
|Authorization|Bearer ffbe8e50fcb278079a4095dc48b9ac9fb41d87f2|

それでは、別のAPIの実行結果の一部をパラメータに指定します。
URIの`items/`の後にパラメータを指定したいので、そこにカーソルを合わせ、テキストボックスの右側にあるアイコンボタン（Open the expression builder）を押下します。

そこからExpression Builderを起動して、以下画面イメージのように、
Project名を選択 -> Request名を選択 -> Responseを選択 -> bodyを選択 -> Itemsを選択
というように、対象のRequestの到達したい項目までドリルダウン式にたどっていって設定します。

![img.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f2eb9102-ad8d-937e-2ac5-5dad3f4ad692.gif)

今回は動的な取得結果に対してIDの情報を取得してしまっているのですが、例えばワンタイムトークンを発行するAPIを実行 -> その後、ワンタイムトークンを指定して別のAPIを呼び出す。みたいなものがあった場合には、ワンタイムトークン自体は1つだけ発行されると思いますので、十分に活用できそうな気がします。



以上でTalend API Testerのテストは一通りできたかなと思います。
他にもシナリオという機能があったり、サービスという単位にAPIのRequestをまとめたりすることができるようです。

Freeで利用しているからなのか、シナリオ自体は1つしか利用できず、複数のシナリオを作り込むことができそうにないので、あまり活用できないかなと思っています。
（APIのテストとはいえ、シナリオは1つだけでなく、正常系の複数のシナリオに加え、異常系の複数のシナリオがあってもおかしくないと思うので、1つだけしか作れないシナリオで管理することは無いのかなぁと思ってます。）

他にも便利な使い方などがあれば教えていただけると幸いです。

## 環境変数（Environments）を活用する

上記までのRequestでは、共通している部分（Qiita APIのURIやQiitaのアクセストークンなど）がありました。
この部分を環境変数として定義し、実際に利用する時にはその変数を指定することが可能です。

画面右上のenvironmentsから環境変数を追加します。
ここでは2つの環境変数をサンプルで定義しています。定義内容は下図を参照。

<img width="1117" alt="スクリーンショット 2020-07-17 8.11.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/393ba72c-631f-96dd-cc48-7f1df2c0db5b.png">

Qiita APIのURIを`BASE_URI`という環境変数で定義したので、以下のようにURIを修正しています。

```
${"BASE_URI"}/authenticated_user/items
```

また、Qiitaのアクセストークンについては、`QIITA_TOKEN`で定義したので、HEADERSの定義を以下のように修正しています。

```
Bearer ${"QIITA_TOKEN"}
```

こうすれば、複数のRequestを作ったあと、Qiitaトークンを誤って削除して、全てのRequestが全部失敗するなんてことにはならずに済みます。

<img width="1117" alt="スクリーンショット 2020-07-17 8.13.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/775bdbf1-4e96-96bc-e819-1be24f726546.png">