ASP.NET アプリケーションの過負荷試験を JMeter で行う。

ASP.NETJMeter の相性が悪い?

かどうかは知りませんが、「ASP.NET JMeter」とかで検索すると、ネガティブな記事が多いですね。まあ、ポストバックって機構がリクエストを投げまくるのが得意な JMeter とはちょっと相性悪そうですが、できないってことはない。

ポストバック画面での POST リクエストの勘所

EventValidation

ASP.NET でのセキュリティ対策の機構ですね。こいつのせいで、「無効なViewStateです」って言われる事多いですよね。ページが改竄されてたり、変なページからリクエスト飛んできてないかってのをチェックしてくれてるのはありがたいんですが、たまに余計な邪魔をしてくれてるような。。。

こいつは、ASP.NET が吐き出したページに以下のように入っていますね。

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="ここに入る" />
CSRF 対策系

ASP.NET には ViewStateUserKey もありますが、CSRF 対策としては不十分と言われる事も多いので自前でトークンを埋め込んでいる事も多いのではないでしょうかね。
弊社も入れているんですが、こいつもちゃんとしないと「攻撃だ」とはじかれちゃいます。まあ、ASP.NET 関係無いですね。

まずは雛形を作りましょう

正直 JMeter の設定を手動で作っていくなんてやってられません。

Web ブラウザの操作をそのまま記録する

記録コントローラと HTTP プロキシサーバーを使えば Web ブラウザでの操作をそのまま JMeter のテスト計画として生成できます。

ただし、ここで記録したものを実行しても残念ながら失敗してしまいます。

必要な値を抜いて雛形を加工する

つまり、上述したような値を各処理のレスポンスから抜いて、次のリクエストに渡す必要があります。

HTTP Request サンプラーの後処理に入れる

HTTP Request で GET やら POST の処理を行うと思います。(最初はさすがにGETかな)
その「後処理」に値を抜く処理を挟むわけですね。

XPath で抜く

「後処理」には「XPath Extractor」があります。
例として EventValidation の値

例)
//*[@id="__EVENTVALIDATION"]/@value
正規表現で抜く

お恥ずかしい話ですが、たまに XML Valid でないページになってしまっている場合があり、XPath がエラーになる場合があります。そんな時は正規表現で抜きましょう。
「後処理」の「正規表現抽出」を使います。

例)
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*)" />

この場合は「テンプレート」の値には「$1$」をいれればOKですね。

値をリクエストに乗せる

各リクエストの HTTP Request サンプラーにはすでに必要なリクエストパラメータが設定されていると思います。そこに抜いてきた値を入れていけばいいです。例えば
名前:__EVENTVALIDATION
値:${参照名}
という感じで設定しましょう。

ちょっとした事

ユーザー定義変数・ユーザーパラメータを使う

私の場合は検証環境・本番環境と複数のサイトにたいして実行する必要があったので、一気に書き換えられるように定義を残しておきました。

XPath正規表現で抜いた値はログに吐いて確認

先ほど「${参照名}」で抜いた値を入れると書きましたが、このままだと本当に抜けたかどうかはリクエスト結果をいちいち確認する必要があります。
JMeter はログファイルがあるので、そこに値を吐いておくとログファイルを tail しておけばすぐに確認できます。
ログファイルは jmeter.bat と同じフォルダにある jmeter.log です。

ログへの吐き方は先ほどのを「${__log(${参照名},,,ログに吐く際の名前)}」とすればOKです。値として入れてくれて、かつログに吐いてくれます。

まとめ

今は Visual Studio にもテスト用にエディションがあるので、ライセンスを持っている方はそちらを使えばもっと楽に過負荷試験も実施できるのではないかと思います。
JMeter は今回紹介した方法からさらに、For コントローラで繰り返しを書いたりと過負荷試験までの道のりは長かったりします。