Karate 1.3.1重试失败场景时出现@setup步骤匹配错误问题
Karate重试@setup生成的失败示例场景时出现步骤匹配错误
问题复现
通过@setup场景生成Scenario Outline的示例列表,首次测试因第一条示例value=2不满足断言失败,执行重试逻辑时触发步骤匹配错误。仅当第一条示例失败时出现该问题,其他示例失败重试正常。
Feature文件代码
Feature: Test Sample Background: @setup Scenario: Setup * print 'Setup' * def examples = [{value:2},{value:1}] @tag1 Scenario Outline: Scenario * print "Scenario <value>" * match value == 1 @tag2=1367591 Examples: | karate.setupOnce().examples |
JUnit执行与重试代码
测试执行代码:
Results results = Karate.run("classpath:examples").parallel(2);
失败场景重试代码:
for (ScenarioResult scenarioResult : results.getScenarioResults().collect(Collectors.toList())) { if (scenarioResult.isFailed()) { ScenarioResult retryScenarioResult = results.getSuite().retryScenario(scenarioResult.getScenario()); results = results.getSuite().updateResults(retryScenarioResult); } }
错误日志
09:42:18.953 [main] ERROR com.intuit.karate - classpath:examples/features/SampleTest.feature:19 * @setup no step-definition method match found for: @setup classpath:examples/features/SampleTest.feature:19
环境说明
- Karate版本:1.3.1
- 已尝试
karate.setup()和karate.setupOnce()两种示例加载方式,问题一致
解决办法
方法1:修改重试逻辑,跳过@setup场景
问题根源是重试机制误将@setup标签识别为步骤执行,因此在重试时跳过带有@setup标签的场景即可:
for (ScenarioResult scenarioResult : results.getScenarioResults().collect(Collectors.toList())) { // 仅重试非@setup的失败场景 if (scenarioResult.isFailed() && !scenarioResult.getScenario().getTags().contains("@setup")) { ScenarioResult retryScenarioResult = results.getSuite().retryScenario(scenarioResult.getScenario()); results = results.getSuite().updateResults(retryScenarioResult); } }
方法2:升级Karate版本
Karate 1.4及后续版本已修复该重试时的标签解析bug,升级版本后可直接使用原有重试逻辑。
方法3:替换@setup的使用方式
改用直接在Examples表格定义数据,或通过call加载外部数据文件的方式生成示例,避免依赖@setup的场景重试冲突。
内容的提问来源于stack exchange,提问作者Ramneesh Vaidyambath
相关产品推荐
相关产品推荐

