如何编程计算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
相关产品推荐
相关产品推荐

