You need to enable JavaScript to run this app. Karate中跨场景如何将前序接口响应以JSON形式传递给后续请求
优惠活动
大模型
产品
解决方案
定价
更多

Karate中跨场景如何将前序接口响应以JSON形式传递给后续请求

跨场景传值的核心问题与修正方案

当前脚本存在的两个关键错误

  • 独立场景的变量隔离问题:Karate 默认每个 Scenario 拥有完全独立的执行上下文,通过普通 def 定义的变量仅在当前场景执行周期内有效,场景执行结束后变量会被销毁,后续独立场景根本无法访问,这是传值失败的根本原因。
  • 请求体变量引用语法错误:场景2 中写的 tokenValue : +'passwordLessToken' 是无效语法,单引号包裹的内容会被当成纯字符串传递,Karate 不会解析为变量引用,完全无法读到存储的token值。

具体实现步骤

第一步:用全局持久化方式存储跨场景需要的值

将场景1中普通的局部变量定义,替换为 Karate 提供的全局上下文存储方法,让值可以在同一个Feature文件的所有后续场景中被读取:
原写法:
* def passwordLessToken = response.tokenValue
修改为:
* karate.set('passwordLessToken', response.tokenValue)

第二步:修正场景2的请求体取值逻辑

全局存储的值需要通过 karate.get() 方法读取,再通过 Karate 标准的 #() 占位符语法嵌入请求体,不要使用字符串拼接的写法:

  1. 先在场景2开头把全局存的token取为当前场景的局部变量:
    * def currentPasswordToken = karate.get('passwordLessToken')
  2. 修正原错误的请求体写法,替换为标准占位语法:
    原写法:And request { tokenName : '#(tokenName)', tokenValue : +'passwordLessToken' }
    修改为:And request { tokenName : '#(tokenName)', tokenValue : '#(currentPasswordToken)' }

修正后的完整脚本示例

场景1:用户认证POST接口

Scenario: 无密码流程获取临时认证token
  Given path '/authentication/v1/token/passwordless'
  And headers headers
  And request { username : '#(activeUsername)' }
  When method POST
  Then status 200
  And print response
  * karate.set('passwordLessToken', response.tokenValue)
  And print '全局存储的临时token:', karate.get('passwordLessToken')

场景2:携带临时token换取有效会话

Scenario: 用临时token换取LTPA会话凭证
  Given path '/authentication/v1/token/ltpa'
  And headers withPasswordHeaders
  * def currentPasswordToken = karate.get('passwordLessToken')
  And request { tokenName : '#(tokenName)', tokenValue : '#(currentPasswordToken)' }
  When method POST
  Then status 200
  And print response

可选优化方案

如果不希望用全局状态存值(避免多并行执行时的变量污染),可以把公共认证逻辑抽成独立的可调用片段,在依赖它的场景中通过 call 直接获取返回的token值,不需要依赖全局上下文,更适合可重复执行的测试用例。


内容的提问来源于stack exchange,提问作者Mohamed M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 23:45:05