1. 程式人生 > >怎樣從0開始搭建一個測試框架_5——郵件

怎樣從0開始搭建一個測試框架_5——郵件

怎樣從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收到了我們的報告。當然,在這塊你有可能遇到很多問題,可以根據錯誤號去網上查詢如網易幫助。一般有幾種常見的錯誤:

  1. 賬戶密碼出錯
  2. 伺服器sever出錯,這個可以根據你的傳送人的郵箱去網站或郵箱設定中檢視到
  3. 郵箱沒有開通smtp服務,一般在郵箱設定中
  4. 郵件被攔截,在title、message以及傳送的檔案中不要帶明顯亂碼、廣告傾向的字元
  5. sender跟loginuser不一致的問題,傳送人必須是登入使用者

所有的程式碼我都放到了GITHUB上傳送,可以自己下載去學習,有什麼好的建議或者問題,可以留言或者加我的QQ群:455478219討論。