上一篇文章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)
參數說明:
body
,需要顯示的內容,也可以理解為寫入附件的內容name
,附件名稱attachment_type
,附件類型,如csv、jpg、html 等,由allure.attachment_type
提供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.properties
或environment.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
,即分類,用於展示測試結果,默認只顯示兩類缺陷結果:
- Product defects 產品缺陷(測試結果:failed)
- 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"]
}
]
參數說明:
- name:分類名稱
- matchedStatuses:測試用例的運行狀態,默認["failed", "broken", "passed", "skipped", "unknown"]
- messageRegex:測試用例運行的錯誤信息,默認是 .* ,通過正則去匹配
- traceRegex:測試用例運行的錯誤堆棧信息,默認是 .* ,同樣通過正則去匹配
執行后會在報告的Categories
中展示,首頁CATERORIES
欄展示如下:
Categories頁面展示:
總結
Allure中常用的特性大致就這些,以上僅為簡單示例,大家可根據自身項目的需要按需選擇使用。Allure提供的特性當然也不止這些,如果感興趣大家可以查看Allure官方文檔了解更多。