IBM API ConnectのOAuthエンドポイントへリクエストするJMeterテスト計画を作成してみた

#はじめに
API ConnectではOAuth 2.0でAPIを保護することができます。OAuthでは、用途に応じて複数のエンドポイントが提供され、様々なエラーケースが考えられるため、一連のテストを手動で行う場合には負荷がかかってしまいます。この記事では、この一連のテストを自動化するために作成したJMeterテスト計画を紹介します。


#前提と準備

今回のテスト計画では以下のような前提を置いてテスト計画を作成しています。なお、稼働確認は、API Connect v10.0.1.2の環境で行っています。

**1. サポートされるタイプ**

このテストケースは、アクセスコードの権限付与タイプで、機密（コンフィデンシャル）のクライアント・タイプを前提に作成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4225c703-d54b-b35c-8792-40ebb15f1cee.png)





**2. リソース・オーナーの認証・許可設定**

今回はOAuthエンドポイントのテストが目的としているため、リソース・オーナーの認証・認可方式はシンプルなケースを想定しています。
許可エンドポイントにおいて、ID抽出は「基本認証」とし、許可設定は「認証済み」としています。以下がOAuth Providerリソースの設定例を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/fb9ef6f8-b7d7-932f-bc81-95b6419af77d.png)


**3. トークン設定**

このテストケースには、トークンの有効期限によるエラー検証が含まれているため、有効期間を短く設定しておくことが推奨となります。
サンプルでは、アクセス・トークンとリフレッシュ・トークンの有効期限を5秒、同意の最大を10秒としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/c3f1facb-9825-a7b0-d6e4-bda2ddbdb99e.png)


**4. トークン管理設定**

このテストケースには、トークンの失効によるエラー検証が含まれているため、OAuth Providerリソースにトークンの管理設定をしておく必要があります。
サンプルでは、トークン管理はネイティブ（DataPowerで失効管理）することを前提としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/163aa562-185c-054b-2556-04df0b267b74.png)


#JMeterテスト計画の紹介

##JMeterシナリオファイル

[JMeter](https://jmeter.apache.org/)でテスト計画を作成しています。バージョンは5.4.1で検証しています。
今回、作成したテスト計画は[GitHub](https://github.com/RyotaNarita/jmeter-sample/blob/main/Script_OAuth-Response-Message-Check.jmx)で公開しています。
JMeterからファイルを開くと以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/0031773b-f22b-958c-237a-fe7d6ef42aec.png)


##テストシナリオ

サンプルには、以下のようなテストシナリオを含めています。

* テストケース0　～正常終了ケース～
    * 0.1 認可コードの要求
    * 0.2 トークン発行
    * 0.3 アクセストークンを使用してAPI呼び出し
    * 0.4 アクセストークンのリフレッシュ
    * 0.5 アクセストークンの失効
    * 0.6 リフレッシュトークンの失効
* テストケース1　～認可コード発行エラーケース～
    * 1.1 正常終了
    * 1.2 redirect_uri不正
    * 1.3 scope不正（合致しない）
    * 1.4 scope不正（データなし）
    * 1.5 response_type不正
    * 1.6 client_id不正
    * 1.7 URL不正
    * 1.8 HTTPメソッド不正
* テストケース2　～トークン発行エラーケース～
    * 2.1 正常終了
    * 2.2 code不正
    * 2.3 redirect_uri不正
    * 2.4 code不正（パラメーターに含まれない）
    * 2.5 Content-Type不正
    * 2.6 grant_type不正
    * 2.7 Authorization不正
    * 2.8 URL不正
* テストケース3 ～その他のトークンエラーケース～
    * 3.1 有効期限切れトークン時のAPI Call
    * 3.2 有効期限切れリフレッシュトークン時のトークン発行
    * 3.3 同意時間期限切れ時のAPI Call
    * 3.4 同意時間期限切れ時のトークン発行
    * 3.5 失効済みトークン使用時のAPI Call
    * 3.6 失効済みリフレッシュトークン使用時のトークン発行

##ユーザー定義変数

お使いの環境によって環境変数を設定する必要があります。
以下のような変数を設定していますので検証環境に合わせて設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/86eb3e98-a85d-e6f6-bba1-395070442171.png)

##テスト実施例

テストを開始するとシナリオに沿って各APIが呼び出されます。
結果をツリーから確認することで、個々のテストケースの応答データを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4eed13bc-d0c2-ae78-abbc-fc826c29d811.png)


また、各テストケースの結果は、応答コード・ヘッダー、Bodyをファイル出力していますので、そちらから確認することもできます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample ts="1622712465835" s="true" lb="1.1 Valid" rc="302" rm="Found" tn="Thread Group (OAuth Auto Test ) 1-1" dt="text">
  <responseHeader class="java.lang.String">HTTP/1.1 302 Found
Connection: close
Transfer-Encoding: chunked
APIm-Debug: false
User-Agent: Apache-HttpClient/4.5.12 (Java/1.8.0_161)
X-Client-IP: 192.168.106.**
X-Global-Transaction-ID: 65587a5960b8a09100050***
X-RateLimit-Limit: name=default,100;
X-RateLimit-Remaining: name=default,96;
Location: https://example.com/redirect?code=AAJxRg5VxzVBAtEHy6QwQYEc5j1a_IwGESAfJUE2K-n60Za__3iRK_2rifmFBJA-B81tyGcu6vbQbJYBb-HBP***
Content-Type: text/xml
Date: Thu, 03 Jun 2021 09:27:45 GMT
</responseHeader>
  <responseData class="java.lang.String"></responseData>
</httpSample>
```

以上です。