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

Cucumber执行完测试用例后如何将动态生成的ExtentReport邮件发送给相关方

问题解答

问题1:如何成功挂载动态生成目录下的报告作为邮件附件

你现有代码的核心问题是附件路径拼接逻辑错误,硬编码了folderPath字符串,没有读取实际生成的动态目录路径,修正方案如下:

  • 直接使用@BeforeClass中已经初始化完成的reportPath文件对象的绝对路径,不需要手动拼接路径
  • 附件命名必须加上.html后缀,避免接收方无法正常打开报告文件
  • 新增文件存在性校验,提前捕获报告未生成的异常
  • 如果你的ExtentReport包含嵌入的本地截图,建议将整个时间戳报告目录打包为zip文件后作为附件发送,否则单独发送的html文件无法加载本地路径的截图

修正后的发邮件代码参考:

@AfterClass
public static void SendEmail() throws EmailException {
    // 先确认报告已完全写入磁盘
    if (CustomFormatter.getReportInstance() != null) {
        CustomFormatter.getReportInstance().flush();
    }
    // 校验报告文件存在性
    if (!reportPath.exists()) {
        throw new RuntimeException("测试报告未生成,路径:" + reportPath.getAbsolutePath());
    }
    // 创建附件
    EmailAttachment attachment = new EmailAttachment();
    // 直接取报告的绝对路径,无需手动拼接
    attachment.setPath(reportPath.getAbsolutePath());
    attachment.setDisposition(EmailAttachment.ATTACHMENT);
    attachment.setDescription("测试执行报告");
    // 附件名加.html后缀
    attachment.setName("自动化测试执行报告.html");

    // 发邮件配置
    MultiPartEmail email = new MultiPartEmail();
    email.setHostName("smtp.gmail.com");
    email.setSSLOnConnect(true);
    email.setSmtpPort(465);
    email.setAuthenticator(new DefaultAuthenticator("xyz@gmail.com", "xyz@123"));
    email.addTo("xyz@gmail.com", "测试接收人");
    email.setFrom("xyz@gmail.com", "自动化测试任务");
    email.setSubject("自动化测试执行报告");
    email.setMsg("本次自动化测试执行完成,详细结果请查看附件报告");

    email.attach(attachment);
    email.send();
}

问题2:发邮件代码的调用位置

你现在将代码放在JUnit的@AfterClass注解修饰的静态方法中是合适的,只需满足两个执行顺序要求即可:

  • 必须在所有Cucumber测试场景执行完成、ExtentReport执行flush操作、报告文件完全写入磁盘后再调用发邮件逻辑,避免发送不完整的报告
  • 如果使用多线程并行执行测试,需要等待所有测试线程执行结束后再触发发邮件逻辑,不要放在单个执行线程的收尾逻辑中

内容的提问来源于stack exchange,提问作者Sumit Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:48:02