【Insomnia裏技】JMeterいらず!カスタムJSとNunjucksで実現する「超軽量・動的ペイロード生成」による簡易ストレステストの極意
テックリードの私たちが新しいマイクロサービスを立ち上げる際、必ず直面する壁が「APIの負荷・ストレステスト」だ。
「本格的な検証の前に、まずは数千件のリクエストを流してバリデーションやDBの挙動を見たい」「だけど、わざわざJMeterやk6の設定ファイルを書くのは面倒くさすぎる……」
そんな時、あなたの目の前にあるInsomniaだけで、その欲求をスマートに解決できるとしたらどうだろうか?
今回は、Insomniaの秘められたポテンシャルを極限まで引き出し、外部ツールなしで動的な大量データペイロードを生成し、簡易ストレステストを完結させる「現場で震えるほど役立つ裏技」を伝授しよう。
—
1. なぜInsomniaなのか?(JMeterを捨てる理由)
もちろん、本格的な分散負荷テストにはk6やLocust、JMeterが必要だ。しかし、開発初期のイテレーション速度が命のフェーズにおいて、以下のコストは開発スピードを大きく殺す。
- 外部ツールの学習コストと環境構築
- OpenAPI仕様からのテストシナリオ再定義の辛さ
- 認証トークン(JWT等)の動的な取得と引き回しの面倒臭さ
Insomniaであれば、普段のAPIデバッグで使っているコレクションをそのまま「ストレステストの踏み台」にできる。これから紹介する「Nunjucksテンプレート機能」と「プレリクエストスクリプト(Pre-request Script)」を組み合わせれば、無限にバリエーション豊かなダミーデータを自動生成し、APIを叩き続けることが可能になる。
—
2. 絶対に入れるべき神プラグイン
Insomniaの標準機能だけでも強力だが、テスト効率を爆上げするために以下のプラグインを導入しておこう。
1. `insomnia-plugin-nunjucks-date`
- タイムスタンプや日付の動的操作が劇的に楽になる。過去や未来のランダムな日時をJSONに埋め込む際に必須。
2. `insomnia-plugin-documenter`
- 生成したリクエスト群をチームメンバーに即座に共有・ドキュメント化するためのマストツール。
—
3. 開発スピードを劇的に高めるキーボードショートカット
プロフェッショナルはマウスを使わない。指先一つでテストの回転数を上げろ。
- `Ctrl + Space` (Mac: `Cmd + Space`):Nunjucksテンプレートのオートコンプリートを呼び出す。これが命綱になる。
- `Ctrl + Enter` (Mac: `Cmd + Enter`):リクエストの送信。
- `Ctrl + T` (Mac: `Cmd + T`):新しいタブを開く。
- `Ctrl + P` (Mac: `Cmd + P`):クイックオープン(リクエストや環境の横断検索)。
—
4. 【核心】カスタムJSテンプレートを活用した動的ペイロード生成の裏技
ここからが本題だ。Insomniaのプレリクエストスクリプトと環境変数、そしてNunjucksをハックし、「実行するたびに完全にランダムで巨大なペイロードを生成する仕組み」を構築する。
ステップ①:環境変数にジェネレーターを仕込む
まずは、Environment(環境変数)に、動的データを吐き出すためのJavaScriptスニペットを直接記述する……と言いたいところだが、Insomniaのプレリクエストスクリプト(JS)を活用するのが最もスマートだ。
対象のリクエストを選択し、「Pre-request Script」タブに以下のコードを流し込む。このスクリプトは、リクエスト送信の直前に走って「大量のランダムユーザーデータ」を動的に生成し、変数に格納する。
// Pre-request Script: 実行ごとに異なる巨大なペイロードを動的生成する
const { faker } = require(‘@faker-js/faker’); // ※Insomniaの環境によっては標準機能で代用
// ※今回は標準のMath等だけでロバストに実装する例
function generateRandomUser() {
const firstNames = [“Alice”, “Bob”, “Charlie”, “David”, “Emma”, “Frank”, “Grace”, “Hannah”, “Ian”, “Jack”];
const lastNames = [“Smith”, “Johnson”, “Williams”, “Brown”, “Jones”, “Garcia”, “Miller”, “Davis”];
const domains = [“example.com”, “test.org”, “sample.co.jp”, “api-load.net”];
const randomItem = (arr) => arr[Math.floor(Math.random() arr.length)];
const randomId = Math.floor(Math.random() 1000000);
return {
userId: `usr_${randomId}`,
username: `${randomItem(firstNames).toLowerCase()}_${randomItem(lastNames).toLowerCase()}_${randomId}`,
email: `${randomItem(firstNames).toLowerCase()}.${randomId}@${randomItem(domains)}`,
age: Math.floor(Math.random() 50) + 18,
metadata: {
loginCount: Math.floor(Math.random() 500),
tier: randomItem([“free”, “pro”, “enterprise”]),
lastActive: new Date(Date.now() – Math.floor(Math.random() 10000000000)).toISOString()
}
};
}
// 5件の配列データ(バルクインサート用など)を動的生成
const bulkPayload = {
batchId: “batch_” + Math.random().toString(36.substring(2, 11)),
timestamp: new Date().toISOString(),
users: Array.from({ length: 50 }, generateRandomUser) // 50件のオブジェクトを生成
};
// Insomniaの環境変数に一時保存し、Bodyから参照できるようにする
insomnia.environment.set(“DYNAMIC_BULK_PAYLOAD”, JSON.stringify(bulkPayload));
ステップ②:Body側で変数を受け取る
次に、リクエストのBody(JSON)側で、先ほどスクリプトが生成した変数 `DYNAMIC_BULK_PAYLOAD` を呼び出す。
{
“description”: “Insomnia Dynamic Load Test Payload”,
“data”: {{ _.DYNAMIC_BULK_PAYLOAD | safe }}
}
※ `| safe` フィルターを忘れるな。これを忘れるとJSONのダブルクォーテーションがエスケープされてしまい、サーバー側でパースエラー(400 Bad Request)を引き起こす。
ステップ③:チェーン実行(Chain Request)によるストレステストの自動化
Insomnia自体には本格的な「毎秒1000リクエスト」を発生させるスレッド機能はない。しかし、「Unit Testing」機能や、レスポンスを次のリクエストに引き渡すResponse Taggingを応用することで、数百件の連続リクエストをワンクリックで流し込む簡易ストレステストが成立する。
1. Unit Testingタブを開く。
2. テストスイートを作成し、先ほど作成した動的ペイロード生成リクエストをアサーション付きで複数定義する。
3. テストランナーを実行する。これにより、毎回異なるランダムデータを持ったリクエスト群がAPIサーバーへ浴びせられることになる。
—
5. ベストプラクティス:チーム開発で役立つ設定の共有化ルール
この強力なテストスイートを属人化させず、チーム全体の資産にするためのルールを明記しておく。
1. 環境変数の分離
`base_environment` には機密情報(APIキーや本番DBのURL)を含めないこと。動的生成スクリプト内で使用するヘルパー関数やダミーのスキーマ定義などは、Git管理されるコレクションファイル(`insomnia.yaml`)に含めてチーム全体で共有する。
2. YAML形式でのエクスポート・インポートの標準化
Insomniaの設定は、必ず v4形式のYAML でエクスポートし、リポジトリの `docs/api/insomnia` あたりに配置する。
以下に、チームで共有すべきベストプラクティス構成の `insomnia.yaml` のスニペットを提示する。
_type: export
__export_format: 4
__export_date: 202X-X-XXT00:00:00.000Z
__export_source: insomnia.desktop.app:v202X.X.X
resources:
- _id: req_loadtest_bulk_users
parentId: fld_load_tests value: application/json value: “{{ _.test_secret }}” — 外部の負荷テストツールを導入する前に、まずは手元のInsomniaでここまでやれる。 プログラミングの手を止めるな。ツールをハックし、開発のボトルネックをその手で粉砕せよ。
modified: 1680000000000
created: 1680000000000
url: “{{ _.base_url }}/api/v1/users/bulk”
name: “🔥 [LoadTest] Dynamic Bulk Insert”
method: POST
body:
mimeType: application/json
text: “{\n \”batchId\”: \”batch_{% timestamp %}\”,\n \”payload\”: {{ _.DYNAMIC_BULK_PAYLOAD | safe }}\n}”
preRequestScript: |
// チーム共通の動的データ生成ロジック
const count = 10;
const items = [];
for(let i=0; i
authentication: {}
metaSortKey: -1680000000000
isPrivate: false
settingStoreCookies: true
settingSendCookies: true
settingDisableRenderRequestBody: false
settingEncodeUrl: true
settingRebuildPath: true
settingFollowRedirects: global6. おわりに
プレリクエストスクリプトとNunjucksを使いこなせば、APIのバリデーションチェック、エッジケースのあぶり出し、そして簡易的なストレステストまで、すべてを日常のAPI開発フローの中にシームレスに組み込むことが可能だ。