上一篇文章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官方文件瞭解更多。