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以外にrandomやshuffleなどがあります。 順番通りでなくランダムやシャッフルして使用したい場合は、CSVの値の順番を参考にしてください。
参考
- github gatling/gatling-core/src/main/scala/io/gatling/core/feeder/BatchedSeparatedValuesFeeder.scala
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"