Pytest系列(10) - fixture 傳參數 request的詳細使用


如果你還想從頭學起Pytest,可以看看這個系列的文章哦!

https://www.cnblogs.com/poloyy/category/1690628.html

 

前言

  • 為了提高復用性,我們在寫測試用例的時候,會用到不同的fixture,比如:最常見的登錄操作,大部分的用例的前置條件都是登錄
  • 假設不同的用例想登錄不同的測試賬號,那么登錄fixture就不能把賬號寫死,需要通過傳參的方式來完成登錄操作

 

案例一:傳單個參數

import pytest


@pytest.fixture()
def login(request):
    name = request.param
    print(f"== 賬號是:{name} ==")
    return name


data = ["pyy1", "polo"]
ids = [f"login_test_name is:{name}" for name in data]


@pytest.mark.parametrize("login", data, ids=ids, indirect=True)
def test_name(login):
    print(f" 測試用例的登錄賬號是:{login} ")

執行結果

collecting ... collected 2 items

10fixture_request.py::test_name[login_test_name is:pyy1] == 賬號是:pyy1 ==
PASSED          [ 50%] 測試用例的登錄賬號是:pyy1 

10fixture_request.py::test_name[login_test_name is:polo] == 賬號是:polo ==
PASSED          [100%] 測試用例的登錄賬號是:polo 

知識點

  • 添加  indirect=True  參數是為了把 login 當成一個函數去執行,而不是一個參數,並且將data當做參數傳入函數
  • def test_name(login) ,這里的login是獲取fixture返回的值

 

案例二:多個參數

@pytest.fixture()
def logins(request):
    param = request.param
    print(f"賬號是:{param['username']},密碼是:{param['pwd']}")
    return param


data = [
    {"username": "name1", "pwd": "pwd1"},
    {"username": "name2", "pwd": "pwd2"},
]


@pytest.mark.parametrize("logins", data, indirect=True)
def test_name_pwd(logins):
    print(f"賬號是:{logins['username']},密碼是:{logins['pwd']}")

執行結果

10fixture_request.py::test_name_pwd[logins0] 賬號是:name1,密碼是:pwd1
PASSED                      [ 50%]賬號是:name1,密碼是:pwd1

10fixture_request.py::test_name_pwd[logins1] 賬號是:name2,密碼是:pwd2
PASSED                      [100%]賬號是:name2,密碼是:pwd2

知識點

如果需要傳多個參數,需要通過字典去傳

 

案例三:多個fixture(只加一個裝飾器)

這種更常用

# 多個fixture
@pytest.fixture(scope="module")
def input_user(request):
    user = request.param
    print("登錄賬戶:%s" % user)
    return user


@pytest.fixture(scope="module")
def input_psw(request):
    psw = request.param
    print("登錄密碼:%s" % psw)
    return psw


data = [
    ("name1", "pwd1"),
    ("name2", "pwd2")
]


@pytest.mark.parametrize("input_user,input_psw", data, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的內容:", input_user, input_psw)

執行結果

10fixture_request.py::test_more_fixture[name1-pwd1] 登錄賬戶:name1
登錄密碼:pwd1
PASSED               [ 50%]fixture返回的內容: name1 pwd1

10fixture_request.py::test_more_fixture[name2-pwd2] 登錄賬戶:name2
登錄密碼:pwd2
PASSED               [100%]fixture返回的內容: name2 pwd2

 

案例四:多個fixture(疊加裝飾器)

# 多個fixture
@pytest.fixture(scope="function")
def input_user(request):
    user = request.param
    print("登錄賬戶:%s" % user)
    return user


@pytest.fixture(scope="function")
def input_psw(request):
    psw = request.param
    print("登錄密碼:%s" % psw)
    return psw


name = ["name1", "name2"]
pwd = ["pwd1", "pwd2"]


@pytest.mark.parametrize("input_user", name, indirect=True)
@pytest.mark.parametrize("input_psw", pwd, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的內容:", input_user, input_psw)

執行結果

10fixture_request.py::test_more_fixture[pwd1-name1] 登錄賬戶:name1
登錄密碼:pwd1
PASSED               [ 25%]fixture返回的內容: name1 pwd1

10fixture_request.py::test_more_fixture[pwd1-name2] 登錄賬戶:name2
登錄密碼:pwd1
PASSED               [ 50%]fixture返回的內容: name2 pwd1

10fixture_request.py::test_more_fixture[pwd2-name1] 登錄賬戶:name1
登錄密碼:pwd2
PASSED               [ 75%]fixture返回的內容: name1 pwd2

10fixture_request.py::test_more_fixture[pwd2-name2] 登錄賬戶:name2
登錄密碼:pwd2
PASSED               [100%]fixture返回的內容: name2 pwd2

測試用例數=2*2=4條

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM