Gatlingのrecorderでレコードしたソースコードはそのままでも使えますが、シナリオの調整や実行条件の設定を行うために変更を行う必要があります。ここでは、レコードしたソースコードの構成とカスタマイズのポイントを紹介します。Gatlingのソースコードはscalaで記述されています。

レコードされたソースコードの構成

recorderでレコードされたソースコードは①HTTPの定義、②リクエストヘッダの定義、③シナリオ定義、④実行定義の大きく4つで構成されています。以下はレコードしたソースコードのサンプルになります。

package user

import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class Sample extends Simulation {

  // ① HTTPの基本的な定義
  val httpProtocol = http
    .baseURL("https://www.sample.co.jp")
    .inferHtmlResources()
    .acceptHeader("application/json")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("ja-JP")
    .doNotTrackHeader("1")
    .userAgentHeader("Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko")

  // ② リクエストヘッダの変数定義
  val headers_0 = Map("Accept" -> "text/html, application/xhtml+xml, */*")
  val headers_1 = Map("Accept" -> "text/css, */*")
  val headers_2 = Map("Accept" -> "application/javascript, */*;q=0.8")
  val headers_3 = Map("Content-Type" -> "application/json")
  val headers_4 = Map("Accept" -> "image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5")

  // ③ シナリオ定義
  val scn = scenario("saiten")
    .exec(
      http("request_0") //HTTPリクエスト名、レポートに使われるので分かりやすい名前が良い
        .get("/aaa/bbb.html")
        .headers(headers_0)
        .resources( //並列に画像等のリソースをリクエストする
          http("request_1")
            .get("/css/aaa.css")
            .headers(headers_1),
          http("request_2")
            .get("/js/bbb.js")
            .headers(headers_2)))
    .pause(10) //10秒待機
    .exec(
      http("request_3")
        .post("/search")
        .headers(headers_3)
    .body(RawFileBody("Sample_0008_request.txt"))) //JSONなどを送る場合はボディを別テキストから読み込み(/user-files/bodies/Sample_0008_request.txt)
    ... //こんな感じでシナリオを定義していく
  
  // ④ シナリオを実行条件を指定して実行
  setUp(scn.inject(
    rampUsersPerSec(1) to (3) during(6 seconds),
  )).protocols(httpProtocol)
}

基本的なカスタマイズ

レコードしたソースコードはそのままでも動きますが、試験を行うためにいくつかカスタマイズする必要があります。主に変更するのは③、④の部分になります。

③のシナリオ定義部分では主に以下のような変更を行います。

  • pause()の時間を変更または外す
    レコードした状態だと、実際の操作に合わせてHTTPリクエストの間にpause()関数で待ち時間が設定されていますので、必要に応じて時間を変更したり外したりします。
  • http()関数の引数で渡しているリクエスト名を変更
    レコードした状態だとhttp(“request_1”)のような名前がしてされていますが、レポートを見る際にどのリクエストか判断がしずらいため、わかりやすい名前に変更します。
  • 不要なリクエストを消す
    jpgやpngなどのリクエストが不要な場合は、レコード時にフィルタでリクエストを除外できますが、除外していなければソースコードから削除します。
  • XSRF対策用の実装
    XSRF対策などでトークンを引き継いで遷移する必要がある場合などは、HTTPレスポンスヘッダやボディ内の情報を取得し次のリクエストのパラメータに指定するようなコーディングを行う必要があります。
    詳しくは「HTTPレスポンスヘッダやボディのパラメータをリクエストパラメータに利用する方法」に記載しています

④の実行条件では多重度やランプアップ、実行時間などを変更します。詳しくは「負荷設定の種類とユーザの立ち上がり方について」に記載しています