Karate框架如何让@setup场景仅执行一次?
解决Karate中@setup场景重复执行的问题
针对两个Scenario Outline调用@setup导致其重复执行的问题,以下是几种高效解决方案:
方案1:在@setup场景中添加存在性判断
修改@setup的Scenario逻辑,通过全局变量判断数据是否已初始化,避免重复执行核心逻辑:
@setup Scenario: # 仅当全局变量data不存在时才初始化 if (!karate.exists('data')) { def data = [{a: 1}, {a: 2}, {a: 3}] karate.set('data', data) # 将数据存入全局变量 } Scenario Outline: row print 'a: ', a Examples: | karate.get('data') | # 直接引用全局变量 Scenario Outline: test row - print 'test a: ', a Examples: | karate.get('data') |
即便@setup被触发两次,核心的数据初始化逻辑只会执行一次。
方案2:使用karate.callSingle()复用setup逻辑
将setup逻辑抽离到单独的Feature文件,通过karate.callSingle()调用确保只执行一次:
第一步:创建独立的setup.feature
Feature: 全局数据初始化 Scenario: def data = [{a: 1}, {a: 2}, {a: 3}] return data
第二步:在主Feature中调用
Feature: # 初始化全局变量,确保只执行一次 * def globalData = karate.callSingle('classpath:setup.feature') Scenario Outline: row print 'a: ', a Examples: | globalData | Scenario Outline: test row - print 'test a: ', a Examples: | globalData |
karate.callSingle()会保证传入的脚本无论被引用多少次,都只会执行一次。
方案3:通过config.js初始化全局数据
在Karate的config.js中提前初始化全局数据,所有Feature执行前就会完成初始化,无需使用@setup标签:
修改config.js
function fn() { var config = { // 其他配置项 }; // 初始化全局数据 karate.set('globalData', [{a: 1}, {a: 2}, {a: 3}]); return config; }
主Feature中直接引用
Feature: Scenario Outline: row print 'a: ', a Examples: | karate.get('globalData') | Scenario Outline: test row - print 'test a: ', a Examples: | karate.get('globalData') |
这种方式适合需要在所有测试用例中共享的数据初始化场景。
内容的提问来源于stack exchange,提问作者lovelemon
相关产品推荐
相关产品推荐

