通过Main类运行JUnit5+Serenity+Cucumber无法生成报告的解决方法
问题:Serenity+Cucumber迁移JUnit5后,Jar运行无法生成HTML报告?
我有一个运行E2E测试的项目,此前将其打包为.jar文件上传至测试环境执行测试,该项目基于Serenity+Cucumber实现。现计划迁移至JUnit5,通过如下Main方法启动测试:
public static void main(String args[]) throws IOException { Launcher launcher = LauncherFactory.create(); SummaryGeneratingListener summaryGeneratingListener = new SummaryGeneratingListener(); LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors(selectClass(AllTests.class)) .build(); launcher.execute( request, summaryGeneratingListener); boolean wasSuccessful = summaryGeneratingListener.getSummary().getFailures().isEmpty(); HtmlAggregateStoryReporter reporter = new HtmlAggregateStoryReporter("default"); File reportTarget = new File("target"); reporter.setOutputDirectory(reportTarget); reporter.setGenerateTestOutcomeReports(); reporter.generateReportsForTestResultsFrom(reportTarget); if (!wasSuccessful) { System.exit(1); } else { if (isAutomaticRetryThresholdBreached()) { System.exit(1); } System.exit(0); } }
当前代码可正常执行测试,但无法生成Serenity HTML报告。我已通过maven-surefire-plugin成功生成报告,但希望以.jar形式运行测试,请问如何修改代码以实现报告生成?
解决方案
核心问题是:通过JUnit5 Launcher手动执行测试时,未注册Serenity专属监听器,导致Serenity无法捕获测试执行数据,进而无法生成报告。以下是具体修改方案:
1. 注册Serenity的JUnit5监听器
在测试执行流程中添加Serenity的监听器,让它能同步收集测试结果。同时启用Serenity的JUnit5扩展,确保测试数据能被正确捕获。修改后的代码如下:
public static void main(String args[]) throws IOException { Launcher launcher = LauncherFactory.create(); SummaryGeneratingListener summaryGeneratingListener = new SummaryGeneratingListener(); // 新增:初始化Serenity的JUnit5监听器 SerenityJUnit5Listener serenityListener = new SerenityJUnit5Listener(); LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors(selectClass(AllTests.class)) // 启用Serenity的JUnit5扩展 .extensions(ExtensionSelectors.selectExtension(SerenityJUnit5Extension.class)) .build(); // 执行测试时传入Serenity监听器 launcher.execute( request, summaryGeneratingListener, serenityListener); boolean wasSuccessful = summaryGeneratingListener.getSummary().getFailures().isEmpty(); HtmlAggregateStoryReporter reporter = new HtmlAggregateStoryReporter("default"); File reportTarget = new File("target/site/serenity"); reporter.setOutputDirectory(reportTarget); reporter.setGenerateTestOutcomeReports(); // 替换生成逻辑:基于实时收集的测试数据生成报告,而非读取文件 reporter.generateReports(); if (!wasSuccessful) { System.exit(1); } else { if (isAutomaticRetryThresholdBreached()) { System.exit(1); } System.exit(0); } }
2. 确保打包配置正确
使用maven-shade-plugin打包可执行Jar时,需包含所有Serenity依赖,并合并必要的配置文件,避免运行时缺失依赖或配置。示例Maven配置片段:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 指定你的Main类全路径 --> <mainClass>com.yourpackage.YourTestMainClass</mainClass> </transformer> <!-- 合并JUnit监听器配置,确保Serenity监听器被识别 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/services/org.junit.platform.launcher.TestExecutionListener</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
3. 检查Serenity基础配置
确保src/main/resources/serenity.properties中包含报告相关配置:
# 指定报告输出目录,需与代码中路径一致 serenity.outputDirectory=target/site/serenity # 启用HTML和JSON报告生成 serenity.reporting.html=true serenity.reporting.json=true
内容的提问来源于stack exchange,提问作者user1819111
相关产品推荐
相关产品推荐

