負荷テストのシナリオを考えた時に、例えば検索画面で検索を行い、その結果に表示される件数が0件でなければ、詳細画面(検索結果の最初の1件目)に遷移するなどの条件に応じたシナリオのテストを作る必要が出てくるかと思います。
そのようなシナリオのテストは、JMeterの「HTTPリクエスト(サンプラ)」、「CSS Selector Extractor(後処理)」と「IFコントローラ(ロジックコントローラ)」という構成要素を使うことで実現できます。
今回も以下の図書館 書籍検索Webサイトの例で、実際の設定を行っていきます。(例の詳細はJMeter テストの作成方法を参照してください。)
使用するJMeterのバージョンは、5.1.1です。
[目次]
- 書籍検索を実行 - HTTPリクエスト(サンプラ)
- 書籍検索の結果から件数を取得 - CSS Selector Extractor(後処理)
- 書籍検索の結果を条件に操作を変える - IFコントローラ(ロジックコントローラ)
- Debug Sampler(サンプラ)
- 結果をツリーで表示(リスナ)
- うまく変数に値が入らなかった時に確認すること
- 参考資料
書籍検索を実行 - HTTPリクエスト(サンプラ)
まずは、HTTPリクエスト(サンプラ)書籍の検索を行います。以下のようにHTTPリクエストを設定します。
以下の設定で、検索を行うことができることを想定しています。
- プロトコル
- GET
- URL
- http://www.test-library.com/search (※ドメインは、テスト計画のユーザ定義変数で設定済)
- リクエストパラメータ
- content=ruby
書籍検索の結果から件数を取得 - CSS Selector Extractor(後処理)
次に、書籍検索結果を取得するために、CSS Selector Extractorを追加します。
作った「(サンプラ)書籍検索する」を選択 => 右クリック => 「後処理」 => 「 CSS Selector Extractor」を選択します。
設定内容
- Apply to
- CSS Selector Extractor Implementation
- 参考資料によるとさほど違いがないようなので「JSOUP(デフォルト)」にしておきます
- 参照名
- ロジックコントローラで参照する変数の名前「search_result_count」
- CSS Selector expression
CSSセレクタの調べ方
WebブラウザはChromeを使っているので、Chromeを使ったCSSセレクタの調べ方を書いておきます。
CSSのセレクタを調べたい要素の上にマウスカーソルを移動し、右クリック => 「検証」を選択し、Chrome developer toolsを起動。 Elementsタブの該当のHTMLタグ上で右クリック、「Copy」 => 「Copy Selector」でCSSセレクタをコピーします。
※今回はCSS Selector extractorを使ったテストの定義方法を記載しましたが、XPath Selector extractorを使った場合は「Copy Xpath」を選択します。 抽出方法は、CSSセレクタ、XPathの他に正規表現という方法もあります。
書籍検索の結果を条件に操作を変える - IFコントローラ(ロジックコントローラ)
IFコントローラを追加して、条件分岐を行ってみます。
また、条件がマッチした場合の操作(サンプラ)を、IFコントーラの下に配置します。
設定は以上です。正しく動いているかを確認するために、以下の「Debug Sampler (サンプラ)」、「結果をツリーで表示(リスナ)」を追加してみます。
Debug Sampler(サンプラ)
結果をツリーで表示(リスナ)
「(テスト計画)図書館Webサイト負荷テスト計画」を選択し、右クリック => 「追加」=> 「リスナー」=> 「結果をツリーで表示」を選択し、テストの実行結果を見れるようにします。
テストを実行すると以下のように変数の内容を確認可能です。
うまく変数に値が入らなかった時に確認すること
上記の結果ツリー表示の画面で、変数が適切に設定されていなければ、リクエストの「応答データ」を確認し、想定したレスポンスが返っているか確認します。
もし、想定していないレスポンスが返っていなければ、その原因調査・対応します。原因は色々ありますが、クッキーが有効になっていなければ、対応はHTTPクッキーマネージャを追加するになります。 想定しているレスポンスが返ってきていれば、CSSセレクタが正しくない可能性が高いので、Chrome developer toolsのconsoleでCSSのセレクタが正しいか確認すると、うまく解決できるかと思います。