1. 程式人生 > >HtmlTestRunner + SmtpLib + Jenkins 實現自動化整合

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的報告為啥不準時,現在還是一頭霧水