ぬまろぐ

←戻る

Gatling | リクエストに乱数を利用する方法

2021/07/08

Gatlingでリクエスト項目の日付をランダムにする必要があったので、その時の方法の備忘になります。

ランダムな日付を生成する関数を用意する

最初にランダムな日付を生成する関数をgatlingコード内に定義します。下のコードの例だと、特定の期間でランダムな年月日(yyyyMMdd)を返却します。

import java.time.LocalDate
import java.time.temporal.ChronoUnit.DAYS
import scala.util.Random
import java.time.format.DateTimeFormatter
...
def randomYYYYMMDD(): LocalDate = {
  val pattern = DateTimeFormatter.ofPattern("yyyyMMdd")
  val from = LocalDate.of(2020, 1, 1)
  val to= LocalDate.of(2020, 6, 1)
  val diff = DAYS.between(from, to)
  val random = new Random(System.nanoTime)
  from.plusDays(random.nextInt(diff.toInt)).format(pattern)
}
...

シナリオの中で関数を呼び出し埋め込む

下の例はGETリクエストにランダムな日付のクエリパラメータを付けている例になります。定義した乱数を生成する関数をqueryParam関数などから呼び出しリクエストパラメータに付与します。

import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import java.time.LocalDate
import java.time.temporal.ChronoUnit.DAYS
import scala.util.Random
import java.time.format.DateTimeFormatter

class BasicSimulation extends Simulation {
  val httpProtocol = http
    .baseUrl("http://xxx") 

  //ランダム年月日生成関数  
 def randomYYYYMMDD(): LocalDate = {
    val pattern = DateTimeFormatter.ofPattern("yyyyMMdd")
    val from = LocalDate.of(2020, 1, 1)
    val to= LocalDate.of(2020, 6, 1)
    val diff = DAYS.between(from, to)
    val random = new Random(System.nanoTime)
    from.plusDays(random.nextInt(diff.toInt)).format(pattern)
  }

  val scn = scenario("BasicSimulation") 
    .exec(
      http("request_1")
        .get("/")
        .queryParam("date", randomYYYYMMDD() )
    )
    .exec(
      http("request_2")
        .get("/")
        .queryParam("date", randomYYYYMMDD() )
    )
...

ここで注意が必要なのは、このコードだとrequest_1とrequest_2はどちらも同じ日付になるということです。1つのシナリオ内で乱数を別々にする場合はセッションを利用する必要があります。

sessionを利用して1シナリオ内で値をランダムにする

以下のようにsession内で乱数を呼び出すことで、リクエストごとに値がランダムになります。

    .exec(
      http("request_1")
        .get("/")
        .queryParam("date", session => randomYYYYMMDD() )
    )
    .exec(
      http("request_2")
        .get("/")
        .queryParam("date", session => randomYYYYMMDD() )
    )