python介面自動化(二十九)--html測試報告通過郵件發出去——上(詳解)
簡介
前邊幾篇,已經教小夥伴們掌握瞭如何生成HTML的測試報告,那麼生成測試報告,我們也不能放在那裡不管了,這樣即使你報告在漂亮,領導也看不到。因此如果想向領導彙報工作,不僅需要提供更直觀的測試報告。而是我們需要將生
成測試報告發個相關的負責人,需要他們看一下測試結果,把控一下專案的介面有風險,會不會影響專案進度等等一些事吧。
發郵件需要用到python兩個模組,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。其中MIMEText()定義郵件正文,Header()定義郵件標題。MIMEMulipart模組構造帶附件。
大致思路流程
1、通過unittest框架的discover()找到匹配的測試用例,由HTMLTestRunner的run()方法執行測試用例並生成最新的測試報告。
2、呼叫new_report()函式找到測試報告目錄下最新生成的測試報告,返回測試報告的路徑。
3、將得到的最新測試報告的完整路徑傳給send_mail()函式,實現發郵件功能。
4、第一步,前邊幾篇,我們都詳細介紹了,所以這篇就不在贅述了,直接從第二步、第三步開始講解。
查詢最新測試報告
定義傳送郵件
1、檢視一下,原始碼如下:
2、仿照原始碼進行改造
參考程式碼
# coding=utf-8 #1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行 #2.註釋:包括記錄建立時間,建立人,專案名稱。 ''' Created on 2019-5-6 @author: 北京-巨集哥 Project:學習和使用將測試報告通過郵件發出去 ''' #3.匯入unittest模組 import unittest import os from email.mime.text import MIMEText from email.header import Header import smtplib #4.編寫測試用例和斷言 def all_case(): # 待執行用例的目錄 #case_dir = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\case" case_dir = os.path.join(os.getcwd(), "case") testcase = unittest.TestSuite() discover = unittest.defaultTestLoader.discover(case_dir, pattern="test*.py", top_level_dir=None) # #discover方法篩選出用例,迴圈新增到測試套件中 # for test_suit in discover: # for test_case in test_suit: # #新增用力到testcase # testcase.addTests(test_case) # print(testcase) testcase.addTests(discover) # 直接載入 discover 可以相容python2和3 print(testcase) return testcase # ==============定義傳送郵件========== def send_mail(file_new): f = open(file_new, 'rb') mail_body = f.read() f.close() username = '[email protected]' #發件箱使用者名稱 password = 'XXX@@123' #發件箱密碼 sender = '[email protected]' #發件人郵箱 receiver = ['[email protected]'] #收件人郵箱 # 郵件正文是MIMEText msg = MIMEText(mail_body, 'html', 'utf-8') # 郵件物件 msg['Subject'] = Header("自動化測試報告", 'utf-8').encode() msg['From'] = Header(u'測試機 <%s>'%sender) msg['To'] = Header(u'測試負責人 <%s>'%receiver) msg['date'] = time.strftime("%a,%d %b %Y %H:%M:%S %z") #傳送郵件 smtp = smtplib.SMTP() smtp.connect('smtp.mxhichina.com') # 郵箱伺服器 smtp.login(username, password) # 登入郵箱 smtp.sendmail(sender, receiver, msg.as_string()) # 傳送者和接收者 smtp.quit() print("郵件已發出!注意查收。") # ======查詢測試目錄,找到最新生成的測試報告檔案====== def new_report(test_report): lists = os.listdir(test_report) # 列出目錄的下所有檔案和資料夾儲存到lists lists.sort(key=lambda fn: os.path.getmtime(test_report + "\\" + fn)) # 按時間排序 file_new = os.path.join(test_report, lists[-1]) # 獲取最新的檔案儲存到file_new print(file_new) return file_new if __name__ == "__main__": # 返回例項 runner = unittest.TextTestRunner() #匯入第三方模組HTMLTestRunner import HTMLTestReportCN import time # 獲取當前時間,這樣便於下面的使用。 now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) #儲存生成報告的路徑 report_path = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\"+now+"_result.html" fp = open(report_path,'wb') runner = HTMLTestReportCN.HTMLTestRunner(stream=fp, title=u"這是我的自動化測試用例", description=u"用例執行情況", verbosity = 2 ) # run 所有用例 runner.run(all_case()) #關閉檔案,記住用open()開啟檔案後一定要記得關閉它,否則會佔用系統的可開啟檔案控制代碼數。 fp.close() #測試報告資料夾 test_path = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\" new_report = new_report(test_path) send_mail(new_report) # 傳送測試報告
小結
1、遇到的問題及解決方法
(1)將生成的測試報告的儲存路徑和查詢測試報告的路徑混淆會報如下錯誤
(2)解決方法
a、我們先來分析一下原因,剛開始我查了資料還覺得是不是陣列越界,後來感覺不對,就複製貼上到我的電腦報如下錯誤,確實找不到
b、接著Ctrl+R複製進去,執行出現如下這是才知道查詢最新的測試報告遍歷的根本不是一個目錄而是一個檔案
c、解決辦法不是資料夾修改成測試報告的資料夾是不是就可以,做如下簡單地修改就可以了
d、完了把test_path拷貝在我電腦和執行處,兩個介面一樣分別定位到測試報告。這樣就可以遍歷,這是不用試 一定可以成功分別如下:
我的電腦
執行
e、程式碼執行結果
f、到收件箱可以看到測試報告
2、傳送的郵件看不到發件人和收件人,如圖
a、解決辦法:
加兩行程式碼即可
b、再次執行收到郵件