如何在Karate所有feature文件执行完毕后调用API?
Karate全局后置清理方案(所有Feature执行完后删除共享用户)
方法1:借助测试框架的全局生命周期钩子(推荐)
Karate本身没有全局后置钩子,但可以通过它集成的JUnit/TestNG实现全局清理。以JUnit 5为例:
- 编写一个测试套件类,把所有需要运行的Feature纳入其中
- 在类中添加带
@AfterAll注解的方法,该方法会在所有测试执行完毕后自动触发 - 在这个方法里,要么直接调用API删除用户,要么调用Karate执行专门的清理Feature
示例代码:
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.TestInstance; import com.intuit.karate.junit5.Karate; @TestInstance(TestInstance.Lifecycle.PER_CLASS) @DisplayName("测试套件") public class TestSuite { @Karate.Test Karate runAllFeatures() { return Karate.run("classpath:features/").relativeTo(getClass()); } @AfterAll void cleanUpUsers() { // 方式1:直接用Java代码调用删除API // 读取之前存在全局变量/系统属性里的用户ID列表,遍历调用删除接口 // 方式2:调用Karate的清理Feature String createdUsers = System.getProperty("createdUsers"); Karate karate = Karate.run("classpath:features/cleanup-users.feature") .systemProperty("createdUsers", createdUsers) .relativeTo(getClass()); karate.results(); // 确保清理逻辑执行完成 } }
方法2:用Karate全局变量存储用户信息,配合清理Feature
- 在
karate-config.js里初始化全局数组,用来存创建的用户ID:var config = { baseUrl: 'http://your-api-url' }; karate.set('createdUsers', []); // 全局变量存储用户ID列表 return config; - 每次创建用户后,把ID加入这个全局数组:
* def userId = response.id * karate.set('createdUsers', karate.get('createdUsers').concat(userId)) - 最后通过测试框架钩子或单独运行清理Feature,遍历数组删除所有用户:
Feature: 清理测试用户 Scenario: 删除所有创建的测试用户 * def users = karate.get('createdUsers') * karate.forEach(users, function(user) { karate.call('delete-user.feature', { userId: user }) } )
注意事项
- 确保用户信息能在全局范围传递,比如用
karate.set()存全局变量,或者存入系统属性 - 如果是并行测试,要注意线程安全,避免用户信息串库
内容的提问来源于stack exchange,提问作者Marie Lem
相关产品推荐
相关产品推荐

