執行測試以後,都需要產出測試報告,除了要顯示測試結果,更重要的作用是讓我們知道為什麼會測試失敗,原因有很多,可能是環境問題,可能測試程式的 Bug,也有可能是測試對象本身的 Bug,所以測試報告需要提供足夠的資訊,讓我們快速去判斷失敗的原因。
這裡會套用 Allure Report,同時需要配合 Logging,把需要的資訊記錄下來套在測試報告上。
應用 Allure Report,需要先安裝 Allure 的應用程序,可以參考官方的教學。若沒有 brew / scoop,需要先下載。
MacOS:
brew install allure
Window:
scoop install allure
然後需要在 Python 安裝與 Pytest 配合的套件
pip install allure-pytest
即可簡單使用如下:
# 在執行 pytest 的時候加入參數 —alluredir 指定測試結果輸出的位置,一般設定為 allure-results
# 這個參數也可以設定在 pytest.ini 喔
pytest --alluredir=allure-results
# 測試完成後,利用測試結果生成報告,並在默認的瀏覽器顯示報告
allure serve allure-results
這樣你就可以看到最基本的報告內容,做了多少個測試,測試通過率等資訊。然而,這些測試訊息還是不足夠讓我們清楚了解測試的內容的,所以我們必須要自行定制適合的報告,在報告中加入需要的信息,讓內容更豐富。
標記 Title & Description
@allure.title
和 @allure.description
為 test case 加入 title 和 description.
標記測試步驟
使用 Annotation @allure.step
,可以在 function 或 Class method 上標記,在測試報告會顯示為步驟。我會習慣在 Page Object 的 Method 都使用 @allure.step
標記成 step
# 在 login_page.py 的 Class method 加入 @allure.step
import allure
class LoginPage:
@allure.step(f"Input Username")
def input_username(self, username):
print(f"input {username}")
@allure.step("Input Password")
def input_password(self, password):
print(f"input {password}")
而 Test Case 的步驟也會寫成 step,方式如下:
# test_login.py
@allure.title("Login Test")
@allure.description("以 username, password 作登入測試 ")
def test_login():
login_page = LoginPage()
with allure.step("登入"):
# 運用 page object 的 method 完成了整個操作流程
login_page.input_username("username")
login_page.input_password("password")
會使 Page Object Method 的 Step 嶔入到測試步驟中,清晰可以看到每個步驟,點擊進去可以再看更細的步驟資料。
附件 Attachment
在報告可以加入不同種類的附件,如圖片可放截圖/測試用的圖片等,來豐富報告的內容。可以通過以下方式加入。
# 把資料創建成附件
# allure.attach(content, attachment_name, attachment_type, extension)
allure.attach("Content", "Text File", "text/plain", "txt")
# 把現有的檔案加入附件
# allure.attach.file(source, attachment_name, attachment_type, extension)
allure.attach("attachment.txt", "Text File", allure.attach_type.TEXT)
content
是 Attachment 的內容 I.e. 文字內容attachment_name: attachment
的名字attachment_type: attachment
的檔案類型 (I.e. text/plain
)extension
: attachment 的擴展名稱,是指在檔案名稱中的最後部分,用來識別該檔案的類型或格式的部分。 (I.e. txt
)attachment_type
和 extension
,一般都可用 allure.attach_type
的值來表示。
# allure.attach_type 的值為 tuple,會包括 file type 和 extension。
# 以下是常用的 Attach Type:
TEXT = ("text/plain", "txt")
CSV = ("text/csv", "csv")
HTML = ("text/html", "html")
XML = ("application/xml", "xml")
JSON = ("application/json", "json")
YAML = ("application/yaml", "yaml")
PDF = ("application/pdf", "pdf")
PNG = ("image/png", "png")
JPG = ("image/jpg", "jpg")
TIFF = ("image/tiff", "tiff")
MP4 = ("video/mp4", "mp4")
標記嚴重性 (Severity)
@allure.serverity
來標記嚴重性,帶入的參數為 allure.severity_level 的值。分別有 BLOCKER
, CRITICAL
, NORMAL
, MINOR
和 TRIVIAL
。將會在報告顯示該 Test Case 的嚴重性。
@allure.severity(allure.severity_level.NORMAL)
以上介紹常用的,allure 還有很多的 annotation 可以用來修飾報告,不妨參看官方網站。
報告我們會記錄執行的步驟,但執行步驟過程,我們或許需要加入一些 Log 作記錄細節內容,以便發生問題的時候,用來查找問題。可直接應用 python 內建的 logging 套件。
在 pytest
中,log_level
可以設定多種不同的 Log 的級別。
以下是一些常見的等級:
CRITICAL
:致命的錯誤,表示程序可能無法繼續運行。ERROR
:錯誤,但程序仍然可以繼續運行。WARNING
:表示一些意外情況可能會導致問題。INFO
:用來輸出程序運行時的一般信息。DEBUG
:用來輸出詳細的 Debug Message。會根據設定的 log_level
顯示 該 level 以上的所有級別的 Log。
如一般都會將 log_level
設定為 INFO
,則 INFO
、WARNING
、ERROR
和 CRITICAL
級別的 Log 都會被顯示。而 DEBUG
級別的 Log 則不會被顯示。
DEBUG
的內容過於詳細,影響可讀性,有 Debug 需要時才會啟用。
這設定有助於確保你只看到你所關心的程式運行訊息,從而更容易 Debug。
關於 Log 相關配置,可以在 pytest.ini 作設定
# pytest.ini
# 全局的設定:
log_level = INFO
log_date_format = %Y-%m-%d %H:%M:%S
log_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
# 執行中顯示的 Log,設定為 True 即可啟用,相關設定若與全局不同才需要設定
log_cli = True
;log_cli_level = INFO
;log_cli_date_format = %Y-%m-%d %H:%M:%S
;log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
# Log File 的設定,需要設定 Log File 生成位置。相關設定若與全局不同才需要設定
log_file = logs/pytest-logs.log
;log_file_level = INFO
;log_file_date_format = %Y-%m-%d %H:%M:%S
;log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
在程式碼中只需要 import logging,再應用 logging 加入訊息到對應的 Log Level 即可。
import logging
def test_log():
# 加入 Log Message 至 Info Level
logging.info("Log Here")
基於以上的目的,我們的測試報告內容設計相當重要。你需要判斷哪些資訊值得被記錄下來,是可以有效提高 Debug 的速度,和作為分析優化。
以下會有一些建議的 Report 內容可供參考:
- Steps (操作過程式的記錄)
- Test Data
- 過程中的 Output
- UI 測試:Element Locator 以及查找所需時間
- UI 測試:關鍵的截圖
- API 測試:HTTP Method, Header, Request / Response Body, HTTP Status 等資料
- 判斷 Test Case Passed / Failed 的 實際與預期結果資料