開発初期のボトルネックを瞬殺!Insomniaで実現する「動的ペイロード」超簡易ストレステスト術
「APIの実装はできたけれど、本番同様の大量データや、ランダムな値が次々と送られてきたときに、このデータベース設計で本当に耐えられるだろうか……?」
開発の初期段階で、誰もが一度は抱く不安ですよね。本格的な負荷テストツール(JMeterやk6など)を導入すれば確実ですが、スクリプトを書く手間や環境構築のコストを考えると、「もっと手軽に、今使っているAPIクライアントだけでサクッとテストできたらいいのに」と思うのは当然です。
そこで今回は、美しく直感的なAPIクライアントとして大人気の「Insomnia」を使い、外部ツールを一切使わずに「動的ペイロード(ランダムデータ)の自動生成」と「簡易的なストレステスト」を完結させる裏技を伝授します。
この記事をマスターすれば、毎日のAPI開発とテストが劇的に楽になり、パフォーマンスのボトルネックを開発初期に「瞬殺」できるようになりますよ。一緒に一歩上のエンジニアリングへ踏み出しましょう!
—
1. なぜ「動的ペイロード」が必要なのか?
まずは、なぜテストにおいて「動的なデータ」がそれほど重要なのか、その本質を理解しておきましょう。
テスト時に毎回同じ固定のJSON(例:`{“name”: “test”, “email”: “test@example.com”}`)を送信していると、以下のような「見落とし」が発生します。
1. データベースの一意性制約(Unique Constraint)に引っかかる
- 2回目以降の送信で「すでに登録されています」というエラーになり、連続テストができない。
2. キャッシュの罠に嵌まる
- データベースやアプリケーション、あるいはCDNのキャッシュが効いてしまい、2回目以降のレスポンスが異常に速く見え、実際のパフォーマンスを測定できない。
3. インデックスの効き具合がわからない
- 数万件のランダムなデータが格納された状態でクエリを叩かないと、データベースのインデックス(Index)が正しく機能しているか、スロークエリが発生しないかを確認できない。
Insomniaのプレリクエストスクリプト(Pre-request Script)と、強力なテンプレートエンジンであるNunjucksを組み合わせれば、リクエストが送信される「直前」に、JavaScriptで超高速にランダムデータを生成し、それをリクエストボディに流し込むことができます。
—
2. 準備:Insomniaの導入と「Hello World」
まずは基本から。Insomniaをまだインストールしていない方や、基本的な使い方が不安な方向けに、最もシンプルな疎通確認(Hello World)までを解説します。
2.1 インストール
1. [Insomniaの公式サイト](https://insomnia.rest/) から、お使いのOS(Windows / macOS / Linux)に合ったインストーラーをダウンロードします。
2. インストーラーを実行し、画面の指示に従ってインストールを完了させてください。
2.2 最初の「Hello World」リクエスト
インストールが完了したら、まずはテスト用の無料API(JSONPlaceholder)を使って、疎通確認を行いましょう。
1. Insomniaを起動し、「Create」ボタンから新しい 「Request Collection」 を作成します(名前は「API Test Lab」など、お好きなもので構いません)。
2. コレクション内で 「New Request」 をクリックします。
- Method: `GET`
- URL: `https://jsonplaceholder.typicode.com/posts/1`
3. 「Send」 ボタンをクリックします。
右側のレスポンスパネルに、以下のようなJSONが返ってくれば、最初の動作確認(Hello World)は成功です!
{
“userId”: 1,
“id”: 1,
“title”: “sunt aut facere repellat provident occaecati excepturi optio reprehenderit”,
“body”: “quia et suscipit\nsuscipit…”
}
これで、Insomniaを自在に操るための土台が整いました。
—
3. 極意:プレリクエストスクリプトによる動的ペイロード生成
ここからが本番です。Insomniaの強力な機能であるプレリクエストスクリプト(Pre-request Script)を使って、送信するたびに内容が変化する「動的ペイロード」を作成します。
今回は、新規ユーザー登録API(POSTリクエスト)を想定し、以下のランダムなデータを自動生成してみましょう。
- ユーザー名(英数字のランダム組み合わせ)
- メールアドレス(毎回重複しない一意のアドレス)
- 年齢(18歳〜65歳までのランダムな数値)
Step 1: POSTリクエストの作成
1. コレクション内に、新しく 「New Request」 を作成します。
- Method: `POST`
- URL: `https://httpbin.org/post` (送信したデータをそのままオウム返ししてくれる、テストに最適なエンドポイントです)
- Body: `JSON` を選択します。
Step 2: プレリクエストスクリプトの記述
作成したPOSTリクエストのタブ一覧から、「Pre-request」 タブをクリックします。ここに、リクエスト送信前に実行されるJavaScriptコードを記述します。
以下のコードをコピー&ペーストしてください。初心者の方でも理解しやすいよう、丁寧なコメントを入れてあります。
// — 動的データ生成スクリプト —
// 1. ランダムな文字列を生成する関数
function generateRandomString(length) {
const chars = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’;
let result = ”;
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() chars.length));
}
return result;
}
// 2. 最小値と最大値の間でランダムな数値を生成する関数
function getRandomNumber(min, max) {
return Math.floor(Math.random() (max - min + 1)) + min;
}
// 3. 各種ダミーデータの生成
const username = `user_${generateRandomString(8)}`;
// タイムスタンプを混ぜることで、絶対に重複しないメールアドレスを作成
const email = `test_${Date.now()}_${generateRandomString(4)}@example.com`;
const age = getRandomNumber(18, 65);
// 4. 生成したデータをInsomniaの「環境変数(Environment)」に一時保存
// これにより、リクエストボディ側から {{ _.variable_name }} の形式で呼び出せるようになります
insomnia.environment.set("dynamic_username", username);
insomnia.environment.set("dynamic_email", email);
insomnia.environment.set("dynamic_age", age);
// デバッグ用ログ(Consoleに表示されます)
console.log(`[Dynamic Payload] Generated: ${username}, ${email}, ${age}`);
Step 3: リクエストボディ(JSON)へのマッピング
次に、生成した動的データをJSONボディに埋め込みます。「Body」 タブに戻り、以下のJSONを記述します。
{
“username”: “{{ _[‘dynamic_username’] }}”,
“email”: “{{ _[‘dynamic_email’] }}”,
“age”: {{ _[‘dynamic_age’] }},
“status”: “active”
}
> 💡 先輩のアドバイス:
> Insomniaでは、`{{ _[‘変数名’] }}` または `{{ _.変数名 }}` と記述することで、プレリクエストスクリプトや環境変数で設定した値を動的に呼び出すことができます(Nunjucksテンプレート機能)。
> `age` の部分は数値型として送信したいため、ダブルクォーテーション(`”`)で囲まないように注意してくださいね。
—
4. 精度高めの動作確認(1回実行テスト)
設定が正しくできているか、実際に送信してみましょう。
1. 画面上部(または右下)にある 「Console」(コンソール)を開いておきます(エラーが起きたときの原因究明に役立ちます)。
2. 「Send」 ボタンをクリックします。
3. 右側のレスポンスパネル(`httpbin.org` からの返却値)を確認します。
{
“args”: {},
“data”: “{\n \”username\”: \”user_aB3cD4eF\”,\n \”email\”: \”test_1697000000000_xYz1@example.com\”,\n \”age\”: 29,\n \”status\”: \”active\”\n}”,
“files”: {},
“form”: {},
“headers”: {
“Content-Type”: “application/json”,
…
},
“json”: {
“age”: 29,
“email”: “test_1697000000000_xYz1@example.com”,
“username”: “user_aB3cD4eF”,
“status”: “active”
},
…
}
送信するたびに、`username` や `email` の末尾、`age` の数値がランダムに変化しているのが確認できれば大成功です!
—
5. 応用:Runner機能を使った簡易ストレステストの実行
動的ペイロードの生成ができるようになったら、これを使って簡易的な負荷・ストレステストを行ってみましょう。Insomniaには、リクエストを自動で連続実行する「Runner」機能が搭載されています。
実行手順
1. 左側のサイドバーにあるリクエストが所属しているフォルダ(またはコレクション全体)の右側にある 「三点リーダー(…)」 をクリックします。
2. メニューから 「Run Folder」(または 「Run Collection」)を選択します。
3. テスト実行用の設定画面が表示されます。
- Iterations(反復回数): 何回連続でリクエストを送るかを設定します(まずは `50` や `100` などの小さな値から試しましょう)。
- Delay(遅延時間): リクエスト間のウェイト(ミリ秒)を設定します。負荷をかけたい場合は `0` または数十ミリ秒に設定します。
4. 「Start Test」 ボタンをクリックします。
これで、Insomniaがプレリクエストスクリプトを毎回実行しながら、完全に異なるペイロードを持つリクエストを指定回数分、超高速でAPIサーバーに叩き込みます。
データベースのコンソールやサーバーのログ、CPU使用率の監視画面を見ながらこのテストを実行することで、「どのあたりで応答速度が低下し始めるか」「デッドロックが発生しないか」を、開発の手元で手軽に炙り出すことができます。
—
6. 現場で震えるほど役立つ、プロの極限Tips
最後に、この手法を実際の開発現場で運用する際に、先輩エンジニアとして伝えておきたい「極意」を3つ共有します。
① インデックス(Index)の効き具合を必ず確認する
簡易ストレステストを実行しながら、データベース側で `EXPLAIN`(実行計画)を確認してください。生成された大量のランダムデータに対して、検索やソートを行うクエリが「テーブルフルスキャン(Full Table Scan)」を起こしていないかチェックします。初期段階でこれに気づけるかどうかが、プロダクション移行後の命運を分けます。
② 本番環境(Production)への誤送信を絶対に防ぐ
プレリクエストスクリプトやRunnerは非常に強力です。誤って本番環境のデータベースに大量のゴミデータを書き込まないよう、Insomniaの Environment(環境変数) 機能を使用し、テスト環境(Local / Staging)が選択されているときのみ実行されるよう、常に細心の注意を払ってください。
③ 複雑なデータ構造は「ダミーデータ生成ライブラリ」を模倣する
今回はシンプルな文字列結合でランダムデータを生成しましたが、プレリクエストスクリプト内では標準的なJavaScriptが動くため、配列を用意して `Array[Math.floor(Math.random() Array.length)]` のように記述すれば、「実在しそうな日本の住所」や「リアルな商品カテゴリ」なども簡単にシミュレート可能です。
—
まとめ
お疲れ様でした!
今回は外部ツールを使わず、Insomnia単体で動的ペイロードを生成し、簡易的なストレステストを行う手法を解説しました。
JMeterを立ち上げるまでもない、実装直後の「ちょっと試したい」という瞬間に、この手法は絶大な効果を発揮します。手元でサクッと負荷をかけ、ボトルネックを潰しておくことで、後のステージングテストや本番リリースでの手戻りは劇的に減少します。
技術の本質を理解し、手元のツールを120%使いこなす。そんなスマートな開発スタイルを、ぜひこれからの業務でも役立ててくださいね。
「この設定で動いた!」「開発中のAPIのバグをリリース前に検知できた!」といった嬉しい報告を楽しみにしています。ハッピーコーディング!