Karate框架测试断言失败时如何清理预先创建的数据库数据?
Karate 框架测试数据自动清理解决方案
Karate 原生提供了场景/Feature级别的后置钩子,专门适配无论测试成功/失败都需要执行清理的场景,是当前问题的最优实现方案,不需要自定义异常捕获逻辑。
1. 单场景测试数据清理(每个Scenario单独创建测试数据)
如果测试数据是每个Scenario执行前创建,只作用于当前单条用例,使用afterScenario钩子实现自动清理:
Feature: 订单接口测试 # 配置后置钩子,无论当前Scenario断言是否失败,执行完都会触发 * configure afterScenario = """ function(){ // 直接调用删除API清理当前场景创建的测试数据 karate.call('delete-order.api', { orderId: createdOrderId }) // 也可以通过JDBC直接执行数据库删除语句 // db.runSql("delete from order where id = ?", createdOrderId) } """ Scenario: 创建订单并校验接口返回 # 步骤1:创建测试数据,把后续清理需要的标识存入变量 * def createResult = call 'create-order.api' * def createdOrderId = createResult.id # 步骤2:调用业务API执行断言(哪怕断言失败,上面的afterScenario也会执行) Given url '/order/get/' + createdOrderId When method get Then status 200 And match response.status == 'PAID'
2. 全局测试数据清理(数据供整个Feature所有用例使用)
如果测试数据是整个Feature执行前创建,供所有Scenario共用,使用afterFeature钩子实现全局清理:
Feature: 商品管理接口测试 * configure afterFeature = """ function(){ karate.call('delete-goods.api', { goodsId: globalGoodsId }) } """ # 整个Feature执行前只创建一次测试数据 Background: * def createResult = call 'create-goods.api' * def globalGoodsId = createResult.id Scenario: 校验商品列表查询接口 ...断言逻辑... Scenario: 校验商品库存修改接口 ...断言逻辑...
注意事项
- 钩子逻辑执行异常不会覆盖原有测试用例的失败原因,Karate会分别记录测试用例本身的执行结果、钩子的执行结果,排查问题不会被干扰
- 调试阶段需要保留测试数据时,可直接加环境变量判断跳过清理,不需要修改核心逻辑
- 社区提到的手动用try-catch包裹所有断言的实现方案可行但极不推荐,会大幅降低测试用例的可读性和可维护性
内容的提问来源于stack exchange,提问作者user17491732
相关产品推荐
相关产品推荐

