You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:57:26