はじめに
API開発では、実装だけでなく テストの作成や実行も重要な工程になります。しかし、テストケースを手作業で作成するのは時間がかかる場合があります。
そこで IBM Bob を利用し、自然言語の指示(プロンプト)からテストケースの生成・YAML形式のテスト定義生成を行い、API Connectで実行できるか検証しました。
また、API Hook を利用することで、外部からテストを実行できる仕組みも構築しました。
前提条件
- IBM API Connect の環境が利用可能であること
- IBM Bobが利用可能であること
今回使用したAPI
今回の検証では、現在時刻を取得するシンプルなAPIを対象にします。
このAPIは、こちらの記事で作成したものを利用しています。詳細はそちらをご確認ください。
実装手順
1. Bobでテストケースを生成
まず、Bobを利用してAPIのテストケースを生成します。
以下のようなプロンプトを使用しました。
「現在時刻を返却するAPI」のテストケースを生成してください。
正常系、異常系、パフォーマンステスト、セキュリティテストを含めてください。
Bobは、正常系・異常系を含むテストケースを生成しました。たとえば以下のような内容です。
TC-001: 正常なリクエスト
TC-101: API Key未設定
TC-104: 不正なHTTPメソッド(POST)
TC-105: 存在しないパス
このように、AIを使うことで基本的なテスト観点を短時間で洗い出すことができます。
テストケース例:
### 1. 正常系テスト
#### TC-001: 正常なリクエスト(有効なAPI Key)
**目的**: 有効なAPI Keyでリクエストした場合、正常にレスポンスが返却されることを確認
**前提条件**:
- 有効なClient IDが発行されている
- APIが正常にデプロイされている
**テストステップ**:
1. 有効なClient IDをヘッダーに設定
2. GET /time/current にリクエスト送信
**期待結果**:
- HTTPステータスコード: 200
- Content-Type: application/json
- レスポンスボディに以下のフィールドが含まれる:
- `timestamp`: ISO 8601形式の日時文字列
- `timezone`: "UTC"
- `message`: "Current system time retrieved successfully"
**検証項目**:
- [ ] ステータスコードが200である
- [ ] Content-Typeがapplication/jsonである
- [ ] timestampフィールドが存在する
- [ ] timestampがISO 8601形式である
- [ ] timezoneフィールドが"UTC"である
- [ ] messageフィールドが正しいメッセージを含む
- [ ] レスポンス時間が1秒以内である
2. BobでYAMLを生成
次に、Bobが生成したテストケースをもとに、IBM API Connect の Automated API behavior testing で利用できるYAML形式のテスト定義を生成します。
今回使用したプロンプトは以下の通りです。
以下のAPIテストケースを、IBM API Connect の Automated API behavior testing 用のテスト定義 YAML に変換してください。
要件:
- YAMLのみ出力する
- info, configs, steps を含める
- request step と assertion を含める
参考となる動作例:
info:
testName: Get System Time
version: 2
configs:
globalVariables:
basePath: basePath
domain: yourdomain.com
protocol: https://
inputs:
- default:
X-IBM-Client-Id: your-client-id
steps:
- type: request
method: get
url: '{{ protocol }}{{ domain }}/{{ basePath }}/current'
var: payload
mode: json
headers:
X-IBM-Client-Id: '{{ X-IBM-Client-Id }}'
- type: assert-equals
expression: payload_response_statusCode
value: "200"
API
[OpenAPI仕様のYAML]
APIテストケース
[テストケース仕様書のマークダウン]
Bobが生成したYAMLの一部は以下のようになります。
info:
testName: Get System Time API Test Suite
version: 2
configs:
globalVariables:
basePath: api base path
domain: api domain
protocol: https://
inputs:
- default:
X-IBM-Client-Id: your client id
steps:
# TC-001: 正常なリクエスト
- type: request
method: get
url: '{{ protocol }}{{ domain }}/{{ basePath }}/current'
var: tc001_payload
mode: json
headers:
X-IBM-Client-Id: '{{ X-IBM-Client-Id }}'
- type: assert-equals
expression: tc001_payload_response_statusCode
value: "200"
3. API Connectでテストを作成
「Add test suite」を選択し、テスト・スイートを作成します。

今回は 「最初から」 を選択し、Bobが生成したテストケースをもとにテストを作成します。

ここに、先ほどBobに生成してもらったYAMLのコードを貼り付けます。

そして、保存→実行 でテストを行います。
結果はこのように表示され、今回は全て成功していることが確認できました。

レート制限テストの追加
基本的なAPIテストに加えて、API運用ではレート制限などの制御も重要な観点になります。
そこで今回は、Bobにレート制限のテストケースも生成してもらい、HTTP 429(Too Many Requests)の動作についても検証しました。
その際に使用したプロンプトは以下の通りです。
レート制限(5リクエスト/時間)をテストするテストケースとYAMLを作成してください。
要件:
- 6回リクエスト → 6回目はエラー
- 60秒待機 → リクエスト → 200 OK(リセット確認)
- 再度10回リクエスト → 6回目以降は429エラー
IBM API Connect の Automated API behavior testing 形式で出力してください。
Bobが生成したYAMLの一部は以下のようになります。
steps:
- type: request
method: get
url: '{{ protocol }}{{ domain }}/{{ basePath }}/current'
var: tc106_request6
mode: json
headers:
X-IBM-Client-Id: '{{ X-IBM-Client-Id }}'
- type: assert-equals
expression: tc106_request6_response_statusCode
value: "200"
- type: request
method: get
url: '{{ protocol }}{{ domain }}/{{ basePath }}/current'
var: tc106_request7
mode: json
headers:
X-IBM-Client-Id: '{{ X-IBM-Client-Id }}'
- type: assert-equals
expression: tc106_request7_response_statusCode
value: "429"
# TC-107: 60秒待機後、カウンターリセット確認
- type: request
method: get
url: 'https://httpbin.org/delay/60'
var: wait_for_reset_tc107
mode: json
- type: request
method: get
url: '{{ protocol }}{{ domain }}/{{ basePath }}/current'
var: tc107_request_after_reset
mode: json
headers:
X-IBM-Client-Id: '{{ X-IBM-Client-Id }}'
- type: assert-equals
expression: tc107_request_after_reset_response_statusCode
value: "200"
その後、先ほどの 3. API Connectでテストを作成 の手順に従ってテストを作成します。
次に、API ConnectのUI上からレート制限の設定を行います。
開発を開き、作業するAPIを選択します。

ターゲット製品のレート制限 の 編集を押し、カスタムを設定します。

設定を保存して完了です。
APIテストへ戻り、テストを実行します。
補足
なお、API Connect(DataPower API Gateway)のレート制限は、設定値どおりに厳密に適用されない場合があります。4. API Hookを作成
次に API Hook を作成します。
API Hookを作成すると、外部からREST APIでテストを実行できるようになります。
API Test画面からSettings → API hooks and keysを開きます。

Hooksの追加ボタンを押し、Nameを設定しURLを生成します。

鍵も同様に、追加ボタンを押し、Nameを設定しKeyとSecretを生成します。

5. Hook URLからテストを実行
生成されたHook URLを利用して、外部からテストを実行します。
curl -X POST "<HOOK_URL>/tests/run" \
-H "x-api-key: YOUR_KEY" \
-H "x-api-secret: YOUR_SECRET" \
-H "Content-Type: application/json" \
-d '{"options":{"JUnitFormat":true}}'
実行すると、以下のようにテスト結果が返されます。
以下は実行結果の一部です。
[Test Step :0] request /time/current
[Test Step :1] statusCode equals 200
[Test Step :2] Content-Type equals application/json
[Test Step :3] timestamp is string
[Test Step :4] timezone is string
[Test Step :5] timezone equals UTC
テスト結果
テスト結果のサマリーは以下の通りです。
基本機能テスト実行結果
| 項目 | 結果 |
|---|---|
| 総テスト数 | 61ステップ |
| 成功 | 61 |
| 失敗 | 0 |
| 実行時間 | 約15秒 |
テストケース一覧
| ID | テスト内容 | ステップ数 | 結果 |
|---|---|---|---|
| TC-001 | 基本的な正常系テスト | 8 | ✅ |
| TC-002 | レスポンスフィールド検証 | 4 | ✅ |
| TC-003 | 連続リクエスト (3回) | 9 | ✅ |
| TC-101 | API Keyなし → 401 | 2 | ✅ |
| TC-102 | 無効なAPI Key → 401 | 2 | ✅ |
| TC-103 | 空のAPI Key → 401 | 2 | ✅ |
| TC-104 | POSTメソッド → 405 | 2 | ✅ |
| TC-105 | 存在しないパス → 404 | 2 | ✅ |
| TC-201 | 負荷テスト (10連続) | 20 | ✅ |
| TC-303 | CORS設定確認 | 2 | ✅ |
| TC-401 | レスポンススキーマ検証 | 5 | ✅ |
| TC-402 | 必須フィールド検証 | 4 | ✅ |
レート制限テスト実行結果
| 項目 | 結果 |
|---|---|
| 総テスト数 | 29ステップ |
| 成功 | 29 |
| 失敗 | 0 |
| 実行時間 | 約2分 |
テストケース一覧
| ID | テスト内容 | ステップ数 | 結果 |
|---|---|---|---|
| TC-106 | レート制限超過 → 429 | 16 | ✅ |
| TC-107 | レート制限リセット確認 | 5 | ✅ |
| TC-108 | 連続レート制限確認 | 14 | ✅ |
まとめ
今回は以下の流れでAPIテストを自動化しました。
- Bobでテストケースを生成
- BobでAPI Connect用のテストYAMLを生成
- API Connectでテストを実行
- API Hookで外部からテストを実行
AIを利用することで、テストケースの作成を効率化することできました。
また、API Hookを利用することで、CI/CDなどの外部ツールと連携したテスト自動化も可能になります。
API開発では実装だけでなく、継続的にテストを実行できる仕組みを作ることも重要です。
今回のように AIとAPI管理ツールを組み合わせることで、テスト作成と実行の両方を効率化できる可能性があると感じました。







