Karate 2.0迁移后Scenario Outline变量结合callonce()使用异常问题
Karate 2.0.9中callonce导致Scenario Outline变量异常的原因
现象回顾
将Karate从1.5.2升级到2.0.9后,在Background中使用callonce()时,Scenario Outline的Examples变量出现异常:
- 用
<variable>插值的输出正常跟随每个示例行变化 - 直接引用
variable时,始终停留在第一个示例的值(a) - 移除
callonce()步骤后,两种变量引用方式都恢复正常
示例Feature文件:
Feature: test Background: * callonce read("../helpers/test.feature") Scenario Outline: test * print 'Variable: ' + '<variable>' * print 'Variable: ' + variable Examples: | variable | | a | | something |
辅助Feature文件test.feature:
Feature: test Scenario: test * print 'callonce executed'
异常输出(第二组示例):
13:56:23.028 [main] INFO - Variable: something 13:56:23.028 [main] INFO - Variable: a
原因分析
这个问题是Karate 2.x版本对callonce的执行逻辑和上下文绑定做了关键调整导致的:
- callonce的全局执行特性:Karate 2.0+中
callonce会全局仅执行一次,执行时机是在第一个Scenario Outline实例初始化阶段。此时第一个示例的variable=a已经被绑定到当前上下文,callonce会将这个上下文快照并全局保留。 - 变量引用的优先级变化:后续Scenario Outline实例执行时,直接引用
variable会优先从callonce创建的全局上下文读取值,而不是当前实例的示例变量;但<variable>是Karate的动态插值语法,会在每个实例执行时直接替换为当前行的示例值,不受全局上下文快照的影响。 - 1.5.2版本的差异:在1.5.2中,
callonce的作用域更贴近Scenario Outline的每个实例生命周期,变量绑定逻辑不会捕获全局上下文,因此不会出现变量被“固定”的问题。
内容的提问来源于stack exchange,提问作者Szilard Dezso
相关产品推荐
相关产品推荐

