初心者でもわかる!JMeterを使ったWebシステムの負荷テスト入門

はじめに

Webシステムを導入する際や新機能を追加する際には、負荷テスト(性能試験) の実施が欠かせません。十分なテストを行わないと、アクセスが集中したときに 応答速度の低下やユーザビリティの低下 が発生し、最悪の場合はシステム停止やサービスダウンにつながる恐れがあります。その結果、エンドユーザーの離脱や信頼低下を招いてしまいます。

そこで役立つのが、オープンソースで利用できる 負荷テストツール「Apache JMeter」 です。JMeterを使えば、WebサイトやAPIに対して実際のアクセスをシミュレーションし、性能を測定したりボトルネックを特定したりすることができます。

この記事では、JMeter初心者向けに、インストール方法から基本的なテストプランの作成、結果の確認方法までをステップごとに解説します。

JMeter 概要

JMeterとは

Apache JMeter(ジェーメーター)は、Apache Software Foundation が開発・提供している オープンソースのパフォーマンステストツール です。JMeterを使うことで、システムに大量のユーザーが同時アクセスする状況をシミュレーションすることができ、応答時間・処理性能・安定性を確認できます。主な活用例は次のとおりです。

  • WebサイトやAPIに大量アクセスをシミュレーションし、レスポンス性能を測定
  • データベースやサーバーへの同時接続をテストしてボトルネックを特定
  • 高負荷時の安定性やシステムの限界値を確認

また、以下のような幅広いプロトコルやサービスに対して負荷テストを実施することが可能です。

  • HTTP / HTTPS
  • SOAP / REST API
  • JDBC(データベースへのクエリ負荷)
  • FTP / SMTP / JMS などのプロトコル

GUIモードとCLIモードの使い分け

JMeterには、GUI画面操作で利用するモードと、コマンドラインから利用するモードがあります。GUIモードの方が直観的に使いやすいですが、高い負荷をかけるには適していません。テストプランを作成する際にはGUIモードを使い、負荷テスト本番ではCLIモードに切り替えるのがベストプラクティスです。それぞれの特徴をご説明します。

GUIモード

GUIモード(Graphical User Interface mode)は、画面操作でJMeterを利用するモードです。
アイコンやツリー構造でテストプランを作成できるため、初心者でも直感的に操作できます。

主な用途は以下となります。

  1. テストプランの作成・編集
    ・ サンプラー(HTTPリクエストなど)やリスナーをドラッグ&ドロップで追加し、シナリオを構築。
    ・ パラメータや変数、スレッド数などを直感的に設定可能。
  2. テストシナリオのデバッグ
    ・ 単発のリクエストを実行し、レスポンス内容やステータスコードを確認。
    ・ GUI上のリスナーで「応答データ」や「グラフ結果」を見ながら、テスト設計を調整できる。
  3. テスト結果の可視化(開発・検証用)
    ・「グラフ」「表形式」「ツリービュー」などを利用し、レスポンスや処理時間をリアルタイムで確認可能。
    ・問題の切り分けやチューニングの初期段階に便利。

主な特徴は以下となります。

  1. 直感的操作
    ・初心者でも扱いやすいインターフェース。
  2. リソース消費大
    ・CPUやメモリ使用量が多いため、大規模な負荷テストには不向き。
  3. 開発・設計向け
    ・実運用での長時間テストや高負荷シナリオは非推奨。
  4. 補助的な役割
    ・本番の負荷テストはCUI(CLI)モードで実行するのがベストプラクティス。

CLIモード

CLIモードは、コマンドラインからJMeterを実行するモードです。リソース消費が少なく、大規模な負荷テストに向いています。

主な用途は以下となります。

  1. 大規模な負荷テスト
    ・GUIよりリソース消費が少なく、数千〜数万ユーザーを想定したテストが可能。
    ・本番環境に近いシナリオでのストレステストやスケーラビリティ確認に利用されます。
  2. 長時間の安定性試験
    ・数時間〜数日の耐久試験に最適。
    ・GUIでは落ちやすいテストもCLIなら安定して実行可能。
  3. CI/CDへの組み込み
    ・JenkinsやGitHub ActionsなどのCIツールから呼び出して、自動テストの一部として実行。
    ・デプロイのたびに負荷テストを回し、性能劣化を検知できる。
  4. 複数台分散テスト
    ・複数のJMeterサーバーを立ち上げ、マスターからCLI実行することで大規模分散負荷を実現。

主な特徴は以下となります。

  1. 軽量・高速
    ・GUIレンダリングや画面更新処理がないため、CPU・メモリ使用量を大幅に削減。
    ・大量リクエストでも比較的安定して動作。
  2. 自動化に適している
    ・コマンドラインからパラメータを指定可能。
    ・スクリプト化して定期実行や自動検証に活用できる。
  3. 結果出力が柔軟
    .jtl(XML/CSV形式)で詳細なログを出力可能。
    -e -oオプションでHTMLレポートを自動生成でき、可視化も容易。
  4. 実行環境を選ばない
    ・サーバーやDockerコンテナ上でもGUI不要で動作。
    ・CI/CDやクラウド環境との相性が良い。

JMeterのインストール方法

Javaの確認

JMeterはJava上で動作するため、まずJavaがインストールされているか確認しましょう。 今回はWindows端末を使用してJMeterによる負荷テストを実施します。コマンドプロンプトを起動し、以下のコマンドを実行してください。 Javaのバージョンが表示されれば問題ありません。

C:\Users\user>java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)

もしJavaが未インストールの場合は、OpenJDKやOracleJDKをインストールしてください。

JMeterのダウンロード

公式サイトからJMeterをダウンロードします。
Apache JMeter – Download Apache JMeter

最新バージョンのzipファイルをクリックしてダウンロードします。

ダウンロードできたら、ZIPファイルを解凍して任意のディレクトリに配置します。jmeter.batファイルを実行してください。以下の通りJMeterのGUI画面が表示されるはずです。

テストプランの作成

JMeterにおけるテストプランとは、負荷テストのシナリオ(ユーザ行動や業務要件に基づいたテスト計画)を、実際にJMeter上で負荷掛けするための具体的な設定となります。

テストプランに含まれる要素

  1. スレッドグループ(Thread Group)
    ・仮想ユーザー数(同時接続数)、リクエストの繰り返し回数、ランプアップ時間(負荷をかけ始めるスピード)などを設定。
  2. サンプラー(Sampler)
    ・実際に送信するリクエストを定義(例:HTTPリクエスト、JDBCリクエスト、FTPリクエストなど)。
  3. リスナー(Listener)
    ・テスト結果を確認・可視化するコンポーネント(例:結果をツリーで表示、グラフで表示、レポート出力など)。
  4. 設定要素(Config Element)
    ・共通の設定値(HTTPリクエストのベースURL、認証情報、CSVデータなど)を管理。
  5. 前処理/後処理(Pre-Processor / Post-Processor)
    ・リクエスト送信前にデータを整形したり、レスポンス後に特定値を抽出したりする。
  6. アサーション(Assertion)
    ・レスポンスが正しいかどうかを検証(例:HTTPステータス200を返すか、レスポンス本文に特定の文字列が含まれるか)。

シナリオサンプル

テストプランを作成する前に、まず「シナリオ」を明確にしておくことが重要です。以下は、私が運用している Web サイト(https://quiz.eeengineer.com/quiz/public)に対するシナリオのサンプルです。

■負荷テストの目的
同時接続 100 ユーザを想定し、1 秒あたり 50 リクエストが発生した場合に、応答時間が 2 秒以内に収まるかどうかを確認する。これにより、Web サイトの耐久性とパフォーマンスのボトルネックを把握することを目的とする。

■シナリオ
1. クイズ一覧ページにアクセス
2. 一覧からランダムにクイズ詳細ページへアクセスする
3. クイズ一覧ページに戻る

テストプランの作成

テストプランの名前を変更し、必要に応じてコメント欄に説明を記載します。

次にスレッドグループを作成します。
JMeterにおける「スレッド」とは仮想ユーザを意味し、「スレッドグループ」とはその仮想ユーザの集まりを指します。この項目で、どのような負荷をかけるかを定義します。

負荷の設定は以下の通りです。

  • Number of Threads (users):100
    仮想ユーザ数を設定します。ここでは100人の仮想ユーザが同時にWebサイトを利用する状況を想定しています。
  • Ramp-up period (seconds):30
    指定したスレッド数を何秒かけて起動するかを設定します。ここでは30秒かけて100スレッドが順次起動するようにしています。
    ランプアップを設定しない場合、すべてのスレッドが同時に起動し、サーバが急激な負荷を受けてCPUスパイクやDB接続数の上限に達し、想定したテストが正しく実施できない可能性があります。実際のユーザの利用状況を考慮し、徐々に負荷が高まるようにRamp-up時間を適切に設定することが重要です。
  • Loop Count:300
    1仮想ユーザあたりのリクエスト回数を設定します。ここでは、各ユーザが同じテストを300回繰り返す設定としています。
    「Infinite(無限)」を指定すると、手動で停止するまで負荷を継続させることも可能です。

続いて、HTTP Request Defaultsを設定します。テストプラン内の各HTTPリクエストサンプラーに共通する「デフォルト設定(初期値)」を一括で定義することが可能です。

HTTP Request Defaultsの設定は以下の通りです。

  • Protocol:https
  • Server name of IP: quiz.eeengineer.com

続いて、HTTPリクエストサンプラーを設定します。HTTPリクエストサンプラーとは、JMeterが実際に負荷テスト対象に対して通信を行うためのコンポーネントです。テストプランの中で「リクエストを発行する本体」にあたります。

HTTPリクエストサンプラーの設定は以下の通りです。クイズの一覧を表示します。

  • メソッド:GET
  • Path:/quiz/public

次は、個別のクイズを表示させるサンプラーを作成します。ランダムに1~5の数値を指定して、各クイズ画面にアクセスさせる設定を行います。

まず、ランダムな数値を指定するために CSV Data Set Config を設定します。

CSV Data Set Config に指定する設定は以下の通りです。

  • Filename:quiz_ids.csv
    テストプランの設定ファイルであるjmxファイルと同じフォルダに格納します。
  • Variable Names:quizid
    ランダム値を割り当てる変数を指定します。

CSV Data Set Configの設定ができたら、サンプラーを指定しましょう。

  • メソッド:GET
  • Path:/quiz/public/${quizid}
    先ほど指定した変数 quizid を指定します。

個別クイズのページを見終わったら、クイズ一覧に戻ります。

続いて、Constant Throughput Timer を設定します。1秒あたりのリクエスト数(スループット)を一定に保つためのタイマーです。つまり、負荷テストで「どのくらいのリクエストを毎秒送りたいか」を制御するためのコンポーネントです。

Constant Throughput Timer の設定は以下の通りです。

  • Target throughput (in samples per minnutes):3000
    1秒間に50ユーザからリクエストを受けることを想定しています。60秒において、50×60 = 3000 のスループットを発生させます。
  • Calculate Throughput based on :all active threads
    全てのスレッド(=仮想ユーザー)の合計リクエスト数でスループットを制御する指定となります。

続いて、Duration Assertion を設定します。Assertionとは、テスト結果が正しいかどうかを判定する仕組みのことです。Duration Assertionは、レスポンス時間んお上限を設定するAssertionとなります。

Duration Assertionの設定は以下です。

  • Apply to:Main Sample and sub-samples
    すべてのsampleを指定します。
  • Duration in milliseconds:2000
    2000 ms 以内にレスポンスが返ってきているかどうかを判定します。

負荷テストにおいて発生させる処理の設定は以上です。続いて、テスト結果を表示させるための設定を追加しましょう。Listenerという項目の設定例を記載します。

Summary Reportを追加します。

続いて、Response Time Graphを追加します。

テストプランの設定は以上となります。作成した設定を保存しておきましょう。

テストプランの実行

GUIモードにおけるテストプラン実行

それではいよいよテストプランを実行します。まずはテストプランが正常に実行されるかどうか、GUI画面から実行して確認します。下記にあるとおり、緑色のStartボタンを押下します。

Summary Report を確認します。Error % が高くなっていなければ、問題なくテストが実行できているはずです。Error % が高くなっている項目があったら、各種設定を見直してください。

Response Time Graph > Graph を押下してください。下記の通りレスポンスタイムのグラフが時系列で表示されます。

CLIモードにおけるテストプラン実行

GUIにて正しくテストが実施できることが確認できたら、CLIで実行してみましょう。Windowsユーザの方は、コマンドプロンプトから下記コマンドを実行して下さい。

C:\Users\user>cd C:\Users\user\Desktop\apache-jmeter-5.6.3
C:\Users\user\Desktop\apache-jmeter-5.6.3>
C:\Users\user\Desktop\apache-jmeter-5.6.3>"bin\jmeter.bat" -n -t "quizapp-performance-test\quizapp-performance-test.jmx" -l "quizapp-performance-test\result.jtl" -e -o "quizapp-performance-test\report"
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
Creating summariser <summary>
Created the tree successfully using quizapp-performance-test\quizapp-performance-test.jmx
Starting standalone test @ 2025 Oct 5 08:00:49 JST (1759618849935)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary +    318 in 00:00:10 =   31.8/s Avg:   405 Min:   269 Max:  1499 Err:     0 (0.00%) Active: 34 Started: 34 Finished: 0
summary +   1517 in 00:00:30 =   50.7/s Avg:   454 Min:   267 Max:  4382 Err:    11 (0.73%) Active: 100 Started: 100 Finished: 0
summary =   1835 in 00:00:40 =   45.9/s Avg:   445 Min:   267 Max:  4382 Err:    11 (0.60%)
summary +   1489 in 00:00:30 =   49.6/s Avg:   434 Min:   267 Max:  2347 Err:     9 (0.60%) Active: 100 Started: 100 Finished: 0
summary =   3324 in 00:01:10 =   47.5/s Avg:   440 Min:   267 Max:  4382 Err:    20 (0.60%)
summary +   1510 in 00:00:30 =   50.3/s Avg:   439 Min:   264 Max:  1654 Err:     0 (0.00%) Active: 100 Started: 100 Finished: 0
summary =   4834 in 00:01:40 =   48.3/s Avg:   440 Min:   264 Max:  4382 Err:    20 (0.41%)
summary +   1488 in 00:00:30 =   49.7/s Avg:   412 Min:   264 Max: 21039 Err:     1 (0.07%) Active: 100 Started: 100 Finished: 0
summary =   6322 in 00:02:10 =   48.7/s Avg:   433 Min:   264 Max: 21039 Err:    21 (0.33%)
Terminate batch job (Y/N)? Y

C:\Users\user\Desktop\apache-jmeter-5.6.3>
  • “bin\jmeter.bat”
    JMeter の実行ファイル(Windows用バッチファイル)です。このファイルを実行すると、JMeter が起動します。
  • -n
    Non-GUI モード(非GUIモード) で実行するオプション。画面を開かずにコマンドライン上でテストを実行します。
  • -t “quizapp-performance-test\quizapp-performance-test.jmx”
    テストプラン(.jmxファイル) を指定します。quizapp-performance-test.jmx は、GUIモードで作成したテスト定義ファイルです。
  • -l “quizapp-performance-test\result.jtl”
    実行結果(JTLファイル) の保存先です。JMeterが各サンプラーの結果(レスポンス時間・ステータスなど)をこのファイルに書き出します。後でレポート生成やグラフ作成に使われます。
  • -e
    HTMLレポートを自動生成する オプションです。(JMeter 3.0 以降で利用可能)
  • -o “quizapp-performance-test\report”
    レポート出力先フォルダです。-e とセットで使います。指定したフォルダに、HTML形式のレポート(グラフ付きダッシュボード)が出力されます。

レポート確認

result.jtl に各リクエストの実行結果(経過時間、ステータスコード、リクエストサイズなど)が記録されます。

また、reportも合わせて作成されています。reportディレクトリのindex.htmlをクリックしてください。以下のようなレポートが出力されます。

まとめ

本記事では、Apache JMeter を使った Web システムの負荷テストの基本を、インストールからテストプラン作成、実行、レポート確認まで一通り解説しました。

特に、負荷テストを行う上では以下のポイントを押さえることが重要です。

  • Ramp-up設定 により、現実的な負荷上昇を再現する
  • Assertion を活用して、レスポンスの品質を定量的に評価する
  • 結果レポート(HTML出力) により、ボトルネックを可視化して改善につなげる

性能試験は一度きりで終わるものではなく、開発・リリースごとに継続的に行うことで真価を発揮します。JMeterを活用した負荷テストを、継続的な品質向上の仕組みとして取り入れることで、性能トラブルの未然防止とシステムの安定稼働につなげていきましょう。

コメント