0. 前言
簡介
Allure 框架是一個靈活的、輕量級的、支援多語言的測試報告工具,它不僅以 Web 的方式展示了簡介的測試結果,而且允許參與開發過程的每個人可以從日常執行的測試中,最大限度地提取有用資訊。
Allure 是由 Java 語言開發的,支援 Pytest,JaveScript、PHP、Ruby 等。
- 從 DEV/QA 的角度來看,Allure 提供了詳盡的測試報告,比如簡化了常見缺陷的統計;失敗的測試可以分為 bug 和被中斷的測試;還可以配置日誌、步驟、fixture、附件、計時、執行歷史;以及與 TMS、BUG 管理系統、Jenkins 整合等。所以,通過以上配置,所有負責的開發人員和測試人員可以儘可能地掌握測試資訊。
- 從管理者的角度來看,Allure 提供了一個清晰的“大圖”,即 High Level 的統計報告,其中包括已覆蓋的特性、缺陷聚集的位置、執行時間軸的外觀以及許多其他方便的事情。Allure 的模組化和可擴充套件性保證了你總是能夠對某些東西進行微調,使得 Allure 更適合你。
那麼下面就來說說如何使報告更加詳細的顯示我們需要的資訊,以及 Allure 與 Jenkins 的整合。
安裝
(Windows/Mac 通用安裝方法)
下載地址:https://github.com/allure-framework/allure2/releases,下載所需版本的 zip 包。
安裝:
- 解壓 —> 進入 bin 目錄 —> 執行 allure.bat
- 把 bin 目錄加入 Path 環境變數
- 配合 pytest,使用 allure2 生成更加精美的測試報告:pip install allure-pytest
執行方法
在測試執行期間收集結果
pytest [測試檔案] -s -q --alluredir=./result/ --clean-alluredir
- -s:表示將執行成功的案例日誌打印出來
- -q:若跟檔案執行路徑則代表只需要執行的檔案
- --alluredir:指定儲存測試結果的路徑(若目錄不存在則會新建)
- --clean-alluredir:清除歷史結果資料
檢視測試報告
方式一:用於在本地渲染後對外展示結果
allure serve ./result/
方式二:用於在本地渲染和檢視結果
# 生成報告
allure generate ./result/ -o ./report/ --clean # 注意:覆蓋路徑加 --clean # 開啟報告
allure open -h 127.0.0.1 -p 8883 ./report/
注意:/report/ 目錄中的 index.html 就是最終的結果頁面,但直接通過瀏覽器開啟這個檔案是看不到實際報告內容的,這是因為實際報告內容需要 allure 進行渲染後才能看到。
2. Allure 常用特性
場景:
- 希望在報告中看到測試功能,子功能或場景,測試步驟,包括測試附加資訊。
解決:
- import allure
- @allure.feature('功能名稱')
- @allure.story('子功能名稱')
- @allure.title('測試用例名稱')
- @allure.step('步驟細節')
- @allure.description('測試用例描述')
- @allure.attach('具體文字資訊'):需要附加的資訊,可以是資料,文字,圖片,視訊,網頁
- 如果只測試登入功能執行的時候可以加限制過濾,如:pytest 檔名 --allure_features '購物車功能' --allure_stories '加入購物車'
@alllure.feature() 與 @allure.store() 的關係
feature 相當於一個大的功能或模組。將 case 分類到某個 feature 中,並在報告中的 behaviors 中顯示,相當於 testsuite。
story 相當於分支功能/模組,屬於 feature 之下的結構,並在報告中的 features 中顯示,相當於 testcase。
feature 與 story 類似於父子關係。
@allure.step() 與 with allure.step() 的區別
- 測試過程中每個步驟,一般放在具體邏輯方法中。
- 可以放在關鍵步驟中,在報告中顯示。
- 在 App、Web 自動化測試當中,建議每切換到一個新的頁面當做一個 step。
- 用法:
- @allure.step():只能以裝飾器的形式放在類或者方法上。
- with allure.step():可以放在測試用例方法裡面,但測試步驟的程式碼需要被該語句包含。
給測試用例劃分優先順序
場景:
通常測試有冒煙測試、迴歸測試、線上驗證測試等,那麼就需要按照重要性級別來分別執行,比如上線時要把主流程和重要模組都跑一遍。
解決:
- 通過附加 pytest.mark 標記描述
- 通過 allure.feature、allure.story 標記描述
- 通過 allure.severity 直接標記用例級別
根據測試用例的重要性劃分測試用例等級,如果沒指定等級,預設為 NORMAL 級別:
- BLOCKER:阻塞缺陷(功能未實現,無法下一步)
- CRITICAL:嚴重缺陷(功能點缺失)
- NORMAL:一般缺陷(邊界情況,格式錯誤)
- MINOR:次要缺陷(介面錯誤與ui需求不符)
- TRIVIAL:輕微缺陷(必須項無提示,或者提示不規範)
步驟:
- 在方法、函式和類上面加:@allure.severity(allure.severity_level.TRIVIAL)
- 指定執行對應級別的用例:pytest -s -v 檔名 --allure-severities normal, critical
給 Allure 測試報告新增內容(圖片、附件、文字、截圖、HTML 等)
場景:
- 前端自動化測試經常需要附加圖片或 html,比如在適當的地方、適當的時機截圖等。
解決:
- @allure.attach() 顯示許多不同型別的提供的附件,可以補充測試、步驟或測試結果。
步驟:
- 在測試報告裡附加網頁:
- 格式:allure.attach(body(內容), name, attachment_typeextension)
- 示例:allure.attach('<head>/head><body>首頁</body>', '這是錯誤頁的結果資訊', allure.attachment_type.HTML)
- 在測試報告裡附加圖片:
- 格式:allure.attach.file(source, name, attachment_type, extension)
- 示例:allure.attach.file("./result/b.png", attachment_type=allure.attachment_type.PNG)
整合測試管理系統
@allure.link()、@allure.issue()、@allure.testcase() 主要是為了將 Allure 報告和測試管理系統整合,可以更快速地跳轉到公司內部地址。
先看看三個裝飾器的原始碼:
def link(url, link_type=LinkType.LINK, name=None):
return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name)) def issue(url, name=None):
return link(url, link_type=LinkType.ISSUE, name=name) def testcase(url, name=None):
return link(url, link_type=LinkType.TEST_CASE, name=name)
小結
- issue() 和 testcase() 其實呼叫的也是 link(),只是 link_type 不一樣。
- 必傳引數 url:跳轉的連結。
- 可選引數 name:顯示在 Allure 報告的名字,如果不傳就是顯示完整的連結(建議傳,不然可讀性不高)。
- 可以理解成:三個方法是一樣的,我們都提供跳轉連結和名字,只是連結的 type 不一樣,最終顯示出來的樣式不一樣而已(type 不一樣,樣式不一樣)。
- 如果你喜歡,只用 @allure.link() 也可以。
- 而出現三個裝飾器的原因是為了更好地將連結進行分類(訪問連結、Bug 連結、測試用例連結)。
程式碼示例
import allure TEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637' @allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
def test_with_link():
pass @allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='點選我看一看youtube吧')
def test_with_named_link():
pass @allure.issue('140', 'bug issue連結')
def test_with_issue_link():
pass @allure.testcase(TEST_CASE_LINK, '測試用例地址')
def test_with_testcase_link():
pass
執行結果,檢視 Allure 報告
1)@allure.link() 不傳 name 引數時的樣式
如下圖所示,不傳 name 時,當連結很長,可讀性就比較差啦。
2)@allure.link() 傳了 name 引數時的樣式
3)@allure.testcase() 的樣式
如下圖所示,和 link() 傳了 name 引數時一樣:
4)@allure.issue() 的樣式
如下圖所示,多了個蟲子樣式: