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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:37