一、前言
上篇文章有提及pytest.mark.parametrize的使用,這次在此基礎上結合fixture和request再做個延伸。
二、傳單個參數
即一個參數一個值,示例代碼如下:
# 傳單個參數
@pytest.fixture()
def getuser(request):
user = request.param
print(f" 獲取用戶: {user}")
return user
data = ["lilei", "jojo", "hanmeimei"]
# 用英文哈,中文會被加密
ids = [f" mark input :{user} " for user in data]
@pytest.mark.parametrize("getuser", data, ids=ids, indirect=True)
class TestClass(object):
def test_getuser(self, getuser):
print(f"輸出用戶信息:{getuser}")
運行結果如下:
說明:
僅當 indirect=True,getuser才會當成一個函數去執行,而不是一個參數,並將data當做參數傳入函數,test_getuser(self, getuser),這里的getuser是獲取fixture返回的值。
三、傳多個參數
即結合字典的使用,示例代碼如下:
# 傳多個參數
@pytest.fixture()
def getlogins(request):
param = request.param
print(f" 獲取用戶名: {param['username']} 獲取密碼:{param['password']}")
return param
data = [{"username": "jojo", "password": "123456"},
{"username": "hanmeimei", "password": "123456"},
{"username": "lilei", "password": "123456"}]
@pytest.mark.parametrize("getlogins", data, indirect=True)
def test_getlogin(getlogins):
print(f"用戶名:{getlogins['username']} 密碼:{getlogins['password']}")
運行結果如下:
四、一個裝飾器加多個fixture
一個裝飾器的意思就是,數據源是一個,這次我們用元祖來做數據源,示例代碼如下:
# 一個裝飾器+多個fixture
@pytest.fixture(scope="module")
def getusername(request):
username = request.param
print(f" username is {username}")
return username
@pytest.fixture(scope="module")
def getpassword(request):
password = request.param
print(f" password is {password}")
return password
data = [("jojo", "1"), ("lilei", "123654")]
@pytest.mark.parametrize("getusername,getpassword", data, indirect=True)
def test_getUserinfo(getusername, getpassword):
print(f"用戶名:{getusername} 密碼:{getpassword}")
運行結果如下:
五、多個裝飾器+多個fixture
就是多個數據源,這次用list來做演示,示例代碼如下:
# 多個裝飾器+多個fixture
@pytest.fixture()
def users(request):
user = request.param
print(f" 用戶名:{user}")
return user
@pytest.fixture()
def pwds(request):
pwd = request.param
print(f" 密碼:{pwd}")
return pwd
data1 = ["lilei", "hameimei", "jojo"]
data2 = ["1", "2", "3"]
@pytest.mark.parametrize("users", data1, indirect=True)
@pytest.mark.parametrize("pwds", data2, indirect=True)
def test_getuserinfo(users, pwds):
print(f"用戶名為:{users} 密碼為:{pwds}")
運行結果如下:
細心的同學可能會發現,這塊和上篇文章第4小結一樣,多個參數的混合使用,類似笛卡爾積的意思。
注意:
當多個參數時,需要用 變量=request.param來接收參數,否則不好用哦。