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

顺序运行Karate测试时如何实现数据库数据跨测试用例持久化

根因说明

针对你首先要确认的feature执行顺序问题:你的预期执行顺序确实没有生效。你当前通过链式调用.feature()方法传入多个测试文件的写法,Karate默认会以并行模式执行这些feature,执行顺序是随机的,不会按照你添加的顺序串行运行,这是导致后续Queries.feature读不到前置数据的核心原因之一。

实现指定顺序串行执行的方案

方案1:调整Karate启动参数强制串行

直接在Karate实例上设置并行数为1,即可保证feature按照你添加的顺序执行,修改后的测试代码如下:

@SpringBootTest(classes=ApplicationTest.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RunUnitCukeTest implements InitializingBean {
    @LocalServerPort
    int port;

    @Karate.Test
    Karate runTest() {
        return new Karate()
                .parallel(1) // 强制所有feature串行执行
                .feature("classpath:features/TestMutationsAndDatabaseSetup.feature")
                .feature("classpath:features/Queries.feature");
    }
}

方案2:通过父feature管控执行顺序(更稳定)

这种方式兼容性更好,不会受Karate版本配置变动影响:

  1. 新建一个总调度用的feature文件,比如TestSuite.feature,内容如下:
Feature: 测试用例总调度
  Scenario: 按顺序执行测试
    # 先执行mutation和数据准备
    * call read('classpath:features/TestMutationsAndDatabaseSetup.feature')
    # 前置步骤完成后再执行查询验证
    * call read('classpath:features/Queries.feature')
  1. 调整Java测试代码,只加载这个总调度feature即可:
@Karate.Test
Karate runTest() {
    return new Karate().feature("classpath:features/TestSuite.feature");
}

数据可见性问题排查

如果调整执行顺序后仍然读不到H2数据,请检查以下两项配置:

  • 确认H2数据库配置添加了DB_CLOSE_DELAY=-1参数,保证内存数据库不会在连接断开后自动销毁,全局共享同一个实例,配置参考:
    spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
    spring.datasource.driver-class-name=org.h2.Driver
    
  • 确认你的测试类没有加@Transactional注解,Spring如果检测到测试类加了该注解,会在测试方法执行完成后自动回滚所有数据库操作,导致后续步骤看不到写入的数据。

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:05