なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

JMeterでWARNレベルのログを出力する。

背景

JMeterは「アサーションコンポーネント」と「リスナーコンポーネント(シンプルデータライタなど)」「シンプルデータライタ」をつかってHTTPリクエストのテスト結果をログ出力できます。
しかし、JMeterコンポーネントには以下のデフォルト動作があります。

HTTPリクエスト

  • 20X以外のレスポンスが返ってきた場合、エラーとなる。そのため、以降のテストが実施できない。

シンプルデータライタ

  • HTTPリクエストがエラーになった場合、エラーログへ出力される。成功した場合、成功ログへ出力される。
  • エラーの場合は、アサーションコンポーネント(BSF Assertionなど)により任意の文字列を出力できるが、成功の場合は任意の文字列を出力できない。

よって、以下のことをやりたい場合は少し工夫が必要です。

例えば「失敗じゃないけど、20X以外レスポンスが返ってきた場合WARNレベルのログを出力しときたい」などのときです。

手法

HTTPリクエストで20X以外のレスポンスが返ってきても、以降のテストを実施できるようにする。

HTTPリクエスト後に「アサーション」を追加し、”Ignore Status”にチェックを入れます。これよりHTTPリクエストで20X以外のレスポンスが返ってきても、以降のテストフローが流れるようになります。
※注意)この設定にするとテストパターンに何も指定していないため、このHTTPリクエストは必ず成功扱いになります。
f:id:Namihira:20130929165525j:plain


アサーションが成功したときに、任意の文字列をログ出力するようにする

上記の対応でHTTPリクエストが成功するようになると、ログ出力が制限されます。
アサーションは失敗したときにどうするかしか記述できない。他の方法(JavaScriptなど)でできるとは思うが。。。)
例えば、「200以外だったら、"WARN"っていう文字列を出力したい(´Д`)」という時があります。そのような場合は以下のような「BSF Assetion」を追加することで実現できます。
※注意)上記の”Ignore Status”のアサーションよりも前に置く必要があります。後ろに置くと、20X以外でテストが終了してしまいます。
f:id:Namihira:20130929165708j:plain

説明をすると、

AssertionResult.setFailure(true);
で、アサーション自体をエラーにします。この一文はログ出力とは関係ないですが、JMeter上でエラーのマーク(結果が赤くなる)が付いて分かりやすいのでつけておきます。

AssertionResult.setFailureMessage("任意の文字列);
で、ログ出力に任意の文字列が出力できます。


ログ出力はいつもどおり「成功」のときに出す。

ログ出力については、「シンプルデータライタ」を使用して出力します。
f:id:Namihira:20130929165836j:plain

実際に実行してみる

存在しないサイト(Goooooogle.com)にアクセスしたのち、存在するサイト(Google.com)にアクセスするというテストシーケンスで動作を確かめてみます。
本来ならば、存在しないサイトへHTTPリクエストに失敗して、テストが終了してしまいます。
実行してみると、
f:id:Namihira:20130929170037j:plain
エラーになっても、以降のテストが実行されています。
ログについても、指定した文字列が出力先に出力されています。

  • ファイル:

f:id:Namihira:20130929163911p:plain

  • ファイルの中身:

f:id:Namihira:20130929163948p:plain

まとめ

JMeterを利用したテストにおいて、「リクエストがエラーになっても、テストを続行したい」「多少のエラーはWARNレベルでログ出力したい」ときの対応を記載しました。