HtmlTestRunner + SmtpLib + Jenkins 实现自动化集成

首先呢,作为一个小白,大部分的代码都是网上搜索来的二次加工

可是拿来不见得就能用

比如,之前死活过不去的email垃圾文件验证,邮件只能躺在qq的草稿箱

网上那些方法,什么抄送人添加自己之类的都没用

最后是灵机一动,删除了邮件正文里的富文本才成功发送邮件

如果以后能有更好的解决办法再来更新

好了,废话不多说,进入正题

准备条件

一、Jenkins

地址:https://jenkins.io/download/,选LTS最新版本就OK

安装:找到文件路径, java -jar jenkins,war,傻瓜式安装就OK

配置:Jenkins里的邮件配置我在网上找了教程但是没有,所以直接在python代码里实现发邮件

        新建项目,设置定时构建 H H/2 * * * 代表每两个小时自动构建一次

                                                0 * * * * 代表每个小时自动构建一次

       构建里  填写执行批处理命令就OK了,比如我的

      

二、最重要的:python代码

参考了多个人的,稍微做了改动为我所用

# coding: utf-8
import smtplib
from email import encoders
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
import os,time
import mimetypes
import unittest
from HTMLTestReportCN import HTMLTestRunner

# 邮箱登录信息,包括发件人、收件人、抄送人、密送
username = '[email protected]'
password = 'xxx'  # 此处是qq邮箱授权码,去设置--账户--开通smtp服务就有了
sender = '[email protected]'  # 发件人邮箱
receiver = '[email protected],[email protected]'  # 多人逗号分开
cc = '[email protected]'  # 抄送邮箱, 多人逗号分开
bcc = '[email protected]'  # 密送邮箱, 多人逗号分开
# 邮件内容和主题
now = time.strftime('%Y-%m-%d %H:%M:%S')
subject = '自动化测试报告' + now
mail_content = '<html><h1>自动化测试报告详情参考附件</h1></html>'


# 所有收信人以及抄送和密送对象都一样,
# 放在都一样 server.sendmail(sender, toaddrs, msg.as_string()) 第二个参数toaddrs里面
# 具体区别收信人以及抄送和暗抄对象,
# 都由server.sendmail(sender, toaddrs, msg.as_string()) 第三个参数里面msg里面的关键词决定

msg = MIMEMultipart()
msg.add_header('From', username)
msg.add_header('To', receiver)
msg.add_header('Cc', cc)
msg.add_header('BCc', bcc)
msg.add_header('Subject', subject)
msg.add_header('Date', subject)
msg.attach(MIMEText(mail_content, 'html'))
# 所有收信人信息
toaddrs = [receiver] + [cc] + [bcc]


# 添加附件
def add_attachment(filepath):
    ctype, encoding = mimetypes.guess_type(filepath)
    if ctype is None or encoding is not None:
        ctype = "application/octet-stream"
    maintype, subtype = ctype.split("/", 1)
    fp = open(filepath, 'rb')
    attachment = MIMEBase(maintype, subtype)
    attachment.set_payload(fp.read())
    fp.close()
    encoders.encode_base64(attachment)
    baseName = os.path.basename(filepath)
    attachment.add_header('Content-Disposition', 'attachment', filepath=filepath,  filename=baseName)
    msg.attach(attachment)
    print(filepath, 'added')


def new_file(test_dir):
    Files = []
    # 列举test_dir目录下的所有文件,结果以列表形式返回。
    lists = os.listdir(test_dir)
    # sort按key的关键字进行排序,lambda的入参fn为lists列表的元素,获取文件的最后修改时间
    # 最后对lists元素,按文件修改时间大小从小到大排序。
    lists.sort(key=lambda fn: os.path.getmtime(test_dir + '\\' + fn))
    # 获取最新文件的绝对路径
    filepath = os.path.join(test_dir, lists[-1])
 
    Files.append(filepath)
    baseName = os.path.basename(filepath)
    att = MIMEApplication(open(filepath, 'rb').read())
    att.add_header('Content-Disposition', 'attachment', filename=baseName)
    msg.attach(att)
    print(filepath, 'added')


def send(new_report):
    mail_server = 'smtp.qq.com'
    mail_server_port = 587
    server = smtplib.SMTP(mail_server, mail_server_port)
    server.ehlo()
    server.starttls()
    server.login(username, password)
    server.sendmail(sender, toaddrs, msg.as_string())
    server.quit()


if __name__ == '__main__':
    print('=====AutoTest Start======')
    # 执行测试用例,生成最新的测试报告
    # Windows的cmd执行,不用绝对路径会报ImportError
    test_dir = 'D:\\works\\wilytest\\case'
    # 测试报告的路径
    test_report_dir = 'D:\\works\\wilytest\\report'
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
    now = time.strftime('%Y-%m-%d_%H_%M_%S_')
    filename = test_report_dir + '\\' + now + 'Test_Report.html'
    fp = open(filename, 'wb')
    
    runner = HTMLTestRunner(stream=fp, title=u'自动化测试报告', description=u'用例执行详细情况:')
    runner.run(discover)
    fp.close()
    # 取最新测试报告
    new_report = new_file(test_report_dir)
    # 发送邮件,发送最新测试报告html
    send(new_report)
    print('=====AutoTest Over======')

最后,贴上成功运行后的邮箱邮件,至于Jenkins的报告为啥不准时,现在还是一头雾水       

猜你喜欢

转载自blog.csdn.net/wilymore/article/details/85121882