如何让Karate中@setup场景在所有场景中仅执行一次?
实现单个Feature文件中@setup场景仅执行一次的方案
核心思路
利用karate.setupOnce()的特性,将初始化逻辑封装在@setup场景中,确保整个Feature文件执行周期内,初始化操作仅运行一次,所有Scenario Outline共享这一次的初始化结果。
具体实现步骤
- 定义@setup场景
在Feature文件开头添加带@setup标签的场景,用karate.setupOnce()包裹你的初始化逻辑(比如获取测试数据、初始化环境等),并将需要共享的数据存入karate.setup()上下文:
@setup Scenario: 全局初始化 * def initData = karate.setupOnce(() => { // 这里写你的初始化逻辑,比如调用接口、读取配置 return { kittens: ['波斯猫', '橘猫', '布偶猫'] } }) * karate.set('setup', initData)
- 在多个Scenario Outline中使用初始化数据
每个Scenario Outline的Examples里,直接引用karate.setup()中的数据即可,setupOnce已经确保初始化逻辑仅执行过一次:
Scenario Outline: 测试猫咪列表1 * print '当前测试猫咪:', kitten * # 你的测试步骤 Examples: | kitten | | karate.setup().kittens[0] | | karate.setup().kittens[1] | Scenario Outline: 测试猫咪列表2 * print '当前测试猫咪:', kitten * # 你的测试步骤 Examples: | kitten | | karate.setup().kittens[1] | | karate.setup().kittens[2] |
关键说明
karate.setupOnce()接收一个lambda表达式,里面的代码只会在第一次被调用时执行,后续调用直接返回第一次的执行结果。- 把初始化结果存入
karate.setup()上下文后,所有场景都能通过karate.setup().xxx访问到共享数据。 - 整个Feature文件执行时,
@setup场景会自动在所有测试场景前触发,而setupOnce保证了初始化逻辑仅运行一次,不受Scenario Outline数量或用例条数影响。
内容的提问来源于stack exchange,提问作者Nagulan S
相关产品推荐
相关产品推荐

