当前位置: 首页 > 知识库问答 >
问题:

带有CSV馈线的Gatling登录场景

秦诚
2023-03-14

我必须使用Gatling/Scala编写一些测试。在我的具体情况下,我必须使用用户名和密码登录网站(此外还有密钥斗篷安全性)。有一个带有很多用户/密码行的CSV文件,我的目标是使用此CSV文件中的每个用户/密码登录。

问题是我不知道怎么做。我可以用用户名/密码和密钥斗篷的安全令牌登录,只需一个用户。到目前为止还可以,但还不够。以下是我到目前为止所做的。

第一类:

class LasttestBestand extends Simulation {

  val context = Context.ladeContext("de", "integ")
  val userCredentials = TestdatenImport.ladeTestDaten("de")

  val httpProtocol = http
    .baseUrl(s"${context.protocol}://${context.host}")
    .inferHtmlResources(
      BlackList(""".*\.css""", """.*\.js""", """.*\.ico""", """.*\.woff"""),
      WhiteList()
    )
    .acceptHeader("application/json, text/plain, */*")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("de,en-US;q=0.7,en;q=0.3")
    .disableFollowRedirect
    .userAgentHeader(
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:63.0) Gecko/20100101 Firefox/63.0"
    )

  val scn = scenario("Lasttest Bestand")
    .feed(userCredentials.csvFeeder)
    .exec(Login.holeAccessToken("${Benutzername}", "${Passwort}", context))
    .exec(Suche.ladeKundensucheResourcen(context))

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

馈线类:

class TestdatenImport(val csvFeeder: BatchableFeederBuilder[String]) {}

object TestdatenImport {

  def ladeTestDaten(land: String) = {
    val csvFeeder = csv(s"data/eca-bb3-${land}-testdaten.csv").circular

    new TestdatenImport(
      csvFeeder
    )
  }
}

登录名:

object Login {
  def holeAccessToken(
      benutzer: String,
      passwort: String,
      context: Context
  ): ChainBuilder = {
    val keycloakUri = s"${context.protocol}://${context.keycloakHost}"
    val redirectUri =
      s"${context.protocol}%3A%2F%2F${context.host}%2Fapp%2F%3Fredirect_fragment%3D%252Fsuche"

    exec(
      http("Login Page")
        .get(
          s"$keycloakUri/auth/realms/${context.realm}/protocol/openid-connect/auth"
        )
        .queryParam("client_id", "bestand-js")
        .queryParam("redirect_uri", redirectUri)
        .queryParam("state", UUID.randomUUID().toString())
        .queryParam("nonce", UUID.randomUUID().toString())
        .queryParam("response_mode", "fragment")
        .queryParam("response_type", "code")
        .queryParam("scope", "openid")
        .header(
          "Accept",
          "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        )
        .header("Upgrade-Insecure-Requests", "1")
        .check(status.is(200))
        .check(
          css("#kc-form-login")
            .ofType[Node]
            .transform(variable => {
              variable.getAttribute("action")
            })
            .saveAs("loginUrl")
        )
    ).exec(
        http("Login")
          .post("${loginUrl}")
          .formParam("username", benutzer)
          .formParam("password", passwort)
          .header(
            "Accept",
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
          )
          .header("Upgrade-Insecure-Requests", "1")
          .check(status.is(302))
          .check(
            header("Location")
              .transform(url => {
                url.substring(url.indexOf("code=") + 5, url.length())
              })
              .saveAs("code")
          )
          .check(header("Location").saveAs("nextPage"))
      )
      .exec(
        http("Fetch Token")
          .post(
            s"$keycloakUri/auth/realms/${context.realm}/protocol/openid-connect/token"
          )
          .header("Accept", "*/*")
          .header("Origin", s"${context.protocol}://${context.host}")
          .formParam("code", "${code}")
          .formParam("grant_type", "authorization_code")
          .formParam("client_id", "bestand-js")
          .formParam("redirect_uri", redirectUri)
          .check(status.is(200))
          .check(
            jsonPath("$..access_token")
              .saveAs("accessToken")
          )
      )
  }
}

如您所见,我在场景中添加了一个进纸器,但我不知道如何“重复”登录CSV文件中有用户/密码行的次数。我做错了什么?

共有1个答案

梁丘翔
2023-03-14

在CSV文件中输入尽可能多的用户,例如:

scn.inject(
  rampUsers(numberOfEntries) during(10 minutes)
)
 类似资料:
  • 我使用CSV馈送器来馈送多个模拟。当使用gatlingRun运行时,每个模拟从一开始就开始读取文件。我将进料器保存在对象变量中(必须像静态变量一样): 有没有办法让所有模拟都使用相同的馈线实例,或者让每个实例在其他实例完成的地方继续?

  • 我一直在使用JMeter和Gatling在JSF2 PrimeFaces4 web应用程序上记录一个场景,以便对其进行负载测试。这两个工具都可以很好地进行录制,但是由于在commandButton上打开弹出对话框的单击操作不会触发关联事件,所以该场景的重播失败了。所述commandButton由场景中的前一个操作(同一表行中的下拉选择)启用。 只有在性能测试工具上运行场景时才会出现此问题,而不是在

  • 我是加特林的新手,我有自己无法解决的问题。我必须从我创建的feeder中提取价值,但我不知道该怎么做。你知道怎么做吗?谢谢你的帮助。

  • 我用CSV在加特林创建了一个简单的馈线。脚本运行良好,没有出现任何错误。我知道在负载测试期间会从CSV获取值。但我如何才能确保每个用户都得到了哪些价值呢。我必须确保第一个用户应该使用用户名:user1和密码:password1登录。因为我对加特林非常陌生,所以我找不到解决这个问题的办法。因此,请帮我找到解决方案,提前谢谢。。。。。。 我的CSV包含- 用户1密码1 用户2密码2 用户密码 我的进纸

  • 我将springBoot与JOOQ一起使用,并希望记录生成的SQL。 我将slf4J添加到maven依赖项和log4j.xml中,就像在JOOQ文档中一样(http://www.JOOQ.org/doc/latest/manual/sql-execution/logging/)。但是当jooq执行一些查询时,我在控制台中看不到任何日志。

  • 我遇到了一个问题,似乎没有将来自馈线的数据添加到会话中。我正在测试一个系统,其中一个用户有一个角色(即用户或管理员),我需要根据角色执行各种测试。在高级教程之后,我将链拆分为不同的对象(每个对象都在自己的文件中)——其中一个对象包含登录过程,无论用户角色如何,登录过程都是相同的。我不想重复使用这个,但要用不同的喂食器。 我使用csv feeder加载用户名和密码,但看起来它无法将数据添加到会话中,