【问题标题】:Gatling: Issue saving data to sessionGatling:问题将数据保存到会话
【发布时间】:2021-10-04 15:19:31
【问题描述】:

我正在更新一些性能测试,当用户创建一个包含多个类而不是我们当前测试的一个类时,使用 Gatling 来测试性能。

我对 Scala 和 Gatling 完全陌生,但我想,我已经设法弄清楚几乎所有事情。我只有一个地方会引起问题并让我感到困惑。

以下代码会抓取给定班级的所有学生(我们称他们为分区)。这是与现有测试完全一样的现有代码,但由于某种原因,新测试总是抛出 listOfStudents 不存在的错误。

要抛出的错误是'hook-81' crashed with 'java.util.NoSuchElementException: key not found: listOfStudents', forwarding to the next one

  val getListOfStudents = http("Get list of students")
    .get(BASE_URL + "/v2/sections/${sectionRefId}/rosters")
    .headers(getHeaderMap)
    .check(status.is(Ok),
      jsonPath("$.students[*].refId").findAll.transform(_.mkString(",")).saveAs("listOfStudents"))

我发现了这个问题,Gatling not storing value in session,它谈到会话是不可变的,但我认为我没有任何地方会生成新会话,除非在块的末尾,所以这不应该是问题。

原始测试使用以下代码获取学生列表,并在此场景中正确保存值:

  val createEdCtsAssignment = repeat(4) {
    exec(getTeacherSectionId)
      .exec(getListOfStudents)
      .exec(session => session.set("assignmentType", "PROGRAM_ASSESSMENT"))
      .exec(createTeacherAssignment)
  }

这是不起作用的代码:

  val createMultiSectionEdCtsAssignment = repeat(2) {
    exec(getTeacherMultiSectionSectionId)
      .exec(session => session.set("listOfStudentsBySection", ""))
      .foreach(session => session("listOfSectionRefIds").as[String].split(',').toSeq, "sectionRefId") {
        exec(session => {
          exec(getListOfStudents)
          session.set("listOfStudentsBySection", collectStudents(session))
        })
      }
      .exec(session => session.set("assignmentType", "PROGRAM_ASSESSMENT"))
      .exec(createMultiSectionTeacherAssignment)
  }

添加大量println()s 后,我发现错误发生在session.set("listOfStudentsBySection", collectStudents(session))。在collectStudents 中,故障发生在val studentsList = session("listOfStudents").as[String]。这与在createTeacherAssignment 中调用时工作的代码行完全相同。这两个函数都存在于它们自己的文件中,但即使在 exec(getListOfStudents) 之后尝试打印 listOfStudents 的值也会产生相同的错误。

它们之间唯一真正的变化是在非工作版本中存在foreach 循环。

(我们的 Gatling 版本是 2.2.5)

我已经尝试了我能找到或想到的一切,但没有成功。有人有什么想法吗?

【问题讨论】:

  • "(我们的 Gatling 版本是 2.2.5)"。加特林 2 已经死了好几年了!您应该升级(当前是 3.6.1)。

标签: gatling scala-gatling


【解决方案1】:
exec(session => {
  exec(getListOfStudents)
  session.set("listOfStudentsBySection", collectStudents(session))
})

这是完全错误的。正如documentation 中所解释的那样,您正在创建一个不做任何事情的建筑物。

这是正确的:

exec(getListOfStudents)
.exec { session =>
  session.set("listOfStudentsBySection", collectStudents(session))
}

那么,加特林 2 已经死了一年!请升级为现代版本。当前版本是 3.6.1,3.7.0 将在几周后发布。

【讨论】:

  • 谢谢,一位同事刚刚给了我同样的答案。很高兴在其他人可以找到它的地方拥有它。当您将一个旧的、大型的、维护不善的项目交给两个真正的 iOS 工程师时,就会发生这种情况。我们目前正在更新所有版本,所以我会将 Gatling 添加到列表中。
  • 太棒了。仅供参考,如果有帮助,我们还将在几周内发布 Java DSL(可与 Kotlin 一起使用)。
猜你喜欢
  • 2016-03-18
  • 2020-02-12
  • 1970-01-01
  • 2010-11-19
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多