eyemovic inc.

Works blog仕事の取り組み・ビジョン

2015.06.03

JMeterを使い倒す

こんにちは、システム制作の小阪です。

ラッシュテスト、シナリオテストに何かと役立つJMeter。

今回は、そんなJMeterをうまーく使って様々なテストを行うための方法をお伝えいたします。

 

目次

  ◯基本編

  接続編

  応用編

  最後に

 

◯基本編

■JMeterについて

まず、JMeterの簡単なご紹介を過去記事から。

JMeter

主に負荷テストに使用するツールです。

設定の自由度が高く、パラメーターやヘッダーを編集してやれば、かなり柔軟なテストが可能になります。
環境とシナリオさえ用意してしまえば、ボタンひとつでテストが動作する手軽さも素敵です。
一連のシナリオを作成して、エラーチェック用途としても使用可能です。

今回はJMeterを用いて、ラッシュテストとシナリオテストを行ってみたいと思います。

自由度が高く、一見難しそうなツールですが、実はよく使う項目は少なかったりします。

また、その自由度の高さから便利な使い方も数多くあります。

 

■画面について

それでは、最初に基本の画面から見て行きましょう。

 

①テスト計画
 – 実行されるイベントを追加していきます

②イベント設定エリア
 – イベントの設定を行います。
   イベント事に表示内容や設定項目が異なります。

③再生ボタン
 – テストを開始します
   ショートカットキーは Ctrl + R

④箒ボタン
 – 終了したテスト結果を破棄します
   ショートカットキーは Ctrl + E

ごちゃっとしたUIですが、とりあえずは上記3つほど覚えておけば簡単なテストは実行出来ます。

また、ここでのテスト結果とは、リスナーと呼ばれるイベントに記録される結果になります。

リスナーの結果は、明示的に削除しない限り溜まり続けますので、テスト毎に削除するようにしましょう。

 

■とりあえず使ってみる

ということで、早速ですがラッシュテストをサクッと作ってみましょう。

シナリオはテスト画面にイベントを追加することで内容を充実させていきます。

基礎編_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_基礎編_jmx__-_Apache_JMeter__2_12_r1636949_ 5

こんな感じになりました。

単一ページに対して単純なラッシュテストを行う場合、これだけでも十分テスト足りえます。

それでは、各イベントの内容を簡単に説明していきます。

スレッドグループ
 – テストプランの最初の要素で、これの中にテストプランを作成していきます。

HTTPリクエスト
 – HTTPでのリクエストを行います。WEB関連のテストではこれをメインで使いますので覚えておきましょう。

結果をツリーで表示
 – リスナーの1つで、リクエストの結果を表示します。テスト時に500エラーが出ていないか?などの確認に使え、レスポンスの確認もできる便利なやつです。

Summary Report
 – リスナーの1つで、応答時間の分布、スループットの確認などができます。ラッシュテストのお供に。

リクエストで実行先を作成し、リスナーでテストの結果確認という流れです。

様々なテストが可能ですが、基本的には上記の流れを組みます。

 

各イベントの作成方法は、元となるイベントを選択後に右クリックまたは編集メニュー追加から選択します。

スレッドグループ
 – テスト計画 > Threads(Users) > スレッドグループ

HTTP リクエスト
 – スレッドグループ > サンプラー > HTTP リクエスト

結果をツリーで表示
 – スレッドグループ or HTTP リクエスト > リスナー > 結果をツリーで表示

Summary Report
 – スレッドグループ or HTTP リクエスト > リスナー > Summary Report

リスナーはスレッドグループ単位やリクエスト単位の結果表示も行えます。

ページ毎にテスト結果が欲しい場合は、リクエスト単位でリスナーを作成しましょう。

また、リスナー関連のみ「スレッドグループ or HTTPリクエスト」のような書き方をしましたが、これ以外にも作成元になれるイベント、作成可能な子イベントはたくさんあります。

自由度はかなり高いので、いろいろと試してみましょう。

 

 

◯接続編

次に、ちょっと特別な使い方をしてみましょう。

特別な環境に対してテストを掛ける場合にも有用なイベントが多く用意されています。

うまく活用してみましょう。

 

■Basic認証を抜ける

Basic認証をかけているページに対しても、テスト可能です。

テスト計画を右クリックし、認証マネージャを追加します。

テスト計画 or スレッドグループ > 設定エレメント > HTTP 認証マネージャ

 

認証マネージャが追加されたら、設定を埋めていきます。

①基底URL
 – 対象の基底URLを指定します。
   基底URL以下のURLに対して、認証用のログイン情報を送信します。

②ユーザー名
 – ユーザー名を入力します。

③パスワード
 – パスワードを入力します。

複数登録することも可能ですので、ドメインごとに認証情報を分けることも出来ます。

これでBasic認証が掛けられているページに対してもテストを行うことが出来ます。

 

 

■ヘッダー、クッキーの付与

ヘッダーやクッキーの情報も付与することができます。

ヘッダを追加するには、テスト計画を右クリックし、HTTPヘッダマネージャを追加します。

テスト計画 or スレッドグループ > 設定エレメント > HTTP ヘッダマネージャ

 

クッキーはHTTPクッキーマネージャを追加です。

テスト計画 or スレッドグループ > 設定エレメント > HTTP クッキーマネージャ

 

Basic認証と同様に、値を埋めていきましょう。

まずはヘッダーから。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_

①ヘッダー名
 – ヘッダー名を入力します。

②値
 – ヘッダーの値を入力します。

APIサーバー構築時のテストなどに効果を発揮すると思います。

 

次にクッキー情報を。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949__と_チャットワーク_-_マイチャット

①名前
 – クッキー名を入力します。

②値
 – クッキーの値を入力します。

③ドメイン
 – クッキーが有効なドメインを指定します。
   複数ドメインに対してアクセスする際に使用します。

④パス
 – クッキーが有効なパスを指定します。
   パス毎にクッキーを変えることが出来ます。

認証周りで都合を合わせたい場合などにも役立ちます。

 

 

◯応用編

それでは、少し凝った使い方をしてみましょう。

主にテストケースなどで使用すると効果を発揮すると思います。

まずは、こんなphpファイルを用意しました。

iam.php


 – 5人のユーザーを配列で持っていて、POSTでidを与えるとそのユーザーの情報をJSON形式で表示します。

shout.php

 – POSTで与えられたserifを表示します。

 

想定されるシナリオはこんな感じです。

  • iam.phpにPOSTリクエストでidを渡す
  • JSONのレスポンスからserifを抜き出す
  • shout.phpへPOSTリクエストでserifを渡す
  • shout.phpのレスポンスを確認する

JSONを返すAPIを叩くような想定で、そのレスポンスを使用して次のリクエストへと繋げるようなシナリオです。

このシナリオを元に、テスト計画を作成してみました。

 

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_

今回は各イメージの説明をしていきます。

 

まずは最初の、スレッドグループ

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949__と_トーヨーマテラン_-_matelan_matelan_sakura_ne_jp_-_FileZilla

スレッドグループでは、スレッドグループ以下のイベント実行回数の設定が行えます。

今回行うのはシナリオテストなので、1回のみ動作すればいいものとします。

各プロパティは下記のようなイメージです。

スレッド数
 – スレッドの数を設定します。
   同時接続数と言えばわかりやすいでしょうか。

Ramp-Up期間
 – ループを実行する感覚を設定します。

ループ回数
 – シナリオの実行回数を設定します。

 

Ramp-Up期間というのがとっつきにくいかもしれません。

例を挙げるとすればこんな感じでしょうか。

スレッド数:10
Ramp-Up期間:10
ループ回数:10

→10秒間の内に、同時接続数が10のテストを1回実行する。

…無理やり文章化するとこんな感じでしょうか。

この辺りの設定は感覚なので、実際に試してみたり、他の詳しく解説されているサイトを見てみるのがオススメです。

 

次にループカウンタ

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 3

ループカウンタは、テスト内で使用できる変数を設定することが出来ます。

「参照名」で設定されているのが変数名になり、JMeterの各イベントで参照することができます。

プログラマーにはお馴染みfor文で記載すると、こんな感じになります。

 

次はHTTP リクエスト

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 4

WEBのテストを行う場合の必需品のようなイベントですね!

何気に「基本編」で使用していましたが、今回はリクエストの値に注目してみましょう。

「リクエストで送るパラメーター」の値ですが、

${id}

となっていますね。

これは先ほどループカウンタ設定したidを参照しています。

このように変数を利用することで、テストの幅がグッと広がります。ガンガン使用していきましょう!

 

そして次の正規表現抽出で、レスポンスから値を抽出します。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 5

 

設定は以下のようになっています。

 

参照名:serif
正規表現:“serif”:”(.*)”
テンプレート:$1$

これは、

レスポンスから正規表現に当てはまる値を抽出して、参照名に値を当て込んでいる

という感じです。

今回のレスポンスはJSON形式で返されるので、これでセリフを取得できるのです。

 

さて、ループカウンタや正規表現抽出を利用して変数を取得したはいいものの、

「実際どんな値が入っているかわからないじゃない!」って思いました?

そんな時に便利なイベントが、Debug Samplerです。

 

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 6

Debug Samplerは設置するだけで効果を発揮します。

各変数の値を確認したいタイミングに設置しましょう。

値の確認はリスナーで確認できます。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949__と_commit-corpration-babystory_-_NetBeans_IDE_8_0_1

idとserifの値が確認できました。

うまく取得できているようです:)

 

それでは最後に、テストの結果を見てみましょう!

今回はiam.phpからセリフを取得して、shout.phpに表示させるという内容でした。

ですので、shout.phpにセリフが表示されていればOKです!

では、リスナーの結果をツリーで表示から確認してみましょう。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949__と_commit-corpration-babystory_-_NetBeans_IDE_8_0_1 2

「Yeah!」出ましたね!

iam.phpのid=1の結果ですので、成功です!

 

それでは次の結果、id=2の場合です。

こちらも同様のイベントから確認してみましょう

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 9

「Hooo!」出ましたね!

id=2のセリフが表示されています、テストは成功ですね!

 

 

さて、これでシナリオテストは完了しましたが、最後におまけをもうひとつ。

BSF Listenerを紹介します。

テスト計画_jmx___Applications_apache-jmeter-2_12_bin_scenario_blog_テスト計画_jmx__-_Apache_JMeter__2_12_r1636949_ 7

このイベントは、プログラムをそのまま書いて利用することができるのです。

java、perl、rubyや、その他聞いたことないような言語も使用できます!スゴイ!

 

今回書いたプログラムはこんな感じです。

sampleResult というクラスを利用していますが、これはJMeter内で使用できるクラスになります。

sampleResult.getResponseDataAsString() と長いメソッドは、名称から読み取れる通り、結果を文字列で取得することが出来ます。

その文字列をJSONでパースして、vars.put()関数で変数に入れ込んでいます。

プログラムで書けるので、ただでさえ高い自由度が、さらに上がりましたね!

 

その他のクラスはこちらから参照できます。

う〜ん、かなり種類が豊富ですね。。さすがJMeter。。

 

 

◯最後に

JMeterの便利な使い方を紹介しようと思いましたが、かなり長い記事になってしまいました。

これだけ書きましたが、JMeterの機能の1/10も紹介できていないなぁ・・と感じています。

それだけ自由度が高いです、このJMeterは!

自分も使用していない便利な機能など、まだまだありますので、

積極的に使っていき、是非とも使いこなしていきましょう!

 

愛媛県松山市でWeb開発一筋15年、700サイト以上の構築実績!

Webサイト制作・システム開発・スマホアプリ開発・組込ソフトウェア開発ならアイムービックにお任せ下さい。