Pytest - Fixture(10) - 测试用例传参给Fixture
Pytest - 测试用例传参给Fixture
-
大多数时候我们在fixture封装的是登陆、获取cookie等操作,但是一个系统可能不止一个用户,有多个用户;
-
在写测试用例的时候,如何告诉fixture我们需要登录哪个用户?
-
可以通过测试用例给
fixture
传递参数,指定登陆用户账户信息。
传单个参数
-
fixture:
-
request
是 pytest 的内置 fixture ,主要用于传递参数;(命名不可变) -
params
参数:一个可选的参数列表,它将导致多次调用fixture函数和使用它的所有测试;获取当前参数可以使用request.param
;
-
-
测试用例:
-
parametrize
装饰器:-
"login"
:函数名为login
的 fixture ; -
test_data
:自定义的测试数据变量;变量为列表形式传递; -
indirect=True
:是将login
当成一个函数去执行,而不是一个参数;并且将data
当做参数传入login
函数 ;
-
-
def test_s1(login)
:- 这里的
login
是获取fixture
返回的值,也是调用为 fixture 的login
函数;
- 这里的
-
test_py.py
import pytest
# 封装的登陆fixture
@pytest.fixture()
def login(request):
# `request`: pytest 的内置 fixture
# `params` : 一个可选的参数列表
##name = request.param 这一步是接收传入的参数
name = request.param
print(f"\n== 用户名:{name} ==")
# 返回参数给测试用例使用
return name
# 测试用例的数据
test_data = ["admin"]
# 测试用例
@pytest.mark.parametrize("login", test_data, indirect=True)
def test_s1(login):
print("\n用例test_s1:fixture传单个参数")
# 下面login参数,是引用方法login返回的name参数
print(f"测试用例的登录账号:{login} ")
if __name__ == '__main__':
pytest.main(['-q', 'test_py.py'])
传多个参数
-
如果需要传多个参数,可以传递 字典 类型 。
test_py.py
import pytest # 封装的登陆fixture @pytest.fixture() def login(request): user = request.param print(f"\n== 用户名:{user['name']},密码:{user['pwd']} ==") # 返回参数给测试用例使用 return user # 传递多个测试数据,使用数据字典 test_data = [ {"name": "admin", "pwd": "12345"} ] # 测试用例 @pytest.mark.parametrize("login", test_data, indirect=True) def test_s1(login): print("\n用例test_s1:fixture传多个参数") # 下面login参数,是引用方法login返回的name参数 print(f"测试用例的登录账号:{login['name']} ") print(f"测试用例的登录密码:{login['pwd']} ") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])
多个fixture(一个装饰器)
-
在只使用一个装饰器情况下,要给多个fixture的传递参数,我们需要修改以下几点:
-
使用列表 + 元祖传递的参数;
-
在测试用例的装饰器和测试用例引用的fixture函数,填写需要引用fixture名称;
-
import pytest
# 登陆用户名fixture
@pytest.fixture()
def login_name(request):
name = request.param
print(f"\n== fixture输出的用户名:{name} ==")
return name
# 登陆密码fixture
@pytest.fixture()
def login_pwd(request):
pwd = request.param
print(f"== fixture输出的密码:{pwd} ==")
return pwd
# 传递测试数据给多个fixture,使用列表+元祖的形式
test_data = [
("admin", "123"),
("root", "456")
]
# 测试用例
@pytest.mark.parametrize("login_name, login_pwd", test_data, indirect=True)
def test_s1(login_name, login_pwd):
print("\n用例test_s1: 多个fixture(一个装饰器)")
# 使用fixture返回的参数
print(f"测试用例的登录账号:{login_name} ")
print(f"测试用例的登录密码:{login_pwd} ")
if __name__ == '__main__':
pytest.main(['-q', 'test_py.py'])
多个fixture(叠加装饰器)
-
多个fixfure的装饰器的使用;
- 测试用例执行数 = 装饰器数量 * 一组测试数据量最多的数据
import pytest # 封装的登陆fixture @pytest.fixture() def login_name(request): name = request.param print(f"\n== fixture输出的用户名:{name} ==") return name @pytest.fixture() def login_pwd(request): pwd = request.param print(f"== fixture输出的密码:{pwd} ==") return pwd # 测试数据 name = ["admin", "root"] pwd = ["12345", "98765"] # 测试用例,调用多个fixture @pytest.mark.parametrize("login_pwd", pwd, indirect=True) @pytest.mark.parametrize("login_name", name, indirect=True) def test_s1(login_name, login_pwd): print("\n用例test_s1:测试用例,调用多个fixture") # 使用fixture返回的参数 print(f"测试用例的登录账号:{login_name} ") print(f"测试用例的登录密码:{login_pwd} ") if __name__ == '__main__': pytest.main(['-q', 'test_py.py'])