簡介
前邊幾篇,已經教小伙伴們掌握了如何生成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 = 'nXXply@ceXXx.cn' #發件箱用戶名 password = 'XXX@@123' #發件箱密碼 sender = 'noXXy@ceXXx.cn' #發件人郵箱 receiver = ['hongge@XXX.cn'] #收件人郵箱 # 郵件正文是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、再次運行收到郵件