Katalon StudioでAPIテストをやってみる - vol.01


> ここではKatalon Studio Verion 7.1.1を使ってる前提で話しを進めます。


> 参考資料から翻訳したり、一部抜粋したり、わかりやすいように若干表現変えてして記載

## APIテストとは何か？

APIテストはソフトウェアテストの中の統合テスト一部として、APIが期待通りに機能しているか確認する為に行います。

APIにはGUIがない為、APIテストはテスト対象のAPIへリクエストメッセージを送り、返ってきたレスポンスメッセージを検証する、というやり方で効率的に素早くアプリケーションのロジックをテストできます。

APIテストは自動テストとCI/CDプロセスにとって重要です。
なぜなら、短いリリースサイクルと頻繁な修正/変更にあまり影響されにくい為、
UI自動テストに比べて保守作業が少なく済むからです。

## APIテストの種類を知る

Katalon StudioでAPIテストを実施する前に、APIテストにはどんなテストの種類があるのか把握する。

#### バリデーションテスト

バリデーションテストはAPIが要件通りに正しく、効率よく動作していることを検証するテストです。

#### 機能テスト

機能テストはコードベース中の特定の機能テストののことも含んでいます。
これらの特徴は、APIが設計されたパラメーターの範囲内で適切に処理されているかを具体的なシナリオで確かめます。

#### End-to-end テスト

UIテスティングはユーザーインターフェースの為のAPIや、必要不可欠な部分のテストで定義されます。
一般的にテストはAPIテスト単体で行うのではなく、APIに結びつけられたインターフェースと結びつけて行う場合が多いです。
フロントエンドとバックエンド両方の健全性、使いやすさ、効率に関することをテスト結果から知ることができます。

#### 負荷テスト

負荷テストは一般的に、特定のユニットが開発完了した時や、全体が開発完了した時、実用的なものとして機能するかを確認します。

負荷テストはいつくなのシナリオを実行し、通常の状態とピーク状態の両方でパーフォーマンスを確認します。

* <strong>基準値：</strong>通常の使用で予想されるトラフィックでAPIをテストします。

* <strong>最大トラフィック：</strong>全負荷期間中にソリューションがそれらの要求に適切に応答することを確認するAPIテスト。

* <strong>過負荷テスト：</strong>最大能力をテストする。ピークトラフィックに10〜20％を追加してテストします。


#### ランタイム/エラー検出

このテストタイプはAPIを実際に実行し、APIのコードにエラーが発生しないかを確認します。
一般的にそれらは一つの側面にフォーカスします。

* <strong>モニタリング：</strong> コンパイルされたコードを実行時に様々な実装エラー、ハンドラーの失敗、その他固有の問題がないかがテストされ、セキュリティの問題は含まれていないかの保証も手助けされます。

* <strong>実行エラー：</strong>コードは有効なリクエストに対し、正しいレスポンスを表示し、また無効なリクエストに対し、失敗していることがわかるように示すことを確認する。

* <strong>リソースリーク：</strong> 無効または、一般的な不正のリクエストをAPIへ送り、メモリ、リソース、データや操作が不安定になったりリークしないかをテストする

* <strong>エラー検出：</strong>既知の障害シナリオを使用し、テストを行い、エラーが発生しないことを確認する

#### セキュリティテスティング

セキュリティテスト、侵入テストとファズテスト（後ほど解説）はセキュリティ監視プロセスの3つの要素になります。
APIの実装が外部の脅威から守られているか確認する為に使用します。

セキュリティテストには侵入テスト、ファイズテストに加えて、暗号化手法の検証、APIアクセス制限設計の確認なども含まれます。

#### 侵入テスト

侵入テストはAPIに関する特定の情報のみ与えられたユーザーが、APIとそのコンポーネント全体を狙い、機能、リソース、プロセスに関して、外部から攻撃し、評価します。

#### ファズテスト

ファズテストは大量のランダムデータをシステムに入力し、強制クラッシュ、またはネガティブな状態の動作を試すテストです。
このテストは最悪のケースのシナリオに備える制限に関してのAPIテストとして役に立ちます。

## Katalon StudioでAPIへリクエストを送る

1. File -> New -> Project を選択し、「New Project」ダイアログでTypeに「API/Web Service」を選択。任意の名前を付け、新規でProjectを作成する
![スクリーンショット 2020-03-16 15.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/2a58b6c2-074b-fe96-ec6d-f26e4636f200.png)


1. APIリクエストをまず作成する為、Test ExplorerウィンドウのObject Repositoryを選択し、New -> Web Service Request を選択 
![スクリーンショット 2020-03-16 15.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/1ca0de64-f548-98e8-a130-0b7511caa3c9.png)

1. 任意の名前を付け、対象のAPIのタイプを選ぶ（RESTful or SOAP）。URLにエンドポイントを記載し、OKをクリック
![スクリーンショット 2020-03-23 13.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/a77e012e-a53d-e21b-7016-917ed6fb22a2.png)


1. 新しいリクエストを作成後以下のような画面が表示されます
> ここではサンプルとして こちらのAPIへリクエストを送る手順を参考に説明を進めたいと思います。このAPIの仕様については、リンク先のドキュメントを参考にしてください
> [cat-facts](https://alexwohlbruck.github.io/cat-facts/docs/endpoints/facts.html)

![スクリーンショット 2020-03-23 14.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/d4c48ef4-a1fe-ca94-39ed-1310b79133f5.png)

5 パラメータを追加する場合は、Query Parameters の「Add」ボタンをクリックし、Nameにパラメーター名、Valueに値を入力するとURLへ自動的にパラメータと値が入力されます
![2020-03-23 14.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/d9f57030-fea3-1515-74ab-9bcd49f68220.png)



6 Methodを選択し、「Test Request」ボタンをクリックすると、APIへリクエストが送られます
![2020-03-23 14.44.55_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/81aaf363-64b1-a61c-eb8b-e55bc90a0aac.png)


7 リクエストを送り、しばらく待つと、Responseのウィンドウで、返ってきた内容が確認できます
![スクリーンショット 2020-03-23 15.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/a93ad7fc-0d58-538a-0742-0a45a7c97582.png)

ちなみに、
ログイン情報とかを追加してリクエストを送りたい場合は「Authorization」のタブより設定できます
![スクリーンショット 2020-03-25 11.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/7c4d55cf-1703-2f0d-cd4e-cb3e84ab4922.png)

同様に、Headerに設定を持たせたい時は、「HTTP Header」タブで
![スクリーンショット 2020-03-25 11.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/b6152092-9b9a-7cc1-97d5-d4f2b836d041.png)


## Katalon StudioでAPIからのレスポンスをテストする

APIへリクエスト送り、レスポンスを受けるとこまではできましたが、
これだけでは「テスト」になっていません。
レスポンスの内容を確認し「●●であること」みたいなことを確認しないとテストとしては成立しないからです。

ではそれをどうやるか？の手順です。

> APIへリクエスト送り、レスポンスを受けることまでができてる前提

例えば、「レスポンスが200のステータスコードで返ってきていること」をテストしたいとします。
その場合、

1. 「Verification」のタブを選択
![スクリーンショット 2020-03-25 11.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/811fd385-d49a-0662-43a2-f4b2a90e1e3d.png)


2. SNIPPETSの中の「Status code: Code is 200」をクリック
 ![QWEWQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/023e3ad3-d394-84f2-5983-5ab20c21d830.png)

3. 「レスポンスのステータスコードが200であること」を確認するスクリプトが追加されます
![zxcsaq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/68e7dc6d-df46-591c-f6df-9f900e23b8f8.png)

4. Test Request And Verify を選択し、APIへリクエストを送ります
![スクリーンショット 2020-03-25 11.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/6c259629-96ba-a625-9584-8db4774f0d98.png)

5. ResponseウィンドウのVerification Logタブで結果を確認できます。今回は200のステータスコードが返ってきてるので、テストの結果が「PASSED」になっていることが確認できます。
![スクリーンショット 2020-03-25 14.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/91a45581-a231-8b80-2f00-eebb26fa0bf1.png)

ちなみにわざと200のステータスコードが返ってこないように、失敗させてみると、このようにちゃんとFAILEDになっています。
![スクリーンショット 2020-03-25 14.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148127/7643b3bd-567e-7dcc-586e-8f254ae75573.png)


このようにステータスコードを確認するだけでなく、
レスポンスのbodyに特定の文字列が存在するか？、、、などクリック一つでテストスクリプトを追加できます。
詳細は[オフィシャルのドキュメント](https://docs.katalon.com/katalon-studio/docs/verification-snippets.html#list-of-available-verification-snippets)を参照してください。

次回はこれらのテストを具体的にどのようにテストケースとして運用していくか・・・について書きたいと思います。
つづく・・・（たぶん）

> 追記: 続いた
> [Katalon StudioでAPIテストをやってみる - vol.02](https://qiita.com/McLaren/items/dd09f7697948505c1346)

## 参考文献

* [API Testing 1 - Introduction and Getting Started](https://docs.katalon.com/katalon-studio/videos/katalon-api-introduction.html)

* [Introduction to API Testing](https://docs.katalon.com/katalon-studio/docs/introduction_api_testing.html#what-is-api-testing)

* [API Sample](https://alexwohlbruck.github.io/cat-facts/docs/endpoints/facts.html)