Gatling:将保存数据发送到会话
Gatling: Issue saving data to session
我正在更新一些性能测试,这些测试使用 Gatling 来测试当用户创建一个包含多个 class 的作业时的性能,而不是我们当前测试的只有一个 class。
我对 Scala 和 Gatling 是全新的,但我想我已经设法搞清楚了几乎所有的事情。我只有一个地方引起了问题,让狄更斯感到困惑。
以下代码获取给定 class(我们称之为部分)中的所有学生。这是现有代码,与现有测试完全按照预期工作,但由于某种原因,新测试总是抛出 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"))
我发现了这个问题,,它讨论了会话是不可变的,但我认为我没有任何可以生成新会话的地方,除了在块的末尾,所以它不应该是问题。
原测试使用以下代码抓取学生列表,并在这种情况下正确保存了值:
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()
后,我发现错误发生在 session.set("listOfStudentsBySection", collectStudents(session))
中。在 collectStudents
中,失败发生在 val studentsList = session("listOfStudents").as[String]
。这与在 createTeacherAssignment
中调用时的代码行完全相同。这两个函数都存在于它们自己的文件中,但即使试图在 exec(getListOfStudents)
之后立即打印 listOfStudents
的值也会产生相同的错误。
它们之间唯一真正的区别是在非工作版本中存在 foreach
循环。
(我们的加特林版本是2.2.5)
我已经尝试了所有我能找到或想到的方法,但都没有成功。有人有什么想法吗?
exec(session => {
exec(getListOfStudents)
session.set("listOfStudentsBySection", collectStudents(session))
})
这是完全错误的。正如 documentation 中所解释的,您正在创建一个不执行任何操作的建筑物。
这是正确的:
exec(getListOfStudents)
.exec { session =>
session.set("listOfStudentsBySection", collectStudents(session))
}
那么,Gatling 2 已经死了一年!请升级到现代版本。当前版本是 3.6.1,3.7.0 将在几周后发布。
我正在更新一些性能测试,这些测试使用 Gatling 来测试当用户创建一个包含多个 class 的作业时的性能,而不是我们当前测试的只有一个 class。
我对 Scala 和 Gatling 是全新的,但我想我已经设法搞清楚了几乎所有的事情。我只有一个地方引起了问题,让狄更斯感到困惑。
以下代码获取给定 class(我们称之为部分)中的所有学生。这是现有代码,与现有测试完全按照预期工作,但由于某种原因,新测试总是抛出 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"))
我发现了这个问题,
原测试使用以下代码抓取学生列表,并在这种情况下正确保存了值:
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()
后,我发现错误发生在 session.set("listOfStudentsBySection", collectStudents(session))
中。在 collectStudents
中,失败发生在 val studentsList = session("listOfStudents").as[String]
。这与在 createTeacherAssignment
中调用时的代码行完全相同。这两个函数都存在于它们自己的文件中,但即使试图在 exec(getListOfStudents)
之后立即打印 listOfStudents
的值也会产生相同的错误。
它们之间唯一真正的区别是在非工作版本中存在 foreach
循环。
(我们的加特林版本是2.2.5)
我已经尝试了所有我能找到或想到的方法,但都没有成功。有人有什么想法吗?
exec(session => {
exec(getListOfStudents)
session.set("listOfStudentsBySection", collectStudents(session))
})
这是完全错误的。正如 documentation 中所解释的,您正在创建一个不执行任何操作的建筑物。
这是正确的:
exec(getListOfStudents)
.exec { session =>
session.set("listOfStudentsBySection", collectStudents(session))
}
那么,Gatling 2 已经死了一年!请升级到现代版本。当前版本是 3.6.1,3.7.0 将在几周后发布。