如何用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作为附件发送 - 可添加测试统计摘要(如总用例数、通过率)
- 选择「HTML格式」,嵌入定制报告的HTML内容;或直接将
- 触发条件:设置为「Always」(无论测试成败都发送)或按需调整
内容的提问来源于stack exchange,提问作者UMADEVI MANIMARAN
相关产品推荐
相关产品推荐

