首页 > 解决方案 > 如何通过电子邮件发送 pytest 覆盖率报告?

问题描述

我正在使用 pytest 框架和 pytest-cov 插件来生成覆盖率报告,它会在执行测试用例后在 htmlcov 目录中生成一个覆盖率报告文件,有没有办法我也可以将此报告文件作为附件发送,而执行测试用例?

标签: pythondjangopytestcode-coveragecoverage.py

解决方案


您可以在 conftest.py 文件中放置一个拆卸脚本。这是您可以放置​​ pytest 固定装置以及通用 pytest 选项的地方。请参阅此处的 API 参考

pytest_session_finish是您正在寻找的功能。你conftest.py可能看起来像这样。这大量引用了带有附件的 smtplib 部分的这个答案:

import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate


def send_mail(send_from, send_to, subject, text, files=None,
              server="127.0.0.1"):
    assert isinstance(send_to, list)

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

    for f in files or []:
        with open(f, "rb") as fil:
            part = MIMEApplication(
                fil.read(),
                Name=basename(f)
            )
        # After the file is closed
        part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f)
        msg.attach(part)


    smtp = smtplib.SMTP(server)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

def pytest_sessionfinish(session, exitstatus):
    send_mail('myemail', 'theiremail', 'Your Coverage Report', 'My Text',
        files="coveragereport.html", server="myserver")

推荐阅读