顺序运行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版本配置变动影响:
- 新建一个总调度用的feature文件,比如
TestSuite.feature,内容如下:
Feature: 测试用例总调度 Scenario: 按顺序执行测试 # 先执行mutation和数据准备 * call read('classpath:features/TestMutationsAndDatabaseSetup.feature') # 前置步骤完成后再执行查询验证 * call read('classpath:features/Queries.feature')
- 调整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
相关产品推荐
相关产品推荐

