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"にエンコード・デコードに使う文字コードを指定させることも可能だろう.
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.trustStore
とjavax.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--- 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