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
相关产品推荐
相关产品推荐

