怎樣從0開始搭建一個測試框架_5——郵件
阿新 • • 發佈:2019-02-16
怎樣從0開始搭建一個測試框架_5
我們已經有了日誌、有了報告,生成報告之後需要給其他組員看,自然要有發郵件的功能。這塊我們要用到smtplib和email庫。
在utils中建立mail.py,初始化時傳入全部所需資料,message是正文,可不填,path可以傳list或者str;receiver支援多人,用”;”隔開就行
"""
郵件類。用來給指定使用者傳送郵件。可指定多個收件人,可帶附件。
"""
import re
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from socket import gaierror, error
from utils.log import logger
class Email:
def __init__(self, server, sender, password, receiver, title, message=None, path=None):
"""初始化Email
:param title: 郵件標題,必填。
:param message: 郵件正文,非必填。
:param path: 附件路徑,可傳入list(多附件)或str(單個附件),非必填。
:param server: smtp伺服器,必填。
:param sender: 發件人,必填。
:param password: 發件人密碼,必填。
:param receiver: 收件人,多收件人用“;”隔開,必填。
"""
self.title = title
self.message = message
self.files = path
self.msg = MIMEMultipart('related')
self.server = server
self.sender = sender
self.receiver = receiver
self.password = password
def _attach_file(self, att_file):
"""將單個檔案新增到附件列表中"""
att = MIMEText(open('%s' % att_file, 'rb').read(), 'plain', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
file_name = re.split(r'[\\|/]', att_file)
att["Content-Disposition"] = 'attachment; filename="%s"' % file_name[-1]
self.msg.attach(att)
logger.info('attach file {}'.format(att_file))
def send(self):
self.msg['Subject'] = self.title
self.msg['From'] = self.sender
self.msg['To'] = self.receiver
# 郵件正文
if self.message:
self.msg.attach(MIMEText(self.message))
# 新增附件,支援多個附件(傳入list),或者單個附件(傳入str)
if self.files:
if isinstance(self.files, list):
for f in self.files:
self._attach_file(f)
elif isinstance(self.files, str):
self._attach_file(self.files)
# 連線伺服器併發送
try:
smtp_server = smtplib.SMTP(self.server) # 連線sever
except (gaierror and error) as e:
logger.exception('傳送郵件失敗,無法連線到SMTP伺服器,檢查網路以及SMTP伺服器. %s', e)
else:
try:
smtp_server.login(self.sender, self.password) # 登入
except smtplib.SMTPAuthenticationError as e:
logger.exception('使用者名稱密碼驗證失敗!%s', e)
else:
smtp_server.sendmail(self.sender, self.receiver.split(';'), self.msg.as_string()) # 傳送郵件
finally:
smtp_server.quit() # 斷開連線
logger.info('傳送郵件"{0}"成功! 收件人:{1}。如果沒有收到郵件,請檢查垃圾箱,'
'同時檢查收件人地址是否正確'.format(self.title, self.receiver))
之後我們修改用例檔案,執行完成後傳送郵件:
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from utils.config import Config, DRIVER_PATH, DATA_PATH, REPORT_PATH
from utils.log import logger
from utils.file_reader import ExcelReader
from utils.HTMLTestRunner import HTMLTestRunner
from utils.mail import Email
class TestBaiDu(unittest.TestCase):
URL = Config().get('URL')
excel = DATA_PATH + '/baidu.xlsx'
locator_kw = (By.ID, 'kw')
locator_su = (By.ID, 'su')
locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')
def sub_setUp(self):
self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')
self.driver.get(self.URL)
def sub_tearDown(self):
self.driver.quit()
def test_search(self):
datas = ExcelReader(self.excel).data
for d in datas:
with self.subTest(data=d):
self.sub_setUp()
self.driver.find_element(*self.locator_kw).send_keys(d['search'])
self.driver.find_element(*self.locator_su).click()
time.sleep(2)
links = self.driver.find_elements(*self.locator_result)
for link in links:
logger.info(link.text)
self.sub_tearDown()
if __name__ == '__main__':
report = REPORT_PATH + '\\report.html'
with open(report, 'wb') as f:
runner = HTMLTestRunner(f, verbosity=2, title='從0搭建測試框架 灰藍', description='修改html報告')
runner.run(TestBaiDu('test_search'))
e = Email(title='百度搜索測試報告',
message='這是今天的測試報告,請查收!',
receiver='...',
server='...',
sender='...',
password='...',
path=report
)
e.send()
執行完成之後可以看到receiver收到了我們的報告。當然,在這塊你有可能遇到很多問題,可以根據錯誤號去網上查詢如網易幫助。一般有幾種常見的錯誤:
- 賬戶密碼出錯
- 伺服器sever出錯,這個可以根據你的傳送人的郵箱去網站或郵箱設定中檢視到
- 郵箱沒有開通smtp服務,一般在郵箱設定中
- 郵件被攔截,在title、message以及傳送的檔案中不要帶明顯亂碼、廣告傾向的字元
- sender跟loginuser不一致的問題,傳送人必須是登入使用者
所有的程式碼我都放到了GITHUB上傳送,可以自己下載去學習,有什麼好的建議或者問題,可以留言或者加我的QQ群:455478219討論。