pytest(12)-Allure常用特性allure.attach、allure.step、fixture、environment、categories

給你一頁白紙發表於2022-02-22

上一篇文章pytest Allure生成測試報告我們學習了Allure中的一些特性,接下來繼續學習其他常用的特性。

allure.attach

allure.attach用於在測試報告中新增附件,補充測試結果。附件格式可以是txt、jpg等,附件內容通常是測試資料、截圖等。

allure.attach提供了兩種方法:allure.attach()allure.attach.file()

allure.attach()

作用:在測試報告中生成指定內容、名稱、型別的附件

語法:allure.attach(body, name=None, attachment_type=None, extension=None)

引數說明:

  1. body,需要顯示的內容,也可以理解為寫入附件的內容
  2. name,附件名稱
  3. attachment_type,附件型別,如csv、jpg、html 等,由allure.attachment_type提供
  4. extension:附件副檔名,不常用

allure.attach.file()

作用:向測試用例中上傳附件

語法:allure.attach.file(source, name=None, attachment_type=None, extension=None)

引數說明:source為檔案路徑,其他引數與allure.attach()引數一致。

在UI自動化測試中,會經常用到這個方法來上傳用例執行的截圖。

示例

test_login.py

import allure
import pytest
import requests
import json

data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]
ids = ["username:{}-password:{}".format(username, password) for username, password in data]

@allure.epic("xx線上購物平臺介面測試")
@allure.feature("登入模組")
class TestLogin:

    @allure.story("使用者登入")
    @allure.title("登入")
    @pytest.mark.parametrize("username, password", data, ids=ids)
    def test_login(self, username, password):
        headers = {"Content-Type": "application/json;charset=utf8"}
        url = "http://127.0.0.1:5000/login"
        _data = {
            "username": username,
            "password": password
        }
        allure.attach(
            body="使用者名稱-{},密碼-{}".format(username, password),
            name="登入引數",
            attachment_type=allure.attachment_type.TEXT
        )
        res = requests.post(url=url, headers=headers, json=_data).text
        res = json.loads(res)
        assert res['code'] == 1000
        
    @allure.story("使用者退出登入")
    @allure.title("退出登入")
    def test_logout(self):
        '''這條測試用例僅僅只是為了舉例說明allure.attach.file的使用'''
        print("退出登入,並截圖")
        # 截圖路徑
        testcase_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        source_path = testcase_path + "/screenshot/logout.jpg"
        allure.attach.file(
            source=source_path,
            name="退出登入後截圖",
            attachment_type=allure.attachment_type.JPG
        )
        assert True

上述程式碼中使用了@pytest.mark.parametrize(),Allure能夠很好的支援@pytest.mark.parametrize()進行引數化。

run.py

if __name__ == '__main__':
    pytest.main(['testcase/test_login.py', '-s', '-q', '--alluredir', './result'])
    os.system('allure generate ./result -o ./report --clean')

執行run.py,測試報告結果展示如下:

allure.attach()結果:

allure.attach.file()結果:

從結果可以看出來,兩種方法都在報告中對應的測試用例中展示了附件內容。

allure.attach()結果還可以看出來,Allure能夠很好的支援@pytest.mark.parametrize()進行引數化

with allure.step

上一篇文章我們使用了裝飾器@allure.step()標記函式使之成為測試步驟,而在測試函式/方法中,我們還可以通過with allure.step()的方式標記測試步驟。

它們之間的區別在於,@allure.step()用於標記通用函式,當這個被標記的函式被呼叫後,會插入步驟說明並展示在Allure報告中。

with allure.step()則是將普通的程式碼標記為測試步驟,執行到這段程式碼時則會在Allure報告中展示步驟說明。

我們在上面程式碼的基礎上,加入with allure.step(),示例如下:

import allure
import pytest
import requests
import json


data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]
ids = ["username:{}-password:{}".format(username, password) for username, password in data]

@allure.epic("xx線上購物平臺介面測試")
@allure.feature("登入模組")
class TestLogin:

    @allure.story("使用者登入")
    @allure.title("登入")
    @pytest.mark.parametrize("username, password", data, ids=ids)
    def test_login(self, username, password):
        headers = {"Content-Type": "application/json;charset=utf8"}
        url = "http://127.0.0.1:5000/login"
        _data = {
            "username": username,
            "password": password
        }
        # 第一步,請求登入介面
        with allure.step("請求登入介面"):
            allure.attach(
                body="使用者名稱-{},密碼-{}".format(username, password),
                name="登入引數",
                attachment_type=allure.attachment_type.TEXT
            )
            res = requests.post(url=url, headers=headers, json=_data).text
            res = json.loads(res)
        # 第二步,獲取返回引數進行斷言
        with allure.step("斷言"):
            assert res['code'] == 1000

測試報告結果展示如下:

程式碼中插入的測試步驟如上圖中的標記所示。

fixture

pytest的fixture函式可以實現setup、teardown的功能,而Allure會跟蹤每個fixture的呼叫情況,詳細顯示呼叫了哪些fixture和引數以及呼叫順序。

我們在上面程式碼的基礎上,加入fixture函式,示例如下:

import allure
import pytest
import requests
import json

@pytest.fixture(scope="class", autouse=True)
def fixture_demo(request):
    print("連線資料庫")
    def finalizer():
        print("關閉資料庫")
    request.addfinalizer(finalizer)


data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]
ids = ["username:{}-password:{}".format(username, password) for username, password in data]

@allure.epic("xx線上購物平臺介面測試")
@allure.feature("登入模組")
class TestLogin:

    @allure.story("使用者登入")
    @allure.title("登入")
    @pytest.mark.parametrize("username, password", data, ids=ids)
    def test_login(self, username, password):
        headers = {"Content-Type": "application/json;charset=utf8"}
        url = "http://127.0.0.1:5000/login"
        _data = {
            "username": username,
            "password": password
        }
        # 第一步,請求登入介面
        with allure.step("請求登入介面"):
            allure.attach(
                body="使用者名稱-{},密碼-{}".format(username, password),
                name="登入引數",
                attachment_type=allure.attachment_type.TEXT
            )
            res = requests.post(url=url, headers=headers, json=_data).text
            res = json.loads(res)
        # 第二步,獲取返回引數進行斷言
        with allure.step("斷言"):
            assert res['code'] == 1000

測試報告結果展示如下:

從結果可以看出來,Allure測試報告展示了用例呼叫的fixture函式資訊。多個fixture函式被呼叫及其執行順序的展示,這裡不做過多說明。

environment

在Allure報告的首頁可以展示此次測試執行的環境資訊 (如測試環境、測試人員、被測系統版本號、系統配置環境等),這需要通過建立environment.propertiesenvironment.xml進行配置,並把檔案放置在--alluredir指定的資料夾中 (博主這裡即result資料夾)。

environment.properties示例如下:

system=win
python=3.7.7
version=1.0.1
host=127.0.0.1

environment.xml

<environment>
    <parameter>
        <key>system</key>
        <value>win</value>
    </parameter>
    <parameter>
        <key>python</key>
        <value>3.7.7</value>
    </parameter>
    <parameter>
        <key>version</key>
        <value>1.0.1</value>
    </parameter>
    <parameter>
        <key>host</key>
        <value>127.0.0.1</value>
    </parameter>
</environment>

生成報告後首頁展示ENVIRONMENT資訊如下:

categories

Allure報告中有一欄叫Categories,即分類,用於展示測試結果,預設只顯示兩類缺陷結果:

  1. Product defects 產品缺陷(測試結果:failed)
  2. Test defects 測試缺陷(測試結果:error/broken)

如下圖所示

如果想要缺陷分類顯示更豐富,我們可以通過建立categories.json檔案進行自定義缺陷分類,並把檔案放置在--alluredir指定的資料夾中 (即同environment.properties放在同一目錄中)。

categories.json示例如下:

[
  {
    "name": "Passed tests",
    "matchedStatuses": ["passed"]
  },
  {
    "name": "Ignored tests",
    "matchedStatuses": ["skipped"]
  },
  {
    "name": "Infrastructure problems",
    "matchedStatuses": ["broken", "failed"],
    "messageRegex": ".*bye-bye.*"
  },
  {
    "name": "Outdated tests",
    "matchedStatuses": ["broken"],
    "traceRegex": ".*FileNotFoundException.*"
  },
  {
    "name": "Product defects",
    "matchedStatuses": ["failed"]
  },
  {
    "name": "Test defects",
    "matchedStatuses": ["broken"]
  }
]

引數說明:

  1. name:分類名稱
  2. matchedStatuses:測試用例的執行狀態,預設["failed", "broken", "passed", "skipped", "unknown"]
  3. messageRegex:測試用例執行的錯誤資訊,預設是 .* ,通過正則去匹配
  4. traceRegex:測試用例執行的錯誤堆疊資訊,預設是 .* ,同樣通過正則去匹配

執行後會在報告的Categories中展示,首頁CATERORIES欄展示如下:

Categories頁面展示:

總結

Allure中常用的特性大致就這些,以上僅為簡單示例,大家可根據自身專案的需要按需選擇使用。Allure提供的特性當然也不止這些,如果感興趣大家可以檢視Allure官方文件瞭解更多。

相關文章