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 包。

安裝:

  1. 解壓 —> 進入 bin 目錄 —> 執行 allure.bat
  2. 把 bin 目錄加入 Path 環境變數
  3. 配合 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:輕微缺陷(必須項無提示,或者提示不規範)

步驟:

  1. 在方法、函式和類上面加:@allure.severity(allure.severity_level.TRIVIAL)
  2. 指定執行對應級別的用例: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() 的樣式

如下圖所示,多了個蟲子樣式: