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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:05:18