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

如何用Karate生成含多Feature文件场景的定制测试日报并通过Jenkins邮件发送

实现定制化测试报告并通过Jenkins自动推送方案

一、定制符合需求的测试报告

基于你现有的Karate/Cucumber框架,需要自定义报告逻辑来捕获客户要求的字段(测试用例名称、状态、运行时长、失败原因),推荐两种实现方式:

1. Karate自定义报告器(优先选择,适配Karate生态)

Karate提供了Reporter接口,可通过实现该接口捕获每个测试场景的运行数据,再用模板引擎生成定制报告:

  • 编写自定义报告类,实现Reporter接口,重点重写scenarioEnd和suiteEnd方法:
public class CustomTestReporter implements Reporter {
    private List<TestCaseResult> testResults = new ArrayList<>();

    @Override
    public void scenarioEnd(ScenarioResult scenario) {
        TestCaseResult result = new TestCaseResult();
        // 捕获测试用例名称
        result.setCaseName(scenario.getScenario().getName());
        // 捕获状态(PASSED/FAILED/SKIPPED)
        result.setStatus(scenario.getStatus().name());
        // 捕获运行时长(转成秒,更易读)
        result.setDuration(String.format("%.2f s", scenario.getDuration() / 1000.0));
        // 捕获失败原因(仅失败场景)
        if (scenario.isFailed()) {
            Throwable error = scenario.getError();
            // 截取关键错误信息,避免栈过长
            result.setFailureReason(error.getMessage() + "\n" + error.getStackTrace()[0]);
        }
        testResults.add(result);
    }

    @Override
    public void suiteEnd() {
        // 用Freemarker/Thymeleaf渲染HTML模板,生成最终报告
        generateHtmlReport(testResults);
    }

    private void generateHtmlReport(List<TestCaseResult> results) {
        // 示例:加载HTML模板,填充数据后输出到target/custom-report.html
    }
}
  • 在karate-config.js中注册该报告器:
karate.configure('reporter', new com.yourpackage.CustomTestReporter());

2. Cucumber自定义插件(适配Cucumber生态)

如果更熟悉Cucumber插件机制,可实现EventListener监听测试事件:

  • 编写插件类,监听ScenarioFinished事件收集数据,在TestRunFinished事件触发时生成报告:
public class CustomCucumberPlugin implements EventListener {
    private List<TestCaseResult> testResults = new ArrayList<>();

    @Override
    public void setEventPublisher(EventPublisher publisher) {
        publisher.registerHandlerFor(ScenarioFinished.class, this::handleScenarioFinished);
        publisher.registerHandlerFor(TestRunFinished.class, this::handleTestRunFinished);
    }

    private void handleScenarioFinished(ScenarioFinished event) {
        Scenario scenario = event.getScenario();
        TestCaseResult result = new TestCaseResult();
        result.setCaseName(scenario.getName());
        result.setStatus(scenario.getStatus().name());
        result.setDuration(String.format("%.2f s", scenario.getDuration().toMillis() / 1000.0));
        if (scenario.getStatus() == Status.FAILED) {
            result.setFailureReason(scenario.getError().get().getMessage());
        }
        testResults.add(result);
    }

    private void handleTestRunFinished(TestRunFinished event) {
        generateHtmlReport(testResults);
    }
}
  • 在Cucumber运行器中指定该插件:
@CucumberOptions(plugin = {"com.yourpackage.CustomCucumberPlugin"})
public class TestRunner {}

二、Jenkins自动运行与邮件推送

1. 配置定时任务

在Jenkins任务的构建触发器中选择「Build periodically」,填入Cron表达式实现每日自动运行,例如:

  • 0 9 * * *:每天早上9点执行测试

2. 执行测试命令

在构建步骤中添加Shell/PowerShell命令,触发测试并生成定制报告:

# Maven示例,确保报告输出到指定目录
mvn test -Dtest=TestRunner -Dkarate.output.dir=target/test-reports

3. 配置邮件推送

安装Jenkins「Email Extension Plugin」(邮件扩展插件),在构建后操作中添加「Editable Email Notification」:

  • 设置收件人:填写客户邮箱地址
  • 邮件主题:每日测试状态报告:${BUILD_STATUS} - ${PROJECT_NAME}
  • 邮件内容:
    • 选择「HTML格式」,嵌入定制报告的HTML内容;或直接将target/custom-report.html作为附件发送
    • 可添加测试统计摘要(如总用例数、通过率)
  • 触发条件:设置为「Always」(无论测试成败都发送)或按需调整

内容的提问来源于stack exchange,提问作者UMADEVI MANIMARAN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:41:03