JMeter テストの作成方法

具体的な例がないとピンと来ないと思うので、簡単なシナリオに沿ってJMeterのどの構成要素を設定して、テストを作成いけばよいのかを解説していきます。 以下のようなWebシステムを想定して、負荷テストを行うための構成を行っていきます。

JMeterのテスト作成方法を理解する上で、事前に知っておくと理解が早まる重要な点を2点書いておきます。

  • 今回主に説明するテスト計画、スレッドグループ、サンプラー、ロジックコントーラという4つの構成要素の特性を理解して設定を行えるようになれば、効率的にテストを作れるようになるかと思います。
  • 実際に手を動かして設定を行い、手近なWebシステムに負荷テストをかけると理解を早まりますので、少しずつ設定を行い、都度負荷テストを動かしてみるのが良いかと思います。

使用したのは、JMeter バージョン5.1.1です。

テストのシナリオ

対象:図書館 書籍検索Webサイト

ユーザ①利用者(10人)
操作1: 書籍検索画面を開く
操作2: 書籍検索を実行
条件: 書籍検索結果が0件よりも多い場合のみ、以下の操作3を実行する
操作3: 書籍詳細画面を開く
ユーザ②司書(2人)
操作1: 管理者書籍登録画面を開く
操作2: 新規書籍を登録する

JMeterの主要な構成要素を使った概要図

今回設定するシナリオをJMeterの主要な構成要素(テスト計画、スレッドグループ、サンプラー、ロジックコントーラの4つ)に落とし込むと以下のような図になります。 f:id:moritamorie:20190609121913p:plain

各構成要素の解説し、実際に設定を行っていきます。

主要な構成要素①テスト計画

まず、JMeterの新規テストに作成すると「テスト計画」という構成要素ができます。 JMeterの「テスト計画」という構成要素には、テスト全体で使える変数(例えば、サイトドメイン名(www.test-library.com))や、テストが終わった後の後処理を行うかなどのテスト全体に関わる設定を行えるところです。 上記のシナリオだと「図書館書籍検索Webサイト負荷テスト計画」のような粒度になるので、この名前をテスト計画に付けます。

実際に、JMeterの画面で設定すると以下のようになります。 f:id:moritamorie:20190609134412p:plain

主要な構成要素②スレッドグループ

スレッドグループとは、同じ操作を行うユーザの人達のことです。今回の例では、 ユーザ①利用者(10人) ユーザ②司書(2人) がスレッドグループになります。

このスレッドグループには、テストの実行時間やスレッドの数、どのようにスレッドを起動していくかなど非常に重要な項目ばかりなので、設定内容とその動きを正確に理解しておく必要があります。

実際に、JMeterの画面で設定します。 「(テスト計画)図書館Webサイト負荷テスト計画」を右クリック=>「追加」=>「Thread Users」=>「スレッドグループ」を選択します。

f:id:moritamorie:20190616135734p:plain

  • 設定内容
    • スレッド数: 10
      • 並行してテストを実行するスレッドの数です。このシナリオでは利用者が10人なので「10」になります。
    • Ramp-Up 期間(秒) : 1
      • スレッドグループを起動完了するまでの期間です。詳細は後述します。この例では、スレードグループが10なので、1 / 10 = 0.1秒毎に各スレッドを起動する設定になります。
    • 全ユーザが同じタイミングで操作することはまずないのでしタイミングをずらすために設定しています。もし、同じタイミングで操作することを想定すると、サーバ負荷が集中するので実際の運用時の負荷と異なったテストになってしまいます。
    • ループ回数: 無限ループ
      • 各スレッド(ユーザ)が、一連の操作を繰り返し回数のことです。
      • 今回は、同じ負荷を長い時間かけ続けるテストを想定して、「無限ループ」にします。
    • スケジューラ設定
      • 持続期間(秒):10
        • 負荷テストを行う時間を設定します。
        • スケジューラ設定の持続時間を設定すると負荷テストの時間は、「ループ回数 ×スレッドグループの操作(これから設定するリクエストの一連の操作)1周分の実行時間」と「スケジューラ設定 - 持続時間(秒)」のうち短い方になります。

Ramp-Up期間の設定の動き

まず、上記のスレッドグループの設定で、テストを開始すると10スレッド(スレッドの数の分だけ)が生成されます。 f:id:moritamorie:20190609133006p:plain

Ramp-Up期間1秒の間に、全スレッドを起動するように各スレッドを起動していくため、図のように

  • テスト起動後に1つ目のスレッドを実行開始
  • 0.1秒後に2つ目のスレッドを実行開始
  • 0.2秒後に3つ目のスレッドを実行開始
  • 0.9秒後に10個目(最後)のスレッドを実行開始

という流れで、起動していきます。

また、今回は「無限ループ」の設定を行っているため、各スレッドが操作1〜操作3の一連操作を終わった後、同じ一連の操作を繰り返します。

主要な構成要素③サンプラー

作成したスレッドグループに対して、実際に行う操作を定義する「サンプラー」追加します。

実際のJMeterの設定ですが、「(スレッドグループ)利用者スレッドグループ」を右クリック=>「追加」=>「サンプラー」=>「HTTPリクエスト」を選択します。 f:id:moritamorie:20190609134941p:plain

ここでは、http://www.test-library.com/booksというURLの検索画面のURLにGETを送るというサンプラーを追加しています。

主要な構成要素④ロジックコントローラ

ロジックコントローラは、サンプラーの実行に条件を付けたり、繰り返し実行にする(サンプラーの実行フローをコントロールする)構成要素です。

今回のシナリオの中に、「利用者が書籍検索画面で書籍検索を行い、その結果が0件よりも多い場合に書籍詳細画面を開く」というものがありますが、 その中の「その結果が0件よりも多い場合に」の部分がロジックコントローラで定義する箇所になります。

JMeterでの定義方法が少し複雑なので、この点は他の記事で解説します。

simple-minds-think-alike.hatenablog.com

JMeterのテストの全体

ここまで解説した主な構成要素4つ(テスト計画、スレッドグループ、サンプラー、ロジックコントーラ)の概念が分かれば、JMeterで負荷テストを作ることは結構簡単になるかと思います。

参考までに、簡単な負荷テストを実施できるように、主な構成要素に少し追加してみると以下のようになります。

f:id:moritamorie:20190609140415p:plain

追加したJMeterの構成要素に関して少し補足します。

  • タイマ
  • 後処理
    • サンプラーで実行したリクエストのレスポンスの読み取りなどを行うことができます。
    • CSS (JQuery)の要素指定やXPath正規表現などの方法で対象の読み取る対象のDOM指定が可能です。
  • リスナ
    • 定義した各画面の操作を行った結果(リクエストの詳細(リクエスト、レスポンス)、時間、またそのグラフ表示など)を確認ことができます。
  • 設定エレメント
    • 各種設定(Basic認証のユーザ名・パスワード設定など - HTTP認証マネージャ、HTTPクッキーマネージャ、HTTPヘッダマネージャなど)を追加できます。

これで簡単な負荷テストの実施と、結果の確認はできる状態になったかと思います。 実際に設定して、テストを動かしてみると理解が進むと思いますので、手軽に実施できるWebサイトで試してみてください!