Karate经TestRunner运行时如何获取失败场景名、步骤等测试详情
Karate获取细粒度测试结果的实现方案
你当前使用的Results类是测试结果的聚合入口,Karate原生提供了完整的层级化结果对象,可直接从Results实例逐层拆解获取用例状态、失败场景、失败步骤等细粒度数据,无需额外引入第三方组件。
核心结果对象层级
Karate的测试结果按执行单元做了四层拆分,对应关系如下:
- 顶层
Results:全局执行结果聚合,调用getFeatureResults()方法可获取所有Feature文件对应的FeatureResult实例列表 - 第二层
FeatureResult:对应单个Feature文件的执行结果,可通过getScenarioResults()获取文件下所有场景(含Scenario Outline拆分出的每一行示例场景)的ScenarioResult实例列表 - 第三层
ScenarioResult:对应单个可执行测试场景,可获取场景名称、所属文件路径、执行状态、标签、耗时、关联异常等信息,调用getStepResults()可获取场景内所有步骤的StepResult实例列表 - 第四层
StepResult:对应场景内单条执行步骤,可获取步骤原文、行号、执行状态、耗时、步骤抛出的异常栈等最细粒度数据
代码实现示例
Results results = Runner.path("classpath:errorData/pass.feature").parallel(5); // 遍历所有Feature级结果 for (FeatureResult featureResult : results.getFeatureResults()) { String featurePath = featureResult.getFeature().getPath(); String featureName = featureResult.getFeature().getName(); long featureCost = featureResult.getDurationMillis(); boolean featureIsFail = featureResult.isFailed(); // 遍历当前Feature下所有场景 for (ScenarioResult scenarioResult : featureResult.getScenarioResults()) { String scenarioName = scenarioResult.getScenario().getName(); // 场景状态枚举值:PASSED/FAILED/SKIPPED String scenarioStatus = scenarioResult.getStatus().name(); int scenarioLine = scenarioResult.getScenario().getLine(); List<String> scenarioTags = scenarioResult.getScenario().getTags(); long scenarioCost = scenarioResult.getDurationMillis(); Throwable scenarioError = scenarioResult.getError(); // 仅提取失败场景的步骤详情 if (scenarioResult.isFailed()) { System.out.printf("失败场景:%s | 所属Feature:%s | 场景行号:%d%n", scenarioName, featurePath, scenarioLine); // 遍历场景内所有步骤 for (StepResult stepResult : scenarioResult.getStepResults()) { String stepText = stepResult.getStep().getText(); String stepStatus = stepResult.getStatus().name(); int stepLine = stepResult.getStep().getLine(); long stepCost = stepResult.getDurationMillis(); Throwable stepError = stepResult.getError(); // 打印失败步骤明细 if (stepResult.isFailed()) { System.out.printf(" 失败步骤:%s | 步骤行号:%d | 错误信息:%s%n", stepText, stepLine, stepError.getMessage()); } } } } }
注意事项
- 上述API在Karate 1.0及以上版本为稳定公开接口,无需通过反射访问内部私有属性
- Scenario Outline生成的参数化场景,每个示例行都会生成独立的
ScenarioResult实例,可通过getScenario().getExampleIndex()获取对应示例行序号,不会与普通场景混淆 - 若需要自定义报告格式,可直接遍历上述层级对象提取数据,按业务需求落盘即可,不依赖Karate自带的报告模块
- 跳过、通过状态的场景和步骤均可通过相同遍历逻辑获取数据,无需额外适配
内容的提问来源于stack exchange,提问作者Sushma Indrani
相关产品推荐
相关产品推荐

