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

如何在运行时自动更新Serenity测试报告的ApplicationVersion自定义字段?

解决Serenity报告自定义字段动态更新问题

问题原因

你尝试的三种方法无效,核心原因是Serenity的自定义报告字段report.customfield.ApplicationVersion在**测试启动初期(配置加载阶段)**就已读取并缓存,@Before注解的代码是在测试方法执行前运行,此时报告元数据早已初始化完成,修改系统属性或session元数据无法同步到最终生成的报告中。

可行方案

方案一:通过Serenity生命周期监听器修改元数据

创建自定义监听器,在测试启动的早期阶段更新报告元数据,确保报告生成时能获取到最新版本:

  1. 编写监听器类:
import net.serenitybdd.core.Serenity;
import net.serenitybdd.core.listeners.SerenityLifeCycleListener;
import net.thucydides.core.model.TestOutcome;

public class AppVersionUpdateListener implements SerenityLifeCycleListener {
    @Override
    public void testStarted(TestOutcome testOutcome) {
        // 替换为你的实际版本获取逻辑(比如调用接口、读取配置文件)
        String latestVersion = "1.0.1";
        // 更新Serenity会话元数据,直接关联到报告
        Serenity.getCurrentSession().getMetaData().put("ApplicationVersion", latestVersion);
        // 同步更新系统属性,避免其他依赖该属性的地方出错
        System.setProperty("ApplicationVersion", latestVersion);
    }
}
  1. 注册监听器:
    • 方式一:在serenity.properties中添加配置:
      serenity.listeners=com.yourpackage.AppVersionUpdateListener
      
    • 方式二:在JUnit测试Runner类上添加@Listeners注解:
      import org.junit.runner.RunWith;
      import net.serenitybdd.junit.runners.SerenityRunner;
      import org.junit.runners.model.InitializationError;
      
      @RunWith(SerenityRunner.class)
      @Listeners(AppVersionUpdateListener.class)
      public class YourTestRunner {
          // 测试Runner逻辑
      }
      

方案二:通过Gradle任务提前获取最新版本(推荐)

既然测试频率高,直接在构建阶段通过Gradle任务获取最新版本,再传入系统属性,避免在测试代码中处理版本逻辑:

在build.gradle中添加以下配置:

// 自定义任务:获取应用最新版本
task fetchLatestAppVersion {
    doLast {
        // 替换为你的版本获取逻辑:比如调用REST API、读取远程配置、Git标签等
        def latestVersion = "1.0.1"
        // 将版本号存入项目属性
        project.ext.latestAppVersion = latestVersion
    }
}

// 测试任务依赖版本获取任务,确保先拿到最新版本再执行测试
test.dependsOn fetchLatestAppVersion

test {
    // 将最新版本传入系统属性,Serenity会自动读取并填充到报告字段
    systemProperty "ApplicationVersion", project.latestAppVersion
}

方案三:在测试类的@BeforeClass中更新元数据

如果不想用监听器,可在测试类的@BeforeClass(整个测试类执行前)中修改,确保在报告元数据初始化后尽早更新:

import org.junit.BeforeClass;
import net.serenitybdd.core.Serenity;

public class BaseTest {
    @BeforeClass
    public static void setUpVersion() {
        String latestVersion = "1.0.1";
        Serenity.getCurrentSession().getMetaData().put("ApplicationVersion", latestVersion);
        System.setProperty("ApplicationVersion", latestVersion);
    }
}

所有测试类继承这个BaseTest即可。

验证方法

执行测试后,打开serenity-summary.html,检查ApplicationVersion字段是否显示为最新版本。如果仍有问题,可查看Serenity的日志,确认版本更新逻辑是否在报告生成前执行。

内容的提问来源于stack exchange,提问作者Sparsh Sondhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:40