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
相关产品推荐
相关产品推荐

