第1回:【負荷テスト】JMeterのシナリオ作成入門では、シナリオの作成方法について説明していきました。この全シリーズを読むことで、簡単なシナリオ作成はできる技術は身についていると思います。
しかしながら、いざオリジナルのシナリオを作成しようとすると、なかなか意図したとおりに動作しない場合があります。以前は動いていたのに久しぶりに動かすと動かないこともあります。この記事では、シナリオが想定通りに動作しないときの調査方法についてまとめていきます。
なぜ想定通りに動かないのか
想定通りに動かない原因は主に3つにわけることができます。
- 対象システムのセットアップがうまくいっていない
- JMeter側の設定が不足している
- そもそもJMeterでは動作させることができない
対象システムのセットアップがうまくいってない
サーバが起動していない、データに不備がある、システムのデプロイに失敗しているなど、対象システムのセットアップがうまくいっていないケースがあります。
対象のシステムが正常に動作しなければ、当然JMeterでも正しい動作はできません。
シナリオ作成はテスト環境で行うことが多く、未利用のときはインフラを停止させることが多くあります。必要なときのみ環境を起動させるため、起動したつもりが正常に起動していなかった、ということが起こりえます。
JMeter側の設定が不足している
必要なパラメータが送信できていない、送信しているパラメータの内容が不適切など、JMeter側のシナリオに不備があるケースがあります。
シナリオ作成上の問題なので、適切なシナリオ設定ができるようにしていく必要があります。
そもそもJMeterでは動作させることができない
javascriptを多少しているような場合はJMeterでは再現できない場合があります。
JMeterでも、BeanShellを使うことで疑似的にjavascriptの処理をまねることはできますが、トークン決済など複雑な処理をしているような場合は、JMeterでは再現できません。そのような場合は、スタブを作る、シナリオから除外する等の対処が必要になります。
具体的な調査方法
それでは、具体的な調査方法を書いてみます。私はこうやっている。という方法なので、もっとスマートな方法があるかもしれません。
大きな流れとしては次の通りです。
- ログビューアを確認する
- ブラウザで画面遷移してみる
- もう一度ブラウザで画面遷移してみる
- ブラウザとJMeterで、送信パラメータの比較を行う
ログビューアを確認する
まずは、JMeterで簡易的な設定ミスがないかログビューアを確認しましょう。オプションからログビューアを起動します。
オプション->ログビューア
ログビューアが起動したらシナリオを実行してみます。エラーメッセージが出ればエラー内容を解消させましょう。よくあるのは、ファイル指定をしている場合に、対象のファイルが存在しないケースです。特にエラーが出ないが、シナリオが実行されずに終了する場合は、どこかに不要な半角スペースなどが入っている可能性があります。
ブラウザで画面遷移してみる
次に、対象システムのセットアップが正しくされているかを確認するために、ブラウザから画面遷移をしてみます。画面遷移の前に開発者ツール(F12ボタンで起動)を立ち上げ、送信パラメータを控えておきましょう。
このときのポイントは、JMeterで指定している入力パラメータを合わせることです。「hoge1@denet.co.jp」というアカウントを使っているのであれば「hoge1@denet.co.jp」を使い、「彩のジェラートCUBE」を購入しようとしているのであれば「彩のジェラートCUBE」を購入します。
問題が起きるありがちなケースとしては、
- 登録したユーザが初期化されていなくなった
- 購入しようとした商品の有効期限が切れた
- 購入した商品が、「離島不可」など特定の条件では購入できない
などがあります。
ここで正しく遷移できればシステムのセットアップは問題なくできているので、次のステップへ進みます。
もう一度ブラウザで画面遷移してみる
「_csrf_token」のように、動的に変更になるパラメータを調べるために、もう一度同じ条件で画面遷移してみます。ここでも、送信パラメータを控えておきます。
前回控えた送信パラメータと比較し、異なる値が入っている場合は、動的に変わるパラメータとなります。動的に変わるパラメータは「正規表現抽出」で動的に設定してあげる必要があります。
たとえば、ECCUBEでログインを実行した場合は次のようになります。
name | 1回目のvalue | 2回目のvalue |
---|---|---|
login_email | hoge1@denet.co.jp | hoge1@denet.co.jp |
login_pass | hogehoge | hogehoge |
_csrf_token | PlhgRPIz1mNohgfXXXXX | dBkDbRt9q-7qsqXXXXX |
「login_email」と「login_pass」は同一ですが、「_csrf_token」は異なる値となっています。この場合「_csrf_token」は正規表現抽出で設定する必要があります。
参考->第4回:動的パラメータを取り込み、エラーを解消させる
ブラウザとJMeterで、送信パラメータの比較を行う
最後に、JMeterでシナリオ実行を行います。JMeterから送られている送信パラメータと、ブラウザで画面遷移した場合のパラメータを比較し、同等のものになっているかを確認します。
下の表の「login_pass」ように、ブラウザでは送信されていて、JMeterからは送信されていないものがある場合は、送信するように修正をしましょう。また、「flg」のように、送信されているが値が違うものは適切なものに合わせるようにしましょう。
ブラウザ | JMeter |
---|---|
login_email: hoge1@denet.co.jp | login_email=hoge1@denet.co.jp |
login_pass: hogehoge | |
flg: 1 | flg=999 |
_csrf_token: PlhgRPIz1mNohgfXXXXX | _csrf_token=dBkDbRt9q-7qsqXXXXX |
正規表現抽出を見直してみる
正規表現抽出で値が正しくとれていないと、RequestBodyに「_csrf_token=%24%7Bcsrf_token%7D」のような出力がされます。その場合は、正規表現抽出を見直す必要があります。
取得元のhtmlソースをエディタにコピーし、取得用正規表現で検索できるかを確認しましょう。具体的には、
<input type="hidden" name="_csrf_token" value="BATBP6EZhAkmT_ZU0donrO2RurtSB9Lj0a7KQ_lCNCs">
を
<input type="hidden" name="_csrf_token" value="(.*)">
で検索できるかを調べます。エディタは正規表現を使って検索できるものを利用しましょう。
ありがちなのは、「[]」などのエスケープ処理です。「\[」のようにエスケープがされていないと抽出できません。
まとめ
この記事では、シナリオが正しく動作しない場合の調査方法についてまとめていきました。
「対象システムのセットアップの確認」「入力情報の確認」をすることで、大概の問題は解決すると思います。地道な作業ですが、一歩一歩解決していきましょう。
↓ サンプルシナリオプレゼント中 ↓
サンプルシナリオのダウンロードはこちら
↑ サンプルシナリオプレゼント中 ↑
~~~~~~~~~~~~~~~~~~~~~
~ JMeterの負荷テストシナリオ作成入門 ~
~~~~~~~~~~~~~~~~~~~~~
第1回:【負荷テスト】JMeterのシナリオ作成入門
第2回:JMeterのインストールと初期設定
第3回:HTTPプロキシサーバーを利用したベースシナリオの作成
第4回:動的パラメータを取り込み、エラーを解消させる
第5回:リファクタリング実施
第6回:入力パラメータを外部ファイルから読み込む
第7回:負荷テスト用の修正を実施
番外編:EC-CUBE4の環境構築方法
番外編:シナリオが正しく動作しないときの調査方法