1. 程式人生 > 實用技巧 >pytest(三十四)--引數化(parametrize)結合allure.title()生成不同標題報告

pytest(三十四)--引數化(parametrize)結合allure.title()生成不同標題報告

前言

pytest的引數化(parametrize)可以實現只需要維護測試資料,就能生成不同的測試用例目的。可以在引數化的時候加ids引數對每個用例說明使用場景。

最終我們希望在allure報告上能詳細的展示出每個用例的標題描述,這樣才能更直觀的知道每個用例是幹什麼的。

引數化parametrize

先看一個簡單的pytest引數化案例演示test_a.py

#test_a.py
import allure
import pytest
def login(uname,pwd):
    print("賬號:{}".format(uname))
    print("密碼:{}".format(pwd))
    return {"code":0,"msg":"success!"}
#測試資料
test_datas=[({"name":"admin1","password":"123456"},"success!"),
            ({"name":"admin2","password":"123456"},"failed!"),
            ({"name":"admin3","password":"123456"},"success!"),]
@allure.story("登入用例")
@pytest.mark.parametrize("users,expect",test_datas)
def test_login(users,expect):
    rs=login(users["name"],users["password"])
    assert rs["msg"]==expect

cmd 到指令碼目錄下,執行

pytest --alluredir ./report/a
allure serve ./report/a  

生成報告

這樣生成的報告在用例裡面並不能很友好的展示出每個用例的執行場景,只知道哪個用例報錯了。於是需要對每個用例加上描述,加一個ids引數。

ids引數使用

在上面用例部分程式碼裡面加個ids引數,用於描述每個用例的執行場景。

#test_a.py
import allure
import pytest
def login(uname,pwd):
    print("賬號:{}".format(uname))
    print("密碼:{}".format(pwd))
    return {"code":0,"msg":"success!"}
#測試資料
test_datas=[({"name":"admin1","password":"123456"},"success!"),
            ({"name":"admin2","password":"123456"},"failed!"),
            ({"name":"admin3","password":"123456"},"success!"),]
@allure.story("登入用例")
@pytest.mark.parametrize("users,expect",test_datas,
                         ids=[
                             "輸入正確賬號,密碼,登入成功",
                             "輸入錯誤賬號,密碼,登入失敗",
                             "輸入正確賬號,密碼,登入成功",

])
def test_login(users,expect):
    rs=login(users["name"],users["password"])
    assert rs["msg"]==expect

  

cmd命令列執行用例

pytest --alluredir ./report/a
allure serve ./report/a  

報告結果

allure.title描述用例

上面是通過在parametrize裡面新增ids引數解決,接下來再講一個用allure.title("用例描述")新增用例描述的方式解決。

使用@allure.title(“用例描述”)時,可以加上傳入的引數,如傳入的引數“users,expect”,需拼接users引數的值,可以這樣寫

@allure.title("用例描述,測試輸入:{users}")

在allure_pytest/utils.py原始碼裡面可以找到對應的程式碼

當沒有加allure.title()時候,用例的描述就是item.name值(也就是上面的ids用例的名稱),如果加了allure.title(),那麼用例的描述就是新增的title值,這兩個地方取其中的一個。

#test_a.py
import allure
import pytest
def login(uname,pwd):
    print("賬號:{}".format(uname))
    print("密碼:{}".format(pwd))
    return {"code":0,"msg":"success!"}
#測試資料
test_datas=[({"name":"admin1","password":"123456"},"success!"),
            ({"name":"admin2","password":"123456"},"failed!"),
            ({"name":"admin3","password":"123456"},"success!"),]
@allure.story("登入用例")
@pytest.mark.parametrize("users,expect",test_datas,
                         )
@allure.title("用例描述,測試輸入:{users}")
def test_login(users,expect):
    rs=login(users["name"],users["password"])
    assert rs["msg"]==expect

  

cmd命令列執行用例

pytest --alluredir ./report/a
allure serve ./report/a  

報告結果

優化用例title

結合上面兩種實現方式,把用例描述當成一個測試輸入的引數,繼續優化後如下需注意的是parametrize裡面三個引數 users,expect,titles跟test_login(users,expect,titles)裡面三個引數保持一致。

#test_a.py
import allure
import pytest
def login(uname,pwd):
    print("賬號:{}".format(uname))
    print("密碼:{}".format(pwd))
    return {"code":0,"msg":"success!"}
#測試資料
test_datas=[({"name":"admin1","password":"123456"},"success!","輸入正確賬號、密碼,登入成功"),
            ({"name":"admin2","password":"123456"},"failed!","輸入錯誤賬號、密碼,登入失敗"),
            ({"name":"admin3","password":"123456"},"success!","輸入正確賬號、密碼,登入成功"),]
@allure.story("登入用例")
@allure.title("{titles}")
@pytest.mark.parametrize("users,expect,titles",test_datas,
                         )

def test_login(users,expect,titles):
    rs=login(users["name"],users["password"])
    assert rs["msg"]==expect