1. 程式人生 > 實用技巧 >Web自動化測試:郵件傳送測試報告

Web自動化測試:郵件傳送測試報告

在我們執行完整個專案後,已經生成了 測試報告,一般自動化會在本地或者公司伺服器上執行,那如何獲取自動化測試的執行結果呢,此時就需要把測試結果以郵件的形式傳送到郵箱,這樣就可以在測試完成的第一時間知道測試結果。

所以我們需要來學習一下如果使用python第三方庫來發送郵件。

其實關於傳送郵件的方法,複製貼上過來,修改下引數、賬號、密碼後,直接使用就可以了,再把資料寫到配置中引數化基本就搞定。

一、傳送郵件的步驟

關於傳送郵件,步驟有三步:定義配置資訊、定義郵件內容、傳送郵件

第一步:定義配置資訊

這一步將所有需要用到的:郵箱伺服器地址、郵箱埠、郵箱賬號、密碼等資訊先列出來,可以在方法中直接賦值,也可以放到config配置檔案中,讀取後賦值。

# 接收郵箱
receiver = "***@****.com"
 
# 傳送郵件伺服器
smtp_server = "smtp.***.com"
port = "25"
 
# 傳送郵箱賬號和密碼(或者授權碼)
username = "***@***.com"
password = "****"

第二步:定義郵件內容

郵件內容,我通過檔案路徑來讀取html格式的檔案,從而獲取到郵件的內容。然後設定郵件的標題、傳送方、收件方、正文內容、附件格式、附件內容等。

# 讀取測試報告檔案(report_file:測試報告檔案路徑)
mail_body = open(report_file, "r", encoding="utf-8").read()
# 定義郵件內容
msg = MIMEMultipart()
body = MIMEText(mail_body, _subtype='html', _charset='utf-8')
msg['Subject'] = u"自動化測試報告"
msg['from'] = username
msg['to'] = receiver
msg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z')
msg.attach(body)
# 定義附件內容
att = MIMEText(mail_body, "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename= "report.html"'
msg.attach(att)

第三步:傳送郵件

確定好郵件內容後,需要傳送郵件了,不同的加密方式傳送方法會有些不同,這個在下文具體探討下。

# 連線郵箱伺服器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port=port)
# tls加密方式
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# 登入郵箱
smtp.login(username, password)
# 傳送郵件
smtp.sendmail(username, receiver, msg.as_string())
# 斷開連線
smtp.quit()

二、傳送郵件的注意事項

我在研究了傳送郵件後,發現不同情況下,傳送郵件的方式也有不同之處,這裡整理如下:

2.1使用不同郵件傳送方

目前我嘗試過使用163郵箱、qq郵箱、zimbra郵箱進行傳送郵件,每個郵箱設定不同,每個郵箱也沒有全面測試所支援的傳送型別,這裡大概講下我對每個郵箱的感受吧,不作為參考。其中:

163郵箱比較簡單,我只設定了服務地址,在connect連線後直接可以登入傳送(可能和我163郵箱設定有關)

qq郵箱需要設定一個授權碼,然後使用授權碼來進行連線登入

zimbra郵箱是公司部署的一個郵箱系統,沒有授權碼,但是需要加密進行登入。

郵箱賬戶開啟第三方傳送功能:

163郵箱:在設定選單中,選擇POP3/SMTP/IMAP選項,設定開啟SMTP傳送功能。

Qq郵箱:在設定-賬戶中,設定開啟SMTP傳送功能

2.2不同加密方式的登入

這裡我整理的幾種加密方式,有明文不加密、ssl、tls這三種方式,不同的加密方式有不同的登入方法。

明文不加密:

預設使用smtp的埠(預設值25)具體埠值以郵箱設定為準。

# 連線郵箱伺服器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port='25')
# 登入郵箱
smtp.login(username, password)

ssl加密方式:

預設使用ssl埠(預設值465)具體埠值以郵箱設定為準。

# 連線郵箱伺服器
smtp = smtplib.SMTP_SSL()
smtp.connect(host=smtp_server, port='465')
# 登入郵箱
smtp.login(username, password)

tls加密方式:

預設使用smtp的埠(預設值25)具體埠值以郵箱設定為準。

# 連線郵箱伺服器
smtp = smtplib.SMTP()
smtp.connect(host=smtp_server, port='25')
# tls加密
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
# 登入郵箱
smtp.login(username, password)

2.3無法傳送時如何檢查

當遇到無法傳送郵件時,根據我踩過的坑,來給出幾點建議吧。

1.確定郵箱已經開啟smtp功能,並且確定是否開啟授權碼登入,如果開啟則需要使用授權碼登入。

2.確定郵箱埠port值是否正確,是465、587、25,或者郵箱系統定義的其他埠

3.確定郵箱支援的加密方式,以及不同加密方式對應的埠值正確與否。

三、程式碼例項

這裡根據專案,我建立了send_mail.py的檔案,在裡面除了傳送郵件的方法,根據專案結構加入了一個查詢report報告資料夾最後生成檔案的方法,並且獲取到檔案路徑後,作為要傳送的內容:

send_mail.py

# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import time
import os
 
 
def find_report_name():
    """查詢最後生成的報告檔案的路徑"""
    result_dir = os.path.abspath('..') + "\\report\\"
    lists = os.listdir(result_dir)
    lists.sort(key=lambda fn: os.path.getmtime(result_dir + "\\" + fn))
    file_name = os.path.join(result_dir, lists[-1])
    return file_name
 
 
def send_email(report_file):
    """傳送郵件方法"""
    try:
        # 配置郵件資訊
        # 接收郵箱
        receiver = "***@***.com"
        # 傳送郵件伺服器
        smtp_server = "smtp.***.com"
        port = "25"
        # 傳送郵箱賬號和密碼(授權碼)
        username = "***@***.com"
        password = "***"
 
        # 讀取測試報告檔案
        mail_body = open(report_file, "r", encoding="utf-8").read()
        # 定義郵件內容
        msg = MIMEMultipart()
        body = MIMEText(mail_body, _subtype='html', _charset='utf-8')
        msg['Subject'] = u"自動化測試報告"
        msg['from'] = username
        msg['to'] = receiver
        msg["date"] = time.strftime('%a, %d %b %Y %H:%M:%S %z')
        msg.attach(body)
        # 定義附件內容
        att = MIMEText(mail_body, "base64", "utf-8")
        att["Content-Type"] = "application/octet-stream"
        att["Content-Disposition"] = 'attachment; filename= "report.html"' 
        msg.attach(att)
 
        # 連線郵箱伺服器
        smtp = smtplib.SMTP()
        smtp.connect(host=smtp_server, port=port)
        # tls加密方式
        smtp.ehlo()
        smtp.starttls()
        smtp.ehlo()
        # 登入郵箱
        smtp.login(username, password)
        # 傳送郵件
        smtp.sendmail(username, receiver, msg.as_string())
        # 斷開連線
        smtp.quit()
        print("%s 傳送成功,查收%s郵箱" % (username, receiver))
    except Exception as e:
        print(e)
 
 
def send_report():
    """傳送測試報告"""
    send_email(find_report_name())