You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate Framework变量重置问题:调用Feature后为何恢复初始值?

Karate Framework变量作用域问题解析

现象原因

你遇到的问题本质是Karate的作用域快照机制:
当用* def声明变量后,直接赋值variable = 'value2'只是修改了当前场景的局部作用域副本。执行call调用其他场景时,Karate会先对当前作用域拍一个快照,调用结束后自动恢复这个快照,所以之前的局部修改会被回滚,变量变回初始值value1。

三种解决方式的差异

1. 使用karate.set()修改变量

karate.set()是直接操作全局作用域的变量,不是局部快照里的临时副本。不管后续有没有call操作,全局变量的修改都会被永久保留,不会被快照回滚覆盖。
修改后的核心代码:

* if(condition) karate.set('variable', 'value2')

2. 将调用结果存入变量

默认的call(不存结果)会触发快照恢复,但如果把调用结果用def存入变量,Karate会执行作用域合并逻辑:调用场景的作用域会和当前场景的作用域合并,而不是直接恢复快照。这种情况下,当前场景的局部变量修改会被保留,不会被重置。
修改后的核心代码:

* def dummyResult = call read('test.feature@callable-scenario')

3. 向被调用场景传递该变量

只要把变量作为参数传递给被调用场景,Karate就会标记这个变量为“跨场景共享”,调用结束后不会重置它的状态——哪怕被调用场景根本没用到这个变量。传递操作相当于告诉Karate:这个变量的修改需要被保留,不能回滚。
修改后的核心代码:

* call read('test.feature@callable-scenario') { variable: variable }

原示例与输出对比

初始代码

Feature: Variable Scope

  Scenario: Check variable scope
    * def variable = 'value1'
    * def condition = true
    * if(condition) variable = 'value2'
    * call read('test.feature@callable-scenario')
    * print 'variable value:', variable
    * match variable == 'value2'

  @callable-scenario
  Scenario: Just print
    * print 'hello'

初始输出:

hello
variable value: value1

修改后输出(三种方式均适用)

hello
variable value: value2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:12:07