1. サンプル
    • CSVファイルの指定
      • フィーダーの指定
        • CSVの値の指定方法
          • CSVの行の順番

          CSVファイルのデータを使ったテストケース

          テストケースの基礎についは以下を参照

          サンプル

          CSVファイルのデータを使ったテストケースのサンプルは、以下のようになります。 CSVに関係する部分は、コメントが書かれている3つの行です。

          例 user-files/simulations/computerdatabase/MySimulation.scala

          package computerdatabase
          
          import io.gatling.core.Predef._
          import io.gatling.http.Predef._
          import scala.concurrent.duration._
          
          class CsvTestSimulation extends Simulation {
            val host = "http://127.0.0.1"
            val userAgent = "Gatling Csv Test"
          
            val httpConf = http
              .baseURL(host)
              .userAgentHeader(userAgent)
          
            val feeder = csv("users.csv")   // CSVファイルの指定
            val scn = scenario("Csv Test Scenario")
              .feed(feeder.circular)        // フィーダーの設定
              .exec(http("test_request")
                .get("/?user_id=${user_id}&login_id=${login_id}")   // CSVデータの利用箇所
                .check(status.is(200))
              )
          
            setUp(
              scn.inject(
                constantUsersPerSec(1) during(8 seconds)
            ).protocols(httpConf))
          }

            CSVファイルの指定

            CSVファイルのパス指定は、サンプルの以下の部分になります。 この例のCSVファイルは、user-files/data/users.csv になります。

            val feeder = csv("users.csv")

            CSVファイルなどのデータファイルの置き場所は、デフォルトで以下のディレクトリになります。

            user-files/data/users.csv

            今回のCSVファイルの中身は、以下のようになっています。 CSVの1行目はヘッダーでカラム名になります。データは2行目以降になります。

            user_id,login_id,password
            1,toyota,passtoyota
            2,honda,passhonda
            3,suzuki,passsuzuki
            4,matsuda,passpatsu
            5,isuzu,passisuzu

              フィーダーの指定

              負荷試験のアクセスでは、動的な値の提供をフィーダーで行うことが可能です。

              サンプルのフィーダー指定は、以下の個所になります。 CSVファイルから提供するデータの順番は、CSVファイル先頭データからになり、最後の行になると先頭行に戻る循環方式( circular) です。

              val scn = scenario("Csv Test Scenario")
                           .feed(feeder.circular)

              データの順番は、circular以外にrandomshuffleなどがあります。 順番通りでなくランダムやシャッフルして使用したい場合は、CSVの値の順番を参考にしてください。

              参考  

                CSVの値の指定方法

                フィーダーを使うと、負荷テストの1アクセスごとに、CSVの行データを変数で指定できます。 今回のサンプルでは以下になり、${user_id}${login_id} がCSVの値に置き換わります。 変数名は、CSVファイルの1行目のヘッダーで指定されている名前になります。

                get("/?user_id=${user_id}&login_id=${login_id}")

                テスト実行後、Apacheのログを確認すると以下のようになっています。 この例では、curcularが使われているので、GETパラメータのuser_id と login_id に、CSVの2行目のデータ先頭(user_id = 1, login_id = totyota)から、最終行(user_id=6, login_id = mitsubishi)まで順番に使用されています。 CSVのデータ行数が全て使用されたあと、またデータ先頭行から使用されています。

                127.0.0.1 - - [22/Sep/2018:22:12:04 +0900] "GET /?user_id=1&login_id=toyota HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:05 +0900] "GET /?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:06 +0900] "GET /?user_id=3&login_id=suzuki HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:06 +0900] "GET /?user_id=4&login_id=matsuda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:07 +0900] "GET /?user_id=5&login_id=isuzu HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:09 +0900] "GET /?user_id=1&login_id=toyota HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:10 +0900] "GET /?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                127.0.0.1 - - [22/Sep/2018:22:12:11 +0900] "GET /?user_id=3&login_id=suzuki HTTP/1.1" 200 1133 "-" "Gatling Csv Test"

                CSVを順番通りでなくランダムやシャッフルして使用したい場合は、CSVの値の順番を参考にしてください。

                  CSVの行の順番

                  CSVのデータを順番通りでなく、シャッフルやランダムにする方法。

                  • ランダム

                  • CSVのデータ取り出しにrandomを使用すると、複数回使用される行があったり、1度も使用されない行があったりとランダムに行が使用されます。

                    val scn = scenario("Csv Test Scenario")
                                 .feed(feeder.random)

                    アクセスログを確認すると、8回中3回の"honda"、2回連続の"suzuki"と"honda"、0回の"matsuda"など、ランダムになっていることが確認できます。

                    127.0.0.1 - - [22/Sep/2018:23:01:54 +0900] "GET //?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:01:55 +0900] "GET //?user_id=5&login_id=isuzu HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:01:56 +0900] "GET //?user_id=1&login_id=toyota HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:01:57 +0900] "GET //?user_id=3&login_id=suzuki HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:01:58 +0900] "GET //?user_id=3&login_id=suzuki HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:01:59 +0900] "GET //?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:02:00 +0900] "GET //?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:02:01 +0900] "GET //?user_id=1&login_id=toyota HTTP/1.1" 200 1133 "-" "Gatling Csv Test"

                  • シャッフル

                  • CSVのデータ取り出しにshuffleを使用すると、CSVの行がシャッフルされて各行1回だけ使用されます。 そのため、CSVのデータ行数以上のアクセスはできません。 行数以上ではエラーになります。

                    val scn = scenario("Csv Test Scenario")
                                 .feed(feeder.shuffle)

                    CSVのデータが5行で、アクセス数が以下のように8回となっている場合

                    constantUsersPerSec(1) during(8 seconds)
                    実行すると以下のようなエラー"Feeder is now empty"となります。
                    ================================================================================
                    2018-09-22 23:28:03                                           5s elapsed
                    ---- Requests ------------------------------------------------------------------
                    > Global                                                   (OK=4      KO=0     )
                    > test_request                                             (OK=4      KO=0     )
                    
                    ---- Csv Test Scenario ---------------------------------------------------------
                    [#####################################                                     ] 50%
                              waiting: 4      / active: 0      / done:4     
                    ================================================================================
                    
                    23:28:05.302 [ERROR] i.g.c.a.SingletonFeed - Feed failed: Feeder is now empty, stopping engine, please report.
                    23:28:05.315 [ERROR] i.g.h.a.s.HttpRequestAction - 'httpRequest-1' failed to execute: No attribute named 'user_id' is defined
                    23:28:05.326 [ERROR] i.g.c.c.Controller - Simulation crashed
                    java.lang.IllegalStateException: Feeder is now empty, stopping engine
                            at io.gatling.core.action.SingletonFeed$$anonfun$receive$1.applyOrElse(SingletonFeed.scala:61)
                            at akka.actor.Actor.aroundReceive(Actor.scala:514)
                            at akka.actor.Actor.aroundReceive$(Actor.scala:512)
                            at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:23)
                            at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527)
                            at akka.actor.ActorCell.invoke(ActorCell.scala:496)
                            at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
                            at akka.dispatch.Mailbox.run(Mailbox.scala:224)
                            at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
                            at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
                            at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
                            at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
                            at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
                    
                    ================================================================================
                    2018-09-22 23:28:05                                           7s elapsed
                    ---- Requests ------------------------------------------------------------------
                    > Global                                                   (OK=5      KO=0     )
                    > test_request                                             (OK=5      KO=0     )
                    ---- Errors --------------------------------------------------------------------
                    > Failed to build request test_request: No attribute named 'user      1 (100.0%)
                    _id' is defined 
                    
                    ---- Csv Test Scenario ---------------------------------------------------------
                    [#######################################################                   ] 75%
                              waiting: 2      / active: 0      / done:6     
                    ================================================================================
                    
                    Simulation computerdatabase.CsvTestSimulation completed in 5 seconds
                    Exception in thread "main" java.lang.IllegalStateException: Feeder is now empty, stopping engine
                            at io.gatling.core.action.SingletonFeed$$anonfun$receive$1.applyOrElse(SingletonFeed.scala:61)
                            at akka.actor.Actor.aroundReceive(Actor.scala:514)
                            at akka.actor.Actor.aroundReceive$(Actor.scala:512)
                            at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:23)
                            at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527)
                            at akka.actor.ActorCell.invoke(ActorCell.scala:496)
                            at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
                            at akka.dispatch.Mailbox.run(Mailbox.scala:224)
                            at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
                            at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
                            at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
                            at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
                            at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

                    アクセスログを確認すると、CSVのデータ行数と同じ5個までアクセスがあったことが分かります。

                    127.0.0.1 - - [22/Sep/2018:23:28:00 +0900] "GET //?user_id=1&login_id=toyota HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:28:01 +0900] "GET //?user_id=5&login_id=isuzu HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:28:02 +0900] "GET //?user_id=2&login_id=honda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:28:03 +0900] "GET //?user_id=4&login_id=matsuda HTTP/1.1" 200 1133 "-" "Gatling Csv Test"
                    127.0.0.1 - - [22/Sep/2018:23:28:04 +0900] "GET //?user_id=3&login_id=suzuki HTTP/1.1" 200 1133 "-" "Gatling Csv Test"