pytest-html报告路径需通过--html参数动态指定,如pytest --html=reports/test_report.html;脚本中用subprocess.run执行并校验os.path.exists(report_path),再用mimemultipart("related")发送带附件的html报告。

pytest-html生成的报告路径怎么动态获取
pytest-html 默认把报告写在当前目录的 report.html,但自动化场景下必须明确知道文件生成位置,否则邮件附件会失败。关键不是“等它生成”,而是主动控制输出路径,并在测试结束后立刻读取。
- 运行命令里必须显式指定
--html参数,比如pytest --html=reports/test_report.html --self-contained-html -
--self-contained-html很重要:它把 CSS/JS 打包进 HTML,避免邮件客户端加载失败 - 脚本中调用 pytest 时,推荐用
subprocess.run()而非os.system(),便于捕获退出码和路径校验 - 生成后立刻检查
os.path.exists("reports/test_report.html"),别假设一定成功——尤其 CI 环境可能权限或路径不对
smtplib 发送带附件的 HTML 报告要注意什么
直接用 smtplib.SMTP 发纯文本邮件简单,但发带附件的 HTML 报告容易卡在编码、MIME 类型或 Gmail/Outlook 的安全拦截上。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 必须用
MIMEMultipart("related")(不是mixed),否则 Outlook 可能显示空白或提示“外部图像被阻止” - HTML 文件作为附件要设
Content-Disposition: attachment,但内联样式和图片(如果用了)得用related+Content-ID关联——不过--self-contained-html已规避此问题 - Gmail 要求开启“应用专用密码”或 OAuth2,普通密码会报
SMTPAuthenticationError;国内企业邮箱常禁用 TLS 1.0,得强制用server.starttls(context=ssl.create_default_context()) - 附件名别用中文或空格,
reports/test_report_20240615.html比测试报告-最新版.html更稳妥
怎么把 pytest 运行、报告生成、邮件发送串成一个可靠流程
不能分开手动执行三步,否则失败点不明确、状态难追踪。核心是让整个链条有返回值、有日志、有兜底。
- 用 Python 脚本统一调度:先
subprocess.run(...)执行 pytest,检查result.returncode == 0再继续 - 报告路径用变量存,比如
report_path = "reports/test_report.html",后续所有操作都基于这个变量,别硬编码两次 - 邮件发送失败不能静默吞掉:捕获
smtplib.SMTPException后打印具体错误,甚至写入本地email_fail.log,否则 CI 流水线绿了但没人收到邮件 - CI 环境(如 GitHub Actions)里记得把邮箱密码设为 secret,用
os.getenv("EMAIL_PASSWORD")读取,别写死在代码里
为什么测试失败时也要发邮件,且内容要区分状态
只在成功时发邮件等于放弃失败诊断机会。收件人需要一眼看出“这次挂了几个用例”,而不是登录服务器翻日志。
- pytest 运行完解析
stdout或临时 XML 报告(加--junitxml=report.xml),提取failures和errors数量 - 邮件正文用纯文本写 summary:比如 “✅ 共执行 42 个用例,❌ 失败 3 个,⚠️ 跳过 1 个”,HTML 报告只作附件
- 失败用例名太长?截取前 5 个,后面加 “…” 并提示“详情见附件”,避免正文爆炸
- 别忘了加时间戳:
datetime.now().strftime("%Y-%m-%d %H:%M"),不然凌晨两点收到一封没时间的邮件,根本分不清是昨天还是今天跑的
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










