見出し画像

JMeterを使ってCookieの値を複数のスレッドグループで共有する

こんにちは。自動化エンジニアの長岡です。

JMeterを利用して負荷テストのシナリオを作成する場合、負荷テスト対象のシステムによってはCookieの利用が必須となるケースが多々あるかと思います。1つのスレッドグループでCookieを利用するケースにおいては割と簡単にできますが、複数のスレッドグループでCookieを共有するケースにおいては、ひと工夫必要になってきます。
本稿では、複数のスレッドグループでCookieを共有するにはどのように対応したらよいか、をご紹介したいと思います。



検証した環境

・OS:Windows 10 Pro
・JMeter:Ver 5.4


1つのスレッドグループでCookieを利用する

※下図のような商品購入シナリオをサンプルとします。

ログイン後に認証情報をCookieで持ち回るといったようなケースを、1つのスレッドグループで実現する場合は簡単です。設定エレメントから「HTTPクッキーマネージャ」を追加します。これだけでこのシナリオは、ログイン以降に必要なCookieの送受信を行えるようになります。

画像1


複数のスレッドグループでCookieを共有する

本記事の本題はこのケースになります。下図のようにログインと商品購入のスレッドグループを分け、ログイン後に生成される認証情報を保持したCookieを、商品購入スレッドグループで利用する、といったケースを例に説明します。

画像2


1. jmeter.propertiesの修正

JMETER_HOME\bin\jmeter.propertiesを開きます。

#CookieManager.save.cookies=false

となっている記述を、以下のようにコメントアウトを外し設定値をtrueに修正します。

CookieManager.save.cookies=true

JMeterでは、CookieManager(後述)を利用してシナリオ作成者が任意のタイミングでCookieの取得、追加等の処理を実装することが可能です。そのための事前設定として、CookieManangerのsave.cookieプロパティをtrueにしておく必要があります。


2. ログイン処理の後にJMeter内部へCookieを保存する

下図のように、「ログイン」HTTPリクエストを右クリック → 追加 → 後処理 → BeanShell PostProcessorを追加します。

画像3


エディタが表示されるので、以下のように入力します。

props.put("auth_cookie", "${COOKIE_sessionId}");

JMeterでは内部プロパティにpropsという変数でアクセスできるため、propsのputメソッドを利用してKey、Valueの形で保存したい値をセットします。

今回の例では、「auth_cookie」というKeyで、セッションIDを格納しています。ここで1つ注意点ですが、Key名は任意のもので大丈夫なのですが、ValueにCookie値をセットする場合は以下の形式にする決まりがあります。


・「COOKIE_」というプレフィクス + 実際のCookie名
JMeter内部では上記形式でCookie値を保持しており、${}で括ることで値を取得することができます。なお、今回の例ではCookie名が「sessionId」という想定でいるため、「${COOKIE_sessionId}」という形になります。

3. 2で保存したCookieを別のスレッドグループで取得しCookieManagerに追加する

下図のように、Cookieを利用する別のスレッドグループ(今回の例では「商品購入」スレッドグループを右クリック → 追加 → 前処理 → BeanShell PreProcessorを追加します。

画像4

エディタが表示されるので、以下のように入力します。

import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
// ①JMeter内部で管理しているCookieへアクセスするためsamplerからCookieManagerを取得
CookieManager cm = sampler.getCookieManager();
// ②新たにCookieを生成
 Cookie c = new Cookie("sessionId", props.get("auth_cookie"), YOUR_DOMAIN, "/", false, 0);
// ③生成したCookieをCookieManagerに追加
 cm.add(c);

JMeterではsamplerという変数でCookieManagerを含む各種プロパティを保持しているため、①のような形でgetCookieManagerメソッドを利用してCookieManagerを取得します。


次に、②のような形で新たにCookieを生成します。コンストラクタの各パラメータは以下の通りです。

・第一引数:各スレッドグループで共有される実際のCookie名を指定します。今回の例では、Cookie名は「sessionId」という想定でいるため” sessionId”としています。

・第二引数:Cookie値を指定します。
「2. ログイン処理の後にCookieを保存する」でpropsに保存したログイン後のセッションIDをpropsのgetメソッドを利用して取得します。getメソッドの引数は保存する時に指定したKey名(今回の例では「auth_cookie」)を指定します。

・第三引数:Cookieを送信するドメイン名を指定します。

・第四引数:Cookieを送信するPath属性を指定します。
基本的には「/」で大丈夫です。

・第五引数:Cookieのセキュア属性を指定します。
HTTPS接続の場合のみCookieを送信したい場合はtrueにします。

・第六引数:Cookieの有効期限を秒で指定します。
ポイントは第一引数と第二引数になります。スレッドグループ間でうまくCookieが共有されない原因の1つがここの指定間違いだったりするので注意してください。

次に、③のような形で生成したCookieをCookieManagerに追加します。


4. Cookieを利用するスレッドグループにHTTP クッキーマネージャを追加する

最後に、「1つのスレッドグループでCookieを利用する」で追加したのと同じ手順で、Cookieを利用するスレッドグループにHTTP クッキーマネージャを追加します。HTTPクッキーマネージャを追加することで、3で取得したCookieを送受信できるようになり、結果として複数のスレッドグループでCookieを共有している形となります。


最後にまとめ

これまでの流れをまとめると下図のようなになります。

画像5


JMeterでは、本記事のようにCookieの独自制御以外にも、レスポンスボディの値を取得して次のリクエストのパラメータにする、レスポンスボディの値によって次のリクエストは送信しない、といった様々な制御が実現できます。今後、機会があればそういった機能もご紹介していければと思います。

以上です、最後まで読んでいただきありがとうございました。

__________________________________

執筆者プロフィール:長岡 賢一
2006年1月に小規模ソフトウェアハウスに就職。14年半システムエンジニアとして多数のプロジェクトの開発(要件定義~リリース)、チームリーダー等を経験したのち、2020年7月にSHIFTに入社。GUIテストの自動化をしつつ案件管理者としても日々奮闘中。


《NEW!!》
資料ダウンロード/動画視聴ページはこちらから

■SHIFTについて
私たちは品質保証・ソフトウェアテスト(第三者検証)のプロ集団です。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/