JMeter 大量のURLを簡単に設定する方法
規模の大きなサイトに対して負荷テストを計画する際、ユースケースも多くなるため負荷テストのシナリオも複雑になります。
特に大規模なECサイトになると、商品数も多くなり、アクセス対象ページが1,000を超えることも珍しくありません。
大規模サイトに限りませんが、より現実に近い状況を作るため、複数のURLに対してランダムにアクセスさせるといったことは、当たり前のこととして考慮に入っていると思います。(JMeter ランダムにページ遷移させるを参照)
ところが、商品数が1,000以上あるようなサイトに対して、JMeterで設定しようとすると、
1,000個のHTTPサンプラーを登録する
ということになりますよね?
いやー、できなくはないですがさすがにキツイですよね。。。
対象ページが多い場合にはどうしたらいいのかお悩みの方、ご安心ください。
(今まで手で対応されてた方は朗報です)
われらがJMeterは便利な機能が揃っているので、そんな場合でも簡単に実現することが可能です!
というわけで、本日は対象ページが多い場合の設定方法について紹介したいと思います。
ページ数が多いサイトの対処法
アクセスするページが多い場合に問題になるのが「HTTPサンプラーの登録」です。
具体的には、パスの入力欄が一個しかないので、URL 1つに対してHTTPサンプラー 1つの登録となるため、URLの数だけHTTPサンプラーを登録することになります。
ところがこの問題は、
URLを外部ファイルで管理し、JMeterで読み込む
ことでHTTPサンプラーは1つの登録で実現できるのです。
JMeterにはCSVを読み込む関数が用意されているので、ここではCSVファイルを利用して説明します。
(なお、当然ですがアクセスしたいURLは何かで管理する必要があります。「ドメインを指定したらその配下のすべてのページにアクセスしてくれる」とまではJMeterではできません。今後の拡張に期待しましょう)
次に「ランダムにアクセスする」については、
数字をランダムに生成する関数を利用して、外部ファイルの行を指定する
ことで実現できます。
何をするのかについては理解いただけたと思うので、以降で具体的にどうするのか説明していきます。
設定方法
まずはCSVの準備ですが、ここではpenguinweb.netサイトすべてのページをアクセス対象とする例として説明していきます。
penguinweb.netのサイトマップから、すべてのURLをカンマ区切りで入力すると以下の様になります。
/,/1.html,/8.html,/14.html,/20.html,/33.html,/35.html,/50.html,/52.html,/57.html,/69.html,/97.html,/100.html,/113.html,/141.html,/167.html,/182.html,/186.html,/197.html,/207.html,/200.html,/213.html,/229.html,/233.html,/category/tawawa,/category/test,/category/php,/category/wordpress,/contact,/sitemap,/list,/contact-finish
ファイル名は「url.csv」としています。
CSVの準備ができたら、次はJMeterの設定です。
スレッドグループは、以下のとおりすべてのURLに対してアクセスするだけの負荷設定とします。(Ramp-upは好きな値にしていただければと思います)
- スレッド数:32
- Ramp-up:10
- ループ回数:1
続けて、HTTPサンプラーの設定です。
細かい説明は後で説明するとして、ひとまずWebサーバについてはテストサイトの情報を入力し、パスの箇所に、
${__CSVRead(url.csv,${__random(1 , 32))}
と入力します。
では、記述した内容について説明していきましょう。
パスのところに記述した文字列には「__CSVRead」と「__random」という2つの関数を利用していますので、そちらを説明すれば理解できると思うので、早速説明していきます。
まず__CSVReadですが、こちらはCSVを読み込む関数です。
第一引数にCSVファイルのパスを記述し、第二引数にCSVのカラム番号を指定します。
__CSVRead関数については、以前、「JMeter CSVファイルを読み込み値を参照する」で紹介していますので詳しくはそちらを御覧ください。
次に読み込んだCSVのカラムをランダムに指定します。
こちらには、ランダムに数字を生成する関数「__random」を使って__CSVReadの第二引数で実行させます。
ここで__random関数について説明します。
__random関数
JMeterには、__random関数というものが用意されており、引数は以下のとおりです。
${__random(【最小値】,【最大値】,格納する変数名)}
指定した最小値と最大値の範囲内でランダムに数字を生成してくれます。
今回は使っていませんが、第三引数にはランダムに生成された値を格納する変数名を指定できます(省略可能)
ここでは__random関数の引数に、最小値1、最大値32を指定します。
これにより、
__CSVRead関数で指定したCSVに対して、__random関数で取得した数字の行を指定して取得する
ということが実行されます。
と、ここまでがHTTPサンプラーに対する設定になります。
(最初に宣言したとおり、HTTPサンプラー1個です!)
実行後、「結果をツリーで表示する」のリクエストタブを確認すると、以下のとおりタブって実行されていることが確認できます。(もちろん、実行されていないURLや、一度しか実行されていないものもありました)
今回は少ないページ数でしたが、CSVに1,000個のURLを入力して、__random 関数の最大値を999にすれば、1,000ページに対してランダムアクセスが可能です。
(超便利です。初めて使った時は感動しました)
これで、商品数が1,000を超えるような大規模サイトでも安心ですね。
おまけ
CSVの中のURLを順番に一個づつ指定したい場合は、__random関数ではなく__counter関数を利用します。
具体的には、HTTPサンプラーのパスの箇所に、
${__CSVRead(url.csv,${__counter(FALSE))}
と入力します。
ここで、__counter関数について説明します。
__counter関数
__counter関数の引数は以下のとおりです。
${__counter(【対象のスレッドグループ】,変数名)}
第一引数の対象のスレッドグループがわかりづらいですが、スレッドグループ内で繰り返しでカウントしたい場合はTRUE、スレッド全体でカウントしたい場合の場合はFALSEを指定します。
第二引数には、カウントした値を格納する変数名を指定できます(省略可能)
ここでは、簡単なシナリオなので、スレッド全体でカウントするよう第一引数に「FALSE」を指定します。
また、今回の例では32ページ(CSVのカラムが32個)なのでスレッドを32にします。
(なお、第一引数を「TRUE」にした場合は、スレッドグループのスレッド数は1でループ回数を32にします)
実行し「結果をツリーで表示する」のリクエストタブを確認すると、以下のとおり実行されていることが確認できます。
ただし、ドメインが変わる場合にはHTTPサンプラーが必要になるので注意しましょう。
最後に
200〜300個のデータの置換作業は、「正規表現で置換プログラムを作るくらいなら手動で対応しても同じ」と言われ、せっせと手動対応したことがあります。
僕は、手動対応とプログラム開発とが同じ工数であるならば、迷わずプログラム開発を選択します。
理由は、対応後に細かい変更など入っても、そのプログラムを改修して使い回すことが可能だからです。
(手動対応の場合、作業マニュアルとして残りますが、変更が発生するとまた手作業が発生してしまいます)
また、残ったロジックは、別の案件で同じようなケースが発生したら少し改修を加えてまた使うことができるので、次に活かすこともできます。
プロジェクトが佳境の時は、目の前のタスクをこなすことが最優先されてしまいがちなので、未来を見据えた判断ができるようにしましょう。
コメント一覧
コメントはありません