JMeterの文字化けポイント3

コントローラ名に日本語使っていると,リスナーの結果ファイルで該当個所が文字化けして困ってたんだけど,出力形式をXMLからCSVに変えたら,そんだけで直っちゃった.
#あれ〜.o(・_・= ・_・)o キョロキョロ

CSVの方が2次加工しやすいから,これでいっか.
変更箇所は,jmeter.propertiesの以下の2点.

jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.timestamp_format=MM/dd/yy HH:mm:ss

JMeterの文字化けポイント2

とりあえず,URLEncoder.encode(str, "SJIS")でエンコードした文字列は問題なく動作する.
実際,JOrphanUtils.encode()をいつでも"SJIS"でエンコードするようにパッチ当てて試してみたらちゃんと動いたし.
#こんときは,送信パラメタの「Encode?」をチェックしておいた.


そうそう,正規表現抽出で,日本語引っこ抜く場合は,"(\w*)"ではなく"(.*)"のほうがいいみたい.


となると問題は,「HTTPプロキシサーバ」んときのデコードだけか...
APサーバ(WebLogic)もJavaで出来てんだから,URLDecoder.decode()の代替でなんかやってるはずなんだよね.
Tomcatで試してみて,あわよくばそのAPI引っこ抜いちゃる.:-D


(追記)大当たり!!catalinaのRequestUtilのURLDecode()だったらうまくデコードできた.
さっくり,JOrphanUtilsのdecode()をこれに差し替えて,万事OK.うひひ.
#( ゜д゜)ビンゴー


ps.
JMeterUtils.getProperties()で"jmeter.properties"の読み込みやってるみたいだから,気を利かせれば"jmeter.properties"にエンコード・デコードに使う文字コードを指定させることも可能だろう.


ps2.
そうそう,試用したJMeterのバージョンは2.0.2です.書くの忘れてた.

JMeterの文字化けポイント

なんで文字化けすんのかしらべてみたら,なんのことはない.JMeterってURLエンコードやデコードを"UTF-8"でやってるからなのね.そして犯人は,このヒトたち.

::URLエンコードしてるヒトたち::
HTTPArgument.getEncodedName()  (org.apache.jmeter.protocol.http.util)
HTTPArgument.getEncodedValue()  (org.apache.jmeter.protocol.http.util)
  EncoderCache.getEncoded(String)  (org.apache.jmeter.protocol.http.util)
    JOrphanUtils.encode(String, String)  (org.apache.jorphan.util)


::URLデコードしてるヒトたち::
HtmlParsingUtils.isAnchorMatched(HTTPSamplerBase, HTTPSamplerBase)  (org.apache.jmeter.protocol.http.parser)
HTTPArgument.HTTPArgument(String, String, boolean)  (2 usages)  (org.apache.jmeter.protocol.http.util)
  JOrphanUtils.decode(String, String)  (org.apache.jorphan.util)

JOrphanUtilsを呼んでるところで,しっかり"UTF-8"ってハードコードしてあった.:-D
#JDK1.4.x使うと標準APIのURLEncoderやURLDecoderを使うらしい.


んじゃ,この部分を"Shift_JIS"とか"Windows-31J"にすれば,やっつけパッチの出来上がりか?と思ってやってみたら,半分アタリで半分ハズレだった.
確かに日本語になるんだけど,一部びみょ〜に文字化けしてるところがある...


試しにWebブラウザがURLエンコードした文字列を,URLEncoder.encode(str, "SJIS")でエンコードしてみたら,こうなった.

元の文字列:対象データが見つかりません。
Webブラウザのエンコード結果:
  %91%CE%8F%DB%83f%81%5B%83%5E%82%AA%8C%A9%82%C2%82%A9%82%E8%82%DC%82%B9%82%F1%81B
URLEncoderの結果:
  %91%CE%8F%DB%83%66%81%5B%83%5E%82%AA%8C%A9%82%C2%82%A9%82%E8%82%DC%82%B9%82%F1%81%42

ありゃま結果違うでやんの.

このサイトとかで試してみると,エンコード結果は,Webブラウザとおんなじだった.
んで,不思議(?)なことに,このサイトだとどっちのエンコード文字列も正しくデコードできるんだよね.
ちなみに,URLDecoder.decode(str, "SJIS")で,Webブラウザエンコード文字列をデコードすると,

対象?fータが見つかりません?B

となった.URLエンコードなんか知るか〜.専門外じゃ.
#( ゜Д゜) ギャボー


とりあえず,もちっと賢い(?)URLエンコーダ・デコーダを見つけてくれば,やっつけパッチが作れそうだ.
#だれか教えてくり.


(追記)上記「Webブラウザの...」はIEエンコードした内容.Firefoxだとこうなった.

  %91%CE%8F%DB%83f%81%5B%83%5E%82%AA%82%A0%82%E8%82%DC%82%B9%82%F1%81B

JMeter

ただいま格闘中.昔使ってみたときとくらべて,UIも随分洗練されていて,結構ぐーな感じ.
どうにかクセを掴んできたんで,忘れないうちにメモ.

SSL(https)でテストするには?

jmeter.propertiesのjavax.net.ssl.trustStorejavax.net.ssl.keyStorePasswordを設定する.
手っ取り早く,JDK付属のcacertsを指定するのが吉(パスワードは"password"だった).

クライアント認証は必要ないからスルー.

テスト計画について

だいたいこんな感じにしとく.

HTTP リクエスト初期値設定」でテスト対象のサーバやプロトコル,ポートを設定する.
セッションクッキー使うから「HTTP クッキーマネージャ」をおいておく(特に設定いらない).
HTTP ヘッダマネージャ」は必要に応じて設置.今回は,User-Agent:を偽装する必要があったんで置いといた.


シナリオは「HTTPプロキシサーバ」使って記録すると便利.
「HTTPヘッダの取り込み」をONにすると,なんか調子悪かったので外しといた.その代わりに「HTTP ヘッダマネージャ」を置いてある.

あと,「挿入するパターン」と「除外するパターン」の使い方がわからんかった.:-(


プロキシが余計なリクエストも記録してうざいので「各グループの最初のサンプラーだけ保存」がお勧め.

動的なリクエストを組み立てるには.

スレッドごとに固定の値を用意するなら「ユーザーパラメータ」に登録しておけばいい.
ただこれ,100多重とかでも,全部手打ちで用意しないとダメなのかな?だとすると,ちと萎える.
FAQに書いてあった.→How do I use external data files to in my Test scripts?
ユーザーパラメータにこんな風なこと書けばいいそうだ.

名前ユーザー_1
user_id${_StringFromFile(user_id.txt)}
password${_StringFromFile(password.txt)}
user_id.txtやpassword.txtは,$JMETER_HOME/binに置いておく.中身はベタなテキストで,こんな感じ.

---user_id.txt---
11111
22222
33333

---password.txt---
pass1
pass2
pass3

日本語もOK.エンコードはプラットフォームのデフォルトで良いようだ(Win環境だとWindows-31J).


レスポンスに含まれる値を引っこ抜くには「正規表現抽出」を使う.
例えば,「検索画面 - 条件入力」の結果ページに

<input type="hidden" name="param_1" value="xxxxx">

ってのがあって,この 'xxxxx' を次のリクエストで使いたい場合は,こんな感じの「正規表現抽出」を用意する.

Response Field to check: Body
参照名: param_1
正規表現: <input type="hidden" name="param_1" value="(\w*)">
テンプレート: $1$
一致番号(0から乱数): 0
初期値: 

こうしとくと,以降のサンプラーで変数:${param_1}が使えるようになる.チェックボックスとか選択内容が複数ある場合も対応できるみたい.
Regular Expression Extractor


正規表現抽出」の設置場所は,スレッドグループ内のどこでもいいみたいだけど,わけわかんなくなるんで,値を引っこ抜きたいサンプラーの子供にしてる.


似たような要素に,HTML Link Parserってのもあったけど使いこなすに至らず.あと,__regexFunctionも.

リモートテスト

JMeterのサーバ(アタッカ?)は,クライアント(モニタ)より先に立ち上げとく.起動すんのは,jmeter-server.batを叩くだけ.
モニタ兼アタッカにする場合,ローカルでもjmeter-server.batを叩く必要あり.

いろいろややこしいから,同一マシン上でモニタとアタッカを立ち上げる場合は,それぞれ専用の$JMETER_HOMEを持ったほうがいいかも.


そんでもって,多重度について.
スレッドグループのスレッドが10,アタッカが2台だとしたら,どう分配すんのかな?って思ったら何のことは無い.10多重×2台で20多重になるだけだった.:-(
それと盲点が.${_StringFromFile(filename)}で外部ファイルを指定する場合,アカッタにそのファイルがないと動かなかった.
共有されるのはシナリオだけみたいね.
#キイタ?( ゜д゜)オクサン(゜д゜ )アラヤダワァ


これを逆手にとって,アタッカごとに内容が異なるファイルを置けば,多重度上げてもユーザ名がかぶったりしなくすることができる.
テストユーザが100人だとして,外部ファイルには10人づつ(1〜10, 11〜20, 21〜30みたいに)書いて,それぞれのアタッカ(1〜10とか)に分配.
でもって,多重度10で実行すれば100多重でのアタックとなるわけだ.

あと,ちとメンドイけどjmeter.propertiesのremote_hostsを書き換えて,アカッタの数を調整すれば多重度の調整にもなるぞと.
#ビンボ人は創意工夫が大事ね.:-P

その他

プロキシや実際のテストもそうなんだけど,日本語はバケる.でも,サンプラーにハードコードしたり,ユーザーパラメータに登録してある値は平気(なぜか「Encode?」をチェックしないとうまく行ってる).
なんで致命的ではない.


思いのほか良くできてるなぁ>JMeter