pytest(1):fixture 传参数 request的详细使用
前言
- 为了提高复用性,我们在写测试用例的时候,会用到不同的fixture,比如:最常见的登录操作,大部分的用例的前置条件都是登录
- 假设不同的用例想登录不同的测试账号,那么登录fixture就不能把账号写死,需要通过传参的方式来完成登录操作
案例一:传单个参数-函数传参
import pytest
def login(user, password):
'''登录函数'''
print('用户名:%s' % user)
print('密码:%s' % password)
return 'hello'
login_data = [('admin', '123456'), ('admin','')]
# 装饰器
@pytest.mark.parametrize('user, password', login_data)
def test_login(user, password):
'''登录测试用例'''
result = login(user, password)
assert result == 'hello'
if __name__ == '__main__':
pytest.main('-s', 'day0110_fixture.py')
'''
运行结果
============================= test session starts =============================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.8.0, pluggy-0.13.1
rootdir: F:\python work\youyou_class\study_pytestcollected 2 items
day0110_fixture.py .用户名:admin
密码:123456
.用户名:admin
密码:
[100%]
========================== 2 passed in 0.02 seconds ===========================
'''
案例一:传单个参数-request传参
request就是我需要什么东西,用来接受参数,用到@pytest.fixture装饰器,传参就用默认的request参数,user = request.param 这一步是接收传入的参数。
import pytest
# 测试账号数据
test_data = ["admin1", "admin2"]
@pytest.fixture(scope="function")
def loginA(request):
user = request.param
print("登录账户:%s"%user)
return user
@pytest.mark.parametrize("loginA", test_data, indirect=True)
def test_login(loginA):
"""登录用例"""
a = loginA
print("测试用例中login的返回值:%s" % a)
知识点
- 添加 indirect=True 参数是为了把 login 当成一个函数去执行,而不是一个参数,并且将data当做参数传入函数
- def test_name(login) ,这里的login是获取fixture返回的值
案例二:多个参数
import pytest
data=[{"user":"123","pwd":"Aa123"},
{"user":"123-2","pwd":"Aa123-2"}]
@pytest.fixture
def login(request):
data_user=request.param['user']
data_pwd=request.param['pwd']
print('login',data_user)
print('login',data_pwd)
return data_user,data_pwd
@pytest.mark.parametrize('login',data,indirect=True)
def test_login(login):
a=login
print("test_login-不同的账号密码",a)
执行结果