使用Karate开展BDD测试时如何将数据载入内存数据库
Karate 内存数据库测试数据写入实现方案
Karate 没有传统 Cucumber 定义 StepDef 的要求,但提供了更灵活的扩展能力,完全可以实现你需要的测试数据预写入逻辑,常用的实现方式有三种:
- 方案1:直接在Feature中调用自定义Java工具类
Karate 原生支持调用任意Java代码,你可以先封装一个JDBC工具类,实现内存数据库连接、批量插入数据的静态方法,之后直接在Feature文件中调用即可。比如你封装了com.yourpackage.DbUtil类,提供batchInsert(List<Map> data)静态方法,使用方式如下:
内存数据库(比如H2、HSQLDB)的连接参数可以直接配置在工具类中,也可以从Karate配置变量读取,测试生命周期结束后内存库会自动清理数据,不需要额外做资源释放。# 引入Java工具类 * def DbUtil = Java.type('com.yourpackage.DbUtil') # 直接引用当前Feature中Examples的所有测试数据 * def testData = Examples # 执行批量插入 * DbUtil.batchInsert(testData) - 方案2:用Karate自带JDBC能力免封装实现
Karate 0.9.5及以上版本自带了JDBC操作工具,不需要自己封装Java代码,直接在Feature中配置数据源即可执行插入操作:
所有逻辑都可以在Feature文件内完成,和你的GraphQL测试逻辑放在同一个文件里,维护更方便。# 配置内存H2数据库连接 * def dbConfig = { url: 'jdbc:h2:mem:testdb', driverClassName: 'org.h2.Driver', username: 'sa', password: '' } * def db = Karate.getDb(dbConfig) # 从Examples读取数据循环插入 * def insertSql = "INSERT INTO user (id, name, mobile) VALUES (?, ?, ?)" * each row in Examples * db.update(insertSql, row.id, row.name, row.mobile) - 方案3:抽离公共初始化逻辑复用
如果多个Feature都需要用到数据库初始化能力,可以把插入逻辑抽成独立的公共Feature文件,比如init-test-db.feature,其他测试用例通过call关键字复用:
你后续的GraphQL查询请求直接基于预写入内存库的测试数据执行即可,和之前Cucumber StepDef的使用体验一致。# 业务测试Feature开头调用初始化脚本,传入当前Examples的测试数据 * call read('classpath:common/init-test-db.feature') { testData: '#(Examples)' }
补充说明:如果需要每个Scenario的数据隔离,只需要在Scenario执行完成后执行一次表清空SQL,或者给每个场景生成独立的内存库实例即可。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

