Gatling Java中能否直接传入Session至函数?exec块触发请求异常
Gatling请求体中直接传递Session的方式不可行
这种直接调用createBodyStringForStudentAssignmentSetup(session)传递Session的方式不可行,问题出在Gatling的执行时机和DSL设计逻辑上,下面是具体原因和正确实现方式:
错误原因
- 直接调用带Session参数的函数时,这个调用是在脚本编译阶段执行的,此时还没有运行时的用户Session(每个用户的Session是在模拟运行时才生成的),根本无法获取到Session中存储的"listOfStudents"这类动态数据。
- 如果你的
exec(session -> ...)块没有触发请求,大概率是因为没有正确返回Session对象,导致Gatling的执行链被中断,后续请求步骤不会执行。
正确实现方式
方式一:让函数返回Expression[String]
调整函数,使其返回Gatling要求的Expression[String]类型(本质是Session => Validation[String]的函数),直接传递给.body():
// 定义返回Expression[String]的函数 def createBodyStringForStudentAssignmentSetup: Expression[String] = session => { // 从Session中获取数据 val listOfStudents = session("listOfStudents").as[List[String]] // 构造请求体字符串 val body = s"""{"students": ${listOfStudents.mkString("[\"", "\",\"", "\"]")}}""" // 返回Right表示成功,Left可用于返回错误信息 Right(body) } // 在HTTP请求中使用 http("Create Student Assignment") .post("/api/assignments") .body(StringBody(createBodyStringForStudentAssignmentSetup))
方式二:包装现有函数为Expression
如果createBodyStringForStudentAssignmentSetup必须保留Session参数,调用时把它包装成Expression[String]传给.body():
// 原有函数,接收Session参数并返回字符串 def createBodyStringForStudentAssignmentSetup(session: Session): String = { val listOfStudents = session("listOfStudents").as[List[String]] s"""{"students": ${listOfStudents.mkString("[\"", "\",\"", "\"]")}}""" } // 使用时包装成Expression http("Create Student Assignment") .post("/api/assignments") .body(StringBody(session => createBodyStringForStudentAssignmentSetup(session)))
注意exec块的正确用法
如果需要在请求前处理Session,必须确保exec块返回Session对象,否则执行链会中断:
exec(session => { // 示例:给Session添加数据 session.set("extraData", "value") }) .http("Create Student Assignment") .post("/api/assignments") .body(StringBody(createBodyStringForStudentAssignmentSetup))
内容的提问来源于stack exchange,提问作者Alexb1999
相关产品推荐
相关产品推荐

