API Connectのテスト自動化機能を使ってみた

# はじめに

今回は、API Connect v10で提供されているテスト機能について紹介します。v10では、API開発時のテスト・デバッグ機能や、テスト自動化の機能が提供されています。
この記事は、API Connect v10.0.3（API Gatewayモード）環境で検証しています。

今回は、API ManagerからシンプルなAPIを登録し、テスト機能を試していきます。
このAPIでは3種類のパスとメソッド（get /test1 , post /test2 , post /test3）を設定し、応答メッセージを分ける処理を実装しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/d411dd9d-1272-c491-c8cc-c5b5c2d3dd26.png)

# API開発におけるテスト機能

APIの開発が終わったら、状態をオンラインにすることでsandboxカタログにデプロイされ、テストタブからAPIのテストを実施することができます。
対象のAPIパス・メソッドを選択して任意のパラメーター・本文を設定してテスト送信を実施することができます。（sandboxカタログでは、テスト用のClient-IDが登録されていますので、アプリケーション登録・設定は不要となります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/9a93e81b-0003-1e42-0f66-1dc19e2dd38b.png)

テスト結果は、以下のように表示されます。
応答ステータス、レスポンスタイムと、応答タブから応答本文・ヘッダーを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/a668fe27-6e64-5685-73c8-5ec0b7854f8a.png)


応答タブのトレースでは、アセンブリのどこを通ったか確認することができ、また、この処理中の各コンテキスト変数にどのような値が設定されているかも確認することができます。この機能により、APIのアセンブリ処理実装やデバッグをスムーズに行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/8e51423a-47ec-be10-af48-1bbfe4087772.png)

# APIのテスト自動化機能

以前からテストの自動化機能としてクラウド提供されていた[API Connect Test and Monitor](https://www.ibm.com/jp-ja/cloud/api-connect/api-test)が、製品版のAPI Connectでも提供されています。
ただし、この機能を使用する場合は、アプリケーションの追加インストールが必要となります（[Installing the Automated API behavior testing application](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=connect-installing-automated-api-behavior-testing-application)）。

インストールされているとAPI Managerのホーム画面に「APIのテスト」メニューが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4650ec20-a99f-8dd8-bb72-d55956052169.png)

このメニューをクリックすると、ブラウザーの別タブとしてAPIテスト画面が表示されます。トップ画面では、テスト実行結果のサマリーや、テスト・スイート一覧、過去のテスト結果の一覧が表示されています。（テスト・スイートとは、複数のテスト内容の集まりです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/560837ca-57dc-c31a-d5c1-7bd0d2082a90.png)


## HTTP Client機能

まずは、HTTP Client機能です。こちらは、右上の「HTTP Client」から表示することができます。この機能は、API Managerのテスト機能と同様に、対象のAPIパス・メソッドへ任意のヘッダー・本文情報を設定して、リクエスト送信ができます。また、その結果も同じ画面から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/5008b310-9955-0f9a-8240-d2b5f0e36423.png)

この機能では、さらに、各API実行に関するHTTP Client送信の内容・結果を保存することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/359e65a0-133a-460c-f53d-dde3aaa5c59f.png)

保存された複数のHTTP Client送信内容は、左メニューに一覧化され、検索機能も利用可能です。
実際のプロジェクトでは、１つのAPIで正常系・エラー系など様々な条件でリクエストを実施することも多いかと思いますが、最初のリクエスト時にこちらに登録しておけば、再実行する際にスムーズに進めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/716fda1d-8a32-9ab3-3b63-fc0ad3e3dbe3.png)

## Generate Test機能

次にテストの生成機能について見ていきます。簡易的なAPIのリクエストや結果確認であれば、上記のHTTP Clientで十分ですが、実際のテストケースでは、より詳細な検証（例えば、応答本文の特定のフィールド値や、特定のヘッダー情報の検証など）が求められるかと思います。この機能では、このような検証要件に対応するための、テスト生性が可能となります。

「Generate Test」ボタンを押下すると、現在表示しているHTTP Client送信内容・結果に基づいてテストが生成されます。
テストの登録には、テスト・スイートという定義が必要になりますので、ここでは同時に作成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/25d3fed2-1a74-cd99-3bb0-23b0a04e1595.png)

以下のような形でテスト内容が自動生成されます。HTTP Client送信の内容・結果を正として、HTTPステータスの結果確認や、ペイロード（応答本文）の存在確認、本文の特定のフィールドの存在確認等が自動設定されます。
これらの検証内容は、あとから編集することも可能です。具体的な設定方法や、実施可能な検証方法（アサーション）については、[Knowledge Center : Assertion components](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=testing-assertion-components)をご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/bb373724-bfaf-634c-101e-2b720c4a8fa7.png)

このテストは、「Run Test」から実行することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4c00d5e6-4f16-ca69-6505-fe0c725b5d4c.png)

テスト結果は、以下のようなフォーマットのレポートとして提供されます。テストで、アサーションや、要求での問題の有無が確認できます。また、「See Request」から実際のHTTP応答内容を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/0f55356a-3ef7-cb96-a8ce-aed87aacf852.png)

以下は、テストの管理画面になります。
テスト内容を編集したり、削除したり、Publishすることができます。Publishすると、実行結果がAPI Test機能上にログとして残されたり、後述するAPI Hook機能で外部サービスからAPI呼び出しでテストを実行することができるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/874545ad-a8f3-e5eb-17c5-efcb43e79bbd.png)

同様のテストの作成手順で複数のテスト定義を登録していきます。以下は、１つのテスト・スイートに３つのテストを登録した例になります。
特定のテストを実行したり、または、「Run All」ですべてを実行することの可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/ccb77ee8-6aba-8225-d61a-583c272ff06c.png)

テストがPublishされ、実行されているとその結果がトップページに表示されます。
また、特定のテスト・スイート（ここではtest suite）のDashboardを表示することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/7eb027bf-9dfa-8be1-6f11-85ae802e2772.png)

このDashboardでは、以下のようにテスト・スイート内のテストの実施結果の詳細を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/1f16baec-0a0b-4798-0553-9568f4b972c3.png)


## API Hook機能

外部からRest APIでこのテスト機能を呼び出すための設定をしてみます。
右上の歯車アイコンをクリックするとAPI Hooks設定を表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/80cb9f3a-7ec8-3c35-8ffb-550fbd74e575.png)

次に左メニューの「HOOKS」をクリックし、API Hooksの「+ API Hook」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/18222e39-2762-d71d-13ef-b4d35d1ce116.png)

ポップ・アップ画面で追加するAPI Hookを選択します。ここでは、先述の手順で作成してきた「test suite」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/e9e6ec9b-f916-9a79-5a72-1aa1c1af119e.png)

Hook URLが表示されますので、コピーします。このURLは後から確認も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/0b2d8afb-10e9-5271-7568-26864500b6dc.png)

次に、API Hookで使用するKeyを登録します。Key/Secretは自動生成されますので、名前を設定します。
Secretは後から再表示することができませんので、ここでコピーする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/fa2b15e5-f71a-50cc-ac29-4f8c34798dc0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/ec9a5b49-c360-a516-943f-987151c9a148.png)

これで設定は完了です。

以下は、Curlからテストを実行した例です。
ここでは、すべてのテストを実行していますが、特定のIDやタグのテストのみ呼び出すことも可能です。
詳細は、[Knowledge Center : Using API Hooks](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=hooks-using-api) をご参照ください。

```
curl -ki -X POST \
    -H X-API-Key:b4d7cd2f-78cb-40d5-8cab-********** \
    -H X-API-Secret:3d3c6e0830c97c3ade0157418cc72e2ad10b2c1d4c2f86fb92996c********** \
    -H Content-Type:application/json \
    -d "
        {
          "options": {
              "allAssertions": boolean,
              "JUnitFormat": boolean
          },
          "variables": {
              string: string,
          }
        }
      " \
    https://cpd-cp4i.*****-*****-*****-*****f378ae819553d37d5f2ee142bd6-0000.eu-gb.containers.appdomain.cloud/integration/apis/cp4i/ademo-minimum/apitest/api/rest/v1/99d8d33f-c070-4422-abc5-16778580d517119/tests/run

HTTP/1.1 200 OK
Date: Tue, 25 Jan 2022 07:48:12 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Application-Context: application:docker:8443
Cache-Control: no-store
Pragma: no-cache
Set-Cookie: SYMPOSIUM_ID=C15DD08EC485092FFB52A3966A71E82E; Path=/integration/apis/cp4i/ademo-minimum/apitest; Secure; Http
Only
Server: ---
X-Frame-Options: SAMEORIGIN

[{"testRunId":"c3e79a28-33ea-4bfc-b24c-c1ce51ebfa9b","testId":"42fddbf5-6055-4897-9ba4-e0170d9dd01f","testName":"test case
 - get /test1","location":"local","initiated":"2022-01-25T07:48:12Z","duration":0,"status":"passed","reportUrl":"https://c
pd-cp4i.****-****-****-****7f378ae819553d37d5f2ee142bd6-0000.eu-gb.containers.appdomain.cloud/integration/apis/
cp4i/ademo-minimum/apitest/web/events/details/c3e79a28-33ea-4bfc-b24c-c1ce51ebfa9b?cid=1","results":{"warnings":0,"failure
s":0,"httpFailures":[],"criticalFailures":[],"assertions":[]}},{"testRunId":"fdac54c7-a503-4fdb-b9ac-861336633d67","testId
":"a88733ae-2292-4ce4-8a78-bb7220635f40","testName":"test case - post /test1","location":"local","initiated":"2022-01-25T0
7:48:12Z","duration":0,"status":"passed","reportUrl":"https://cpd-cp4i.****-****-****-6ccd7f378ae819553d37d5f2e
e142bd6-0000.eu-gb.containers.appdomain.cloud/integration/apis/cp4i/ademo-minimum/apitest/web/events/details/fdac54c7-a503
-4fdb-b9ac-861336633d67?cid=1","results":{"warnings":0,"failures":0,"httpFailures":[],"criticalFailures":[],"assertions":[
]}},{"testRunId":"3846552a-f6cd-4e24-980a-62b1f550c7ca","testId":"84d5aa6e-ee9b-4cf6-9bc1-d0aee8b69d4f","testName":"test c
ase post /test2","location":"local","initiated":"2022-01-25T07:48:12Z","duration":0,"status":"passed","reportUrl":"https:/
/cpd-cp4i.****-****-****-6ccd7f378ae819553d37d5f2ee142bd6-0000.eu-gb.containers.appdomain.cloud/integration/api
s/cp4i/ademo-minimum/apitest/web/events/details/3846552a-f6cd-4e24-980a-62b1f550c7ca?cid=1","results":{"warnings":0,"failu
res":0,"httpFailures":[],"criticalFailures":[],"assertions":[]}}]
```

Curlだと結果が見づらいですが、ファイル出力して整形してみると以下のようになります。
各テストの結果で問題が出ていないことを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/8ce16bb6-580c-8563-b153-af489162b500.png)




以上です。