Gatling循环传递continuationToken报错:属性未定义
解决Gatling中continuationToken未定义的问题
你的代码里有几处关键错误导致了continuationToken未定义的报错,下面逐一说明并给出修正方案:
错误点分析
- 保存会话属性时误用
${}语法:Gatling中saveAs的参数直接写属性名字符串即可,你写的saveAs("${continuationToken}")会把属性名存成带${}的字符串,后续自然找不到正确的属性。 - 访问会话属性时误用
${}:doWhile的判断逻辑里,session("${continuationToken}")是错误写法,应该直接用session("continuationToken")访问会话属性。 - 循环条件判断不严谨:如果第一个请求的响应头没有返回
continuationToken,会话中不会存在该属性,直接调用as[String]会抛出异常,得先检查属性是否存在再判断值是否有效。
修正后的代码
val httpProtocol = http .baseUrl("some-base-url") val scn = scenario("Scenario for 'Get store assortments by storeId'") .exec(http("request_1") .get("endpoint1") .header("api-key","api-key") .queryParam("param", true) .check(header("continuationToken").optional.saveAs("continuationToken"))) // 加optional避免无header时直接报错 .doWhile(session => session.contains("continuationToken") && session("continuationToken").as[String].nonEmpty) { exec(http("request_2") .get("endpoint1") .header("api-key", "api-key") .queryParam("param", true) .queryParam("continuationToken", "${continuationToken}") // 请求参数里用${}是正确的表达式语法 .check(header("continuationToken").optional.saveAs("continuationToken"))) } setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
关键修改说明
- 把
saveAs("${continuationToken}")改为saveAs("continuationToken"),正确设置会话属性名。 - 在
check中添加.optional,如果响应头没有continuationToken,不会直接报错,而是不设置该属性,避免第一个请求就失败。 - 修改
doWhile条件:先检查会话中是否存在continuationToken,再判断属性值不为空字符串,避免空指针或属性不存在的错误。 - 请求参数里的
${continuationToken}是正确用法,这里是Gatling的表达式语法,用来引用会话中的属性值。
内容的提问来源于stack exchange,提问作者Avirup Das
相关产品推荐
相关产品推荐

