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

如何编程计算Karate测试通过率并在GitLab CI/CD中自动化评估?

1. 编程方式获取Karate测试特性/场景通过率

通过Karate Java API直接统计

Karate的Java测试API支持在执行测试后直接获取结果数据,无需额外解析文件:

  • 用Runner类执行指定路径下的特性文件,获取Results对象,从中提取总场景数、失败场景数计算通过率:
// 执行测试套件
Results testResults = Runner.path("classpath:com/your/project/features")
    .tags("~@skip") // 排除标记为@skip的用例
    .parallel(4); // 并行执行线程数

// 计算场景级通过率
int totalScenarios = testResults.getScenariosTotal();
int failedScenarios = testResults.getScenariosFailed();
double scenarioPassRate = ((totalScenarios - failedScenarios) * 100.0) / totalScenarios;

// 计算特性级通过率
int totalFeatures = testResults.getFeaturesTotal();
int failedFeatures = testResults.getFeaturesFailed();
double featurePassRate = ((totalFeatures - failedFeatures) * 100.0) / totalFeatures;

// 输出结果
System.out.printf("场景通过率: %.2f%%\n特性通过率: %.2f%%", scenarioPassRate, featurePassRate);

解析Karate生成的JSON报告

Karate默认会在target/karate-reports目录下生成karate-summary.json报告文件,你可以读取该文件解析统计数据:

  • 以Java为例,用Jackson解析JSON:
File reportFile = new File("target/karate-reports/karate-summary.json");
ObjectMapper mapper = new ObjectMapper();
JsonNode reportData = mapper.readTree(reportFile);

int totalScenarios = 0;
int passedScenarios = 0;

// 遍历所有特性统计数据
for (JsonNode feature : reportData.get("features")) {
    int featureTotal = feature.get("scenariosTotal").asInt();
    int featureFailed = feature.get("scenariosFailed").asInt();
    totalScenarios += featureTotal;
    passedScenarios += (featureTotal - featureFailed);
}

double passRate = (passedScenarios * 100.0) / totalScenarios;
System.out.printf("整体测试通过率: %.2f%%", passRate);

2. GitLab CI/CD中自动化评估通过率并控制流水线

要实现通过率评估并决定是否推进部署,需要分三步配置:

第一步:执行Karate测试并保留报告

在.gitlab-ci.yml中定义测试阶段,执行测试后将报告文件作为工件保留:

stages:
  - test
  - validate-test-results
  - deploy

run-karate-tests:
  stage: test
  image: maven:3.8.6-openjdk-11
  script:
    # 用Maven执行Karate测试,生成JSON报告
    - mvn test -Dkarate.options="--tags ~@skip"
  artifacts:
    paths:
      - target/karate-reports/karate-summary.json
    expire_in: 7 days # 报告保留7天

第二步:编写脚本评估通过率

新增一个验证阶段,用脚本解析JSON报告,设置通过率阈值(比如要求95%),不满足则终止流水线:

validate-test-pass-rate:
  stage: validate-test-results
  needs: ["run-karate-tests"]
  image: node:18-alpine
  script:
    - |
      REPORT_PATH="target/karate-reports/karate-summary.json"
      # 检查报告是否存在
      if [ ! -f "$REPORT_PATH" ]; then
        echo "ERROR: Karate测试报告不存在,流水线终止"
        exit 1
      fi

      # 用Node.js解析报告计算通过率
      PASS_RATE=$(node -e "
        const report = require('./$REPORT_PATH');
        let total = 0, passed = 0;
        report.features.forEach(f => {
          total += f.scenariosTotal;
          passed += f.scenariosTotal - f.scenariosFailed;
        });
        console.log(((passed / total) * 100).toFixed(2));
      ")

      echo "当前测试通过率: $PASS_RATE%"

      # 设置通过率阈值,可根据需求调整
      REQUIRED_RATE=95.0
      # 用bc做浮点比较
      if (( $(echo "$PASS_RATE < $REQUIRED_RATE" | bc -l) )); then
        echo "ERROR: 测试通过率低于要求的 $REQUIRED_RATE%,流水线终止"
        exit 1
      else
        echo "测试通过率符合要求,继续执行后续阶段"
      fi

第三步:控制部署阶段的执行

让部署阶段依赖验证阶段,只有验证通过才会触发部署:

deploy-to-production:
  stage: deploy
  needs: ["validate-test-pass-rate"]
  script:
    - echo "开始执行生产环境部署..."
    # 这里添加你的部署命令,比如kubectl apply、docker push等
  only:
    - main # 仅在main分支触发部署

内容的提问来源于stack exchange,提问作者Shreyansh Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:13:12