本篇隨筆承接:Python3+unitest自動化測試初探(上篇)
6、生成測試報告
6.1、下載HTMLTestRunner.py
原版下載地址:http://tungwaiyip.info/software/HTMLTestRunner.html 。原版的只支持Python 2.x版本,Python 3.x版本需要做適配。
適配后的下載地址:https://github.com/Slience007/pyunitest/blob/master/untils/HTMLTestRunner.py
6.2、安裝HTMLTestRunner.py
安裝方法比較簡單,將HTMLTestRunner.py放到sys.path路徑下即可。ubuntu下,我放到了如下路徑:/usr/lib/python3.7。
6.3、生成報告
HTMLTestRunner.py提供HTMLTestRunner()類來代替unittest.TextTestRunner()執行用例,修改后的run.py的代碼如下:
#coding:utf-8
import unittest
#導入HTMLTestRunner
from HTMLTestRunner import HTMLTestRunner
#從testCase包里面導入測試類
from testCases.userLoginTest import loginTest
from testCases.userRegTest import regTest
#構造測試套
def suite():
suite = unittest.TestSuite()
suite.addTest(loginTest("test_loginsucess_L0"))
suite.addTest(loginTest("test_pwdwrong_L0"))
suite.addTest(loginTest("test_statuserr_L1"))
suite.addTest(regTest("test_pwdlenerr_L1"))
suite.addTest(regTest("test_regsucess_L0"))
suite.addTest(regTest("test_regagain_L1"))
return suite
#運行測試用例
if __name__ == '__main__':
# runner = unittest.TextTestRunner()
# #調用test runner的run方法執行用例
# runner.run(suite())
#以二進制格式打開TestReport.html用於寫入數據
with open("./TestReport.html","wb") as f:
runner = HTMLTestRunner(stream=f,title="Reg And Login Test Report")
runner.run(suite())
運行run.py后,打開TestReport.html,查看生成的測試報告。
7、編寫郵件發送工具
在Project下新建包utils用來封裝一些常用的工具,在utils下新建Python文件emailUtil.py。定義sendEmail類。這個類主要包含3個方法:
- init():初始化
- writeEmail():構造郵件主題,郵件正文,添加郵件附件。
- sendEmail():連接郵件服務器,認證,發送郵件。我采用的是網易郵件服務器,其地址是smtp.126.com。收件地址為QQ郵箱。
[ 代碼如下:]emailUtil.py
#coding:utf-8
'''
email模塊負責構造郵件內容
smtplib模塊負責發送郵件
'''
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.header import Header
class sendEmail():
#定義全局變量郵件服務器地址,登錄用戶,授權碼
global MAILHOST,MAILUSER,MAILPWD
MAILHOST = "smtp.126.com"
MAILUSER = "××××@126.com"
MAILPWD = "×××"
def __init__(self,subject,content,reveiver,attachPath=""):
self.subject = subject
self.content = content
self.receiver = reveiver
self.attachPath = attachPath
#寫郵件,返回msg.as_string()
def writeEmail(self):
msg = MIMEMultipart()
#郵件正文
msg.attach(MIMEText(self.content, 'plain', 'utf8'))
receiverName = ",".join(self.receiver)
msg['from'] = Header(MAILUSER,'utf-8')
#msg['to'] = Header(",".join(self.receiver)).encode()
msg['to'] = Header(receiverName).encode()
#郵件主題
msg['Subject'] = Header(self.subject,'utf-8').encode()
#print("msg is:",msg)
#attachPath不為空則添加附件到郵件中
if self.attachPath != "":
with open(self.attachPath, 'rb') as f:
attach1 = MIMEText(f.read(), 'base64', 'utf-8')
attach1["Content-Type"] = 'application/octet-stream'
#filename可以隨便寫
attach1["Content-Disposition"] = 'attachment; filename="Result.html"'
msg.attach(attach1)
return msg.as_string()
#發送郵件
def sendEmail(self):
receiver = ";".join(self.receiver)
try:
#連接郵件服務器
server = smtplib.SMTP()
server.connect(MAILHOST,25)
#打開debug模式可以看到握手過程
#server.set_debuglevel(1)
#登錄,MAILPWD為網易郵件的授權碼
server.login(MAILUSER,MAILPWD)
#發送郵件
server.sendmail(MAILUSER,receiver,self.writeEmail())
server.quit()
print("Email send sucess.")
except Exception as e:
print("Email send fail.")
print(e)
在編寫郵件工具的時候,碰到了一個錯誤:smtplib.SMTPDataError: (554, b'DT:SPM。原因可能是:郵件被網易郵件服務器當成了垃圾郵件。解決辦法:郵件主題不能包含test,另外msg[from"],msg['to']要和server.sendmail(MAILUSER,receiver,self.writeEmail())中的MAILUSER和receiver保持一致。
8、發送郵件
在發送郵件之前,先獲取本次執行用例總數,失敗用例數,成功用例數,跳過的用例數。並計算出用例通過率。
- suite().countTestCases():獲取用例總數。
- runner.run(suite()).success_count:運行通過的用例數。
- runner.run(suite()).failure_count:失敗的用例數。
- runner.run(suite()).skipped:返回的是跳過的用例list。
接下來來修改run.py ,需要先從utils模塊導入sendEmail類,構造主題,郵件正文,指定收件人列表,指定測試報告的路徑,之后調用sendEmail方法發送郵件。修改后的run.py代碼如下:
#coding:utf-8
import unittest
#導入HTMLTestRunner
from HTMLTestRunner import HTMLTestRunner
#從testCase包里面導入測試類
from testCases.userLoginTest import loginTest
from testCases.userRegTest import regTest
from utils.emailUtil import sendEmail
#構造測試套
def suite():
suite = unittest.TestSuite()
suite.addTest(loginTest("test_loginsucess_L0"))
suite.addTest(loginTest("test_pwdwrong_L0"))
suite.addTest(loginTest("test_statuserr_L1"))
suite.addTest(regTest("test_pwdlenerr_L1"))
suite.addTest(regTest("test_regsucess_L0"))
suite.addTest(regTest("test_regagain_L1"))
return suite
#運行測試用例
if __name__ == '__main__':
# runner = unittest.TextTestRunner()
# #調用test runner的run方法執行用例
# runner.run(suite())
#以二進制格式打開TestReport.html用於寫入數據
with open("./TestReport.html","wb") as f:
runner = HTMLTestRunner(stream=f,title="Reg And Login Test Report")
result = runner.run(suite())
totalNums = suite().countTestCases()
passedNums = result.success_count
failedNums = result.failure_count
skippedNums = len(result.skipped)
#通過率,保留兩位小數
passRate = round(passedNums * 100/ totalNums)
emailBody = "Hi,all:\n \t本次構建一共運行:{totalNums}個用例,通過{passedNums}個,失敗{failedNums}個,跳過{skippedNums}個。通過率:{passRate}%.\n \t詳細信息請查看附件。"
content = emailBody.format(totalNums=totalNums,passedNums=passedNums,failedNums=failedNums,skippedNums=skippedNums,passRate=passRate)
#收件人列表
receiver = ['××××@qq.com',"×××××@126.com"]
#測試報告的路徑
path1 = "/home/stephen/PycharmProjects/unitTestDemo/TestReport.html"
subject = "登錄注冊功能每日構建"
e = sendEmail(subject,content,receiver,attachPath=path1)
#發送郵件
e.sendEmail()
運行run.py。登錄郵箱查看已經發送成功的郵件。