74891


Gatlingを使って負荷テストを行っています。

負荷テストの対象となっている画面のログインする際のユーザIDを動的に変更したいのですが、編集したシナリオを起動するとエラーを吐いてしまいGatlingが起動できない状態です。

[負荷テストツールGatling Tips(実践的なScalaスクリプト)](https://web.plus-
idea.net/2018/02/gatling-tips-scala-script/)

上記サイトの「複数のログイン・ユーザのIDとパスワードをcsvファイルに定義し、パラレルにログインするシナリオを実行する」という部分を参考にしながら、自動生成されたシナリオを変更しています。

●シナリオ（scala) （自動生成されたシナリオを多少内容を変更しております。）

[code]

    import scala.concurrent.duration._
    
    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    import io.gatling.jdbc.Predef._
    
    import io.gatling.core.feeder.BatchableFeederBuilder
    
    class aaa extends Simulation {
    
        val httpProtocol = http
            .baseUrl("http://example.com")  //URLは伏せさせていただきます。
            .inferHtmlResources()
            .contentTypeHeader("text/xml; charset=utf-8")
            .userAgentHeader("Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)")
    
        val headers_0 = Map(
            "Proxy-Connection" -> "Keep-Alive",
            "SOAPAction" -> "http://example.com")  //URLは伏せさせていただきます。
    
    
            val login_feeder = csv("LoginUser.csv").circular
    
        val scn = scenario("aaa")
                .feed(login_feeder)
                .exec(http("request_0")
                .post("/public/")  //負荷テストの対象となる画面IDが入ります
                .headers(headers_0)
                // 以下 0000_request.dat の中に "StrUserId" があります。
                .body(RawFileBody("C:/tool/gatling-charts-highcharts-bundle-3.5.0-bundle/user-files/resources/aaa/0000_request.dat")) 
                .formParam("StrUserId", "%{UserId}"))
    
    
    
        setUp(scn.inject(rampUsers(login_feeder.records.length) during(180 seconds))).protocols(httpProtocol)
    }
    
[/code]

●出力されるエラー

> [ERROR] i.g.c.ZincCompiler$ - C:/tool/gatling-charts-highcharts-
> bundle-3.5.0-bundle/user-files/simulations/aaa.scala:35:42: value records is
> not a member of  
>  io.gatling.core.feeder.BatchableFeederBuilder[String]#F  
>  setUp(scn.inject(rampUsers(login_feeder.records.length) during(180  
>  seconds))).protocols(httpProtocol)

※エラーの場所を示す「＾」はsetUpの()内のrecordsの「r」の下についております。

●LoginUser.csv の中身

[code]

    UserId
    0000010000
    0000020000
    0000030000
    0000040000
    0000050000
    
[/code]

どなたか対処方法をご教授いただけませんでしょうか。宜しくお願い致します。

* * *

**※追記**  
ご教授いただいた方法を試してみたところ、エラーは吐かなくなりGatlingを起動するに成功しました。

ですが、本題であったユーザIDは動的に変更していませんでした。  
`0000_request.dat`内の`StrUserId`には`0000010000`が入っており、5ユーザ分`0000010000`のユーザIDでログインしておりました。

再度の質問になりますが、ユーザIDを動的に変更しながら負荷テストを実施する方法についてご存知の方がおられましたらご教授いただきたいです。宜しくお願い致します。


CC BY-SA 4.0
2021-03-25T06:38:05.673
74884
2021-06-04T11:13:25.247
2021-06-04T11:13:25.247
3068
44495
question
scala gatling
特定ファイルの中身を動的に変更してGatlingで負荷テストをしたい


参照されている記事が古いためコンパイルエラーが出ているものと思います。

お使いの環境やバージョンは分かりませんが、少なくとも Gatling 3.5.1 では `readRecords: Seq[Record[Any]]`
によりCSVのデータにアクセスする必要があるかと思います。

* * *

`SOAPAction` から察するに、datファイルの中身はxmlだったりしますでしょうか？

なにかしらのテンプレートファイル(xml, dat,
etc.)の中身をCSV(feeder)の値に置換してリクエストを行う場合、`ElFileBody()`が利用できます。

**LoginUser.csv**

[code]

    UserId
    0000010000
    0000020000
    0000030000
    0000040000
    0000050000
    
[/code]

**LoginUser.xml**

ファイル内でCSV(feeder)の値で置換したい箇所を `${}` で記述しておきます。

[code]

    <?xml version="1.0" encoding="utf-8" ?>
    <szSessionID>${UserId}</szSessionID>
    
[/code]

**変更後のScalaコード**

[code]

      val login_feeder = csv("LoginUser.csv")
    
      val scn = scenario("aaa")
        .feed(login_feeder.circular)
        .exec(
          http("request_0")
            .post("/public/")
            .headers(headers_0)
            .body(ElFileBody("LoginUser.xml"))
        )
    
      setUp(scn.inject(rampUsers(login_feeder.readRecords.length) during(180 seconds))).protocols(httpProtocol)
    
[/code]

**実行時の結果**

[code]

    =========================
    Session:
    Session(aaa,5,HashMap(gatling.http.cache.baseUrl -> http://example.com, gatling.http.ssl.sslContexts -> io.gatling.http.util.SslContexts@7f7ff3d1, gatling.http.referer -> http://example.com/public/, UserId -> 0000050000, gatling.http.cache.dns -> io.gatling.http.resolver.ShufflingNameResolver@3a7d725a, gatling.http.cache.contentCache -> io.gatling.core.util.cache.Cache@73f6a724),KO,List(),io.gatling.core.protocol.ProtocolComponentsRegistry$$Lambda$458/1157205972@5711bae9,io.netty.channel.nio.NioEventLoop@413c5e1b)
    =========================
    HTTP request:
    POST http://example.com/public/
    headers:
            user-agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)
            Proxy-Connection: Keep-Alive
            SOAPAction: http://example.com
            accept: */*
            host: example.com
            content-type: text/xml; charset=utf-8
            content-length: 80
    body:StringChunksRequestBody{contentType='text/xml; charset=utf-8', charset=UTF-8, content=<?xml version="1.0" encoding="utf-8" ?>
    <szSessionID>0000050000</szSessionID>
    }
    =========================
    
[/code]

5回目のリクエストではテンプレートファイル(xml)の `${UserId}` が CSV ファイル5行目の `0000050000`
に置換されてリクエストされていること分かります。

[code]

    content=<?xml version="1.0" encoding="utf-8" ?>
    <szSessionID>0000050000</szSessionID>
    
[/code]


CC BY-SA 4.0
2021-03-25T09:45:16.413
74891
2021-03-26T10:01:25.767
2021-03-26T10:01:25.767
3068
3068
74884
answer