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 标准的 #() 占位符语法嵌入请求体,不要使用字符串拼接的写法:
- 先在场景2开头把全局存的token取为当前场景的局部变量:
* def currentPasswordToken = karate.get('passwordLessToken') - 修正原错误的请求体写法,替换为标准占位语法:
原写法: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
相关产品推荐
相关产品推荐

