JMeterをマスターする

ブラウザ操作ログから堅牢なテストシナリオへ

なぜ記録するのか?現実的なテストへの道筋

手動でWebテストシナリオを作成するのは時間がかかり、ミスも起こりがちです。JMeterのプロキシ経由でブラウザ操作を記録すれば、実際のHTTPリクエストの順序を正確に捉え、数時間ではなく数分で現実的なパフォーマンステストの土台を築くことができます。

1. ブラウザ操作
2. プロキシ記録
3. JMeterシナリオ
4. 洗練化

1. 記録プロセス:準備

記録機能の核となるのが「HTTP(S) Test Script Recorder」です。これはプロキシとして動作し、ブラウザとWebサーバー間の通信を傍受します。適切な設定が、クリーンな記録を得るための鍵となります。

  • Step 1:テスト計画のWorkbenchまたはスレッドグループに「HTTP(S) Test Script Recorder」を追加します。
  • Step 2:ポート(例: 8888)を設定し、記録したステップを保存する「ターゲットコントローラ」を選択します。
  • Step 3:レコーダーを開始します。JMeterが一時的なセキュリティ証明書(ApacheJMeterTemporaryRootCA.crt)を生成します。
  • Step 4:HTTPS通信を復号化するため、この証明書をブラウザの信頼された認証局にインストールします。
  • Step 5:ブラウザのプロキシ設定を、指定したポートのlocalhost(例: 127.0.0.1:8888)に向けます。

2. 効率的なシナリオ作成:ノイズの除去

記録直後のデータには、画像、CSS、JavaScriptファイルといった静的アセットへのリクエストなどの「ノイズ」が大量に含まれています。これらを除外することが、効率的で的を絞ったテストシナリオを作成する第一歩です。

フィルタリングにより不要なサンプラーが大幅に減り、サーバーサイドのロジックに集中したテストが可能になります。

3. よくある問題への対処:記録から堅牢なシナリオへ

記録されたスクリプトは単なる出発点です。信頼性の高いテストにするためには、動的なデータを扱い、ユーザー入力をパラメータ化し、検証を追加する必要があります。これらは最も一般的に直面する課題です。

問題:動的トークンとセッションID

多くのアプリケーションでは、セキュリティのために動的トークン(CSRFトークンやセッションIDなど)が使用されます。記録されたトークンは一度のセッションでしか有効でなく、再実行すると失敗します。

解決策:相関付け(Correlation)

「正規表現抽出」などの後処理要素を使い、サーバーのレスポンスから動的な値を抽出します。それを変数(例: `${csrf_token}`)に格納し、後続のリクエストで使用します。

問題:ハードコーディングされたユーザーデータ

記録には、ログイン時に使用した特定のユーザー名やパスワードがそのまま含まれます。複数のユーザーをシミュレートするには、これらの固定値を置き換える必要があります。

解決策:パラメータ化(Parameterization)

「CSV Data Set Config」要素を使用します。ユーザー情報を含むCSVファイルを作成すると、JMeterがそのファイルからデータを読み込み、各仮想ユーザーがユニークなデータ(例: `${username}`, `${password}`)でテストを実行できます。

問題:非現実的な実行ペース

デフォルトでは、JMeterは可能な限り高速にリクエストを送信しますが、これは実際のユーザー行動とは異なります。ユーザーは操作の合間に一時停止します(思考時間)。

解決策:タイマー

「トランザクションコントローラ」内に「一様乱数タイマ」などを追加します。これにより、ステップ間に現実的なランダムな遅延が挿入され、より正確な負荷プロファイルが作成されます。

問題:検証の欠如

ステータスコードが「200 OK」でも、ページが正しいとは限りません。サーバーが成功コードと共にエラーページを返す可能性があります。テストではレスポンス内容の検証が必要です。

解決策:アサーション(Assertions)

サンプラーに「Response Assertion」を追加します。ログイン後の「ようこそ、[ユーザー名]さん」や目的のページのタイトルなど、成功を確認するための特定のテキストが存在するかをチェックするように設定します。

4. シナリオの整理

記録されたリクエストがフラットに並んでいるだけでは、可読性が低く分析も困難です。関連するステップを「トランザクションコントローラ」でグループ化し、ユーザーの操作フローに沿った、クリーンで論理的な構造を作成しましょう。

整理前(記録直後)

  • GET /login
  • POST /login_handler
  • GET /redirect
  • GET /dashboard
  • GET /dashboard/data

整理後(コントローラ使用)

  • ログイン処理
    • POST /login_handler
  • ダッシュボード表示
    • GET /dashboard
    • GET /dashboard/data

5. 現実的なユーザー負荷のシミュレーション

タイマーを追加することで、サーバーへの瞬間的な過負荷を防ぎ、より自然なユーザーフローをシミュレートできます。このグラフは、タイマーがリクエストのペースを調整し、非現実的な初期スパイクではなく持続的な負荷を生み出す様子を示しています。

タイマーは、テスト期間を通じて安定した現実的な負荷パターンを作り出します。