如何从 Gatling 中的 csv 文件注入数据?

How to inject data from csv file in Gatling?

我对 Gatling 场景的实现有疑问。它在 Scala DSL 上,也许有人已经遇到过这个问题?

目标:我们需要在场景中注入数据。 基本上,我们有 - 我们的页面 http://ourPage.com/ 就像所有相对 URL 的根 - CSV 文件中的 URL 列表,这些 URL 基本上是来自我们 Oracle 数据库的 650000 个 id,组合(root+Urls)将模拟我们选择的用户数量。

如何在 Gatling 中从 CSV 文件中注入数据?

包括该文件存在于正确的目录(数据)中并且里面有正确的数据

希望我的信息能被理解 我将不胜感激任何帮助

Log:

18:42:54.456 [ERROR] i.g.c.ZincCompiler$ - C:\Users\nikol\OneDrive\Desktop\gatling-charts-highcharts-bundle-2.3.1\user-files\simulations\computerdatabase\BasicSimulation.scala:37: not found: value Article_ID
18:42:54.458 [ERROR] i.g.c.ZincCompiler$ -   feed(csv(Article_ID.csv))
18:42:54.459 [ERROR] i.g.c.ZincCompiler$ -            ^
18:42:54.584 [ERROR] i.g.c.ZincCompiler$ - C:\Users\nikol\OneDrive\Desktop\gatling-charts-highcharts-bundle-2.3.1\user-files\simulations\computerdatabase\BasicSimulation.scala:40: not found: value Article_ID
18:42:54.584 [ERROR] i.g.c.ZincCompiler$ -       .get(s"${Article_ID}") // changet value from Article_ID.csv to Article_ID
18:42:54.584 [ERROR] i.g.c.ZincCompiler$ -                ^
18:42:54.635 [ERROR] i.g.c.ZincCompiler$ - two errors found
18:42:54.639 [ERROR] i.g.c.ZincCompiler$ - Compilation crashed


package computerdatabase

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

import scala.concurrent.duration._
import io.gatling.jdbc.Predef._

class BasicSimulation extends Simulation {

  val httpConf = http
    .baseURL("http://my_link.com") // Here is the root for all relative URLs and this is example, this is not real link;
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")

  val headers_10 = Map("Content-Type" -> "application/x-www-form-urlencoded") // Note the headers specific to a given request
  val scn = scenario("Scenario Name") // A scenario is a chain of requests and pauses

  feed(csv(Article_ID.csv))

    .exec(http("Request")
      .get(s"${Article_ID}") // changet value from Article_ID.csv to Article_ID
    .pause(7))

  setUp(scn.inject(atOnceUsers(1)).protocols(httpConf))
}

嗯,上面的代码产生了一个空场景(我认为它不应该编译)。这是因为 feed() 方法没有在场景构建器链中使用,而是单独使用。你需要做的是将所有步骤称为chain fe.:

val scn = scenario("Scenario Name")
  .feed(csv(Article_ID.csv))
  .exec(http("Request"))
    .get(s"${Article_ID}")
  .pause(7))

如果这不是问题并且您粘贴的代码有误,请检查 CSV 文件的格式是否正确。 CSV 的第一行应该包含属性名称(我知道人们经常忘记它)fe.:

Article_ID, OtherColumn, AnotherColumn
1, Test, Lorem Ipsum
2, Abc, Dolor Sit Amet
3, Xyz, Consectetur Adipiscing

My solution

   object Article {
        val feeder = csv("search.csv").random // randomly id from the csv file

        val search = feed(feeder)
          .exec(http("unike_Article") // execute your request 
            .get("/article/88.8888/${searchCriterion}") 
          )
          .pause(2)
  }

  val users = scenario("Users").exec(Article.search)

  setUp(users.inject(rampUsersPerSec(2)to(20)during(3 minutes)).protocols(httpConf))

}

这是一个完全可行的解决方案,它基于 this post,其中目标 URL 是 http://localhost:8080/cat?name=XYZ,猫的名字来自一个 CSV 文件,带有name 列:

import java.util.concurrent.TimeUnit
import io.gatling.core.Predef.{Simulation, scenario, _}
import io.gatling.http.Predef.{http, status}
import scala.concurrent.duration.FiniteDuration

class MySimulation extends Simulation{

val baseURL = "http://localhost:8080"
val httpConf = http.baseUrl(baseURL)
val csvFeeder = csv("cats.csv").random

val scn = scenario("my cats")
    .feed(csvFeeder)
    .exec(http("my cats")
    .get(baseURL + "/cat")
    .queryParam("name", "${name}"))

setUp(
    scn.inject(
    constantUsersPerSec(100) during (FiniteDuration(10,TimeUnit.SECONDS)),
    )
    .protocols(httpConf))
}