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)

执行结果

 

posted @ 2021-07-29 15:40  Tester-**  阅读(204)  评论(0编辑  收藏  举报