Karate如何在FB Feature文件SB场景调用FA文件SA场景的变量VA
Karate跨Feature场景传递运行时变量的可行方案
Karate默认做了场景隔离,独立场景之间不会自动共享运行时生成的变量,也不推荐硬写跨场景强依赖的逻辑,根据实际业务场景可以选下面三种实现方式:
方案1:抽离公共逻辑为可复用片段(官方推荐,无顺序依赖)
如果VA的生成逻辑不依赖SA的全流程执行,把生成VA的步骤抽成独立的公共Feature文件,SA、SB按需调用即可,还能通过callSingle避免重复执行生成逻辑。
- 新建公共逻辑文件
common/gen-va.feature,存放VA生成逻辑
Feature: 生成公共变量VA Scenario: # 原SA中生成VA的全部步骤放这里 * def VA = "运行时生成的VA实际值"
- 原FA文件的SA场景中,直接调用公共文件,原有逻辑不用改
Scenario: SA * call read('common/gen-va.feature') # 原有SA的其他业务步骤,可直接使用VA变量
- FB文件的SB场景中,调用公共文件拿返回值初始化VB
Scenario: SB # callSingle会缓存执行结果,同一次测试周期内只会执行一次生成逻辑 * def commonRes = callSingle read('common/gen-va.feature') * def VB = commonRes.VA
这种方式不管是单独跑SB,还是和SA并行执行,都能正常拿到值,没有执行顺序依赖,稳定性最高。
方案2:全局属性传值(适合强顺序依赖的流程类测试)
如果VA必须等SA全流程执行完才能生成(比如SA执行创建流程返回的单据ID、token这类上下文值),可以用Karate自带的全局运行时容器存值,注意这个方式仅在同一次测试执行的JVM进程内生效,必须保证SA先于SB执行。
- SA中生成VA后,将值存入全局属性
* karate.set('globalVA', VA)
- SB中直接读取全局属性初始化VB
Scenario: SB * def VB = karate.get('globalVA')
注意:使用这个方案要关闭场景并行执行,在测试执行配置中明确指定FA在FB之前运行,否则会出现拿不到值的问题,仅适合端到端串测场景。
方案3:本地文件中转(适合跨执行批次的传值)
如果SA和SB是分两次独立测试执行运行的(比如SA在前置任务跑,SB在后续任务跑),可以通过本地临时文件做值中转。
- SA生成VA后写入本地文件
* karate.write(VA, 'target/temp/va.tmp')
- SB运行时读取文件内容初始化VB
Scenario: SB * def VB = karate.read('target/temp/va.tmp')
内容的提问来源于stack exchange,提问作者astar
相关产品推荐
相关产品推荐

