pytest的fixture传参数

为了提高复用性,我们在写测试用例的时候,会用到不同的fixture,
比如:最常见的登录操作,大部分的用例的前置条件都是登录
假设不同的用例想登录不同的测试账号,
那么登录fixture就不能把账号写死,
需要通过传参的方式来完成登录操作


#coding=utf-8
import pytest

#fixture传单个参数

@pytest.fixture()
def login(request):
    name=request.param #request.param就代表参数化的data里的每一个参数
    #print("账号是:{}".format(name))
    return name

data=["vince","jerry"]

@pytest.mark.parametrize(
    'login',
    data,
    indirect=True
)
def test_01(login):
    print("测试账号是:{}".format(login))

if __name__ == '__main__':
    pytest.main(["-s","test_param2.py"])
    
"""
注:
indirect=True 表示将参数'login'当做一个函数去执行(即参数名要和定义的fixture的函数名一致),而不是一个参数变量,并且将data当做参数传递给该函数
def test_01(login) ,这里的login是获取fixture返回的值

结果:
test_param2.py 测试账号是:vince
.测试账号是:jerry
.
"""

import pytest

@pytest.fixture()
def fixture_pre_post(request):
    print("打开浏览器")
    print(request.param)
    yield
    print("关闭浏览器")

class TestFeature():
    @pytest.mark.parametrize('fixture_pre_post', ["aaaaa", ], indirect=True)
    def test_01(self, fixture_pre_post):
        print("test_01")

    def test_02(self):
        print("test_02")

#######运行结果########
============================= test session starts =============================
collecting ... collected 2 items

test_feature.py::TestFeature::test_01[aaaaa] 打开浏览器
aaaaa
PASSED                      [ 50%]test_01
关闭浏览器

test_feature.py::TestFeature::test_02 PASSED                             [100%]test_02


============================== 2 passed in 0.01s ==============================

fixture传多个参数

#coding=utf-8
import pytest
@pytest.fixture()
def logins(request):
    param=request.param
    #print("账号是:{}".format(name))
    return param

data=[{"username":"user1","passwd":"123"},
      {"username":"user2","passwd":"456"}
      ]

@pytest.mark.parametrize(
    'logins',
    data,
    indirect=True
)
def test_01(logins):
    print("测试用户名是:{0}———测试密码是:{1}".format(logins["username"],logins["passwd"]))

if __name__ == '__main__':
    pytest.main(["-s","test_param3.py"])
"""
结果:

test_param3.py 测试用户名是:user1———测试密码是:123
.测试用户名是:user2———测试密码是:456
.
"""

多个fixtur只加一个装饰器

#coding=utf-8
import pytest
@pytest.fixture()
def input_user(request):
    user=request.param
    return user

@pytest.fixture()
def input_pwd(request):
    pwd=request.param
    return pwd



data=[("user1","123"),
      ("user2","456")
      ]

@pytest.mark.parametrize(
    'input_user,input_pwd',
    data,
    indirect=True
)
def test_01(input_user,input_pwd):
    print("测试用户名是:{0}———测试密码是:{1}".format(input_user,input_pwd))

if __name__ == '__main__':
    pytest.main(["-s","test_param4.py"])
"""
结果:
test_param4.py 测试用户名是:user1———测试密码是:123
.测试用户名是:user2———测试密码是:456
.
"""

多个fixtur叠加装饰器

#coding=utf-8
import pytest

@pytest.fixture()
def input_user(request):
    user=request.param
    return user

@pytest.fixture()
def input_pwd(request):
    pwd=request.param
    return pwd



data=[("user1","123"),
      ("user2","456")
      ]

@pytest.mark.parametrize('input_user',data,indirect=True)
@pytest.mark.parametrize('input_pwd',data,indirect=True)
def test_01(input_user,input_pwd):
    print("测试用户名是:{0}———测试密码是:{1}".format(input_user,input_pwd))

if __name__ == '__main__':
    pytest.main(["-s","test_param5.py"])
"""
结果:
test_param5.py 测试用户名是:('user1', '123')———测试密码是:('user1', '123')
.测试用户名是:('user2', '456')———测试密码是:('user1', '123')
.测试用户名是:('user1', '123')———测试密码是:('user2', '456')
.测试用户名是:('user2', '456')———测试密码是:('user2', '456')
.
"""
Pytest中的fixture参是用于创建和管理测试固件的装饰器。它可以在测试函中作为参使用,提供可重用的测试环境和据。 常见的fixture参有以下几种: 1. autouse:控制fixture的自动使用。如果将其设置为True,则每个测试函都会自动使用该fixture,而无需显式引用。 2. scope:控制fixture的作用域。可以设置为"function"(默认值,每个测试函都会调用一次fixture)、"class"(每个测试类都会调用一次fixture)、"module"(每个模块都会调用一次fixture)或"session"(整个测试过程中只会调用一次fixture)。 3. params:允许将多个参传递给fixture,以便生成不同的测试环境和据。每个参都会对应一个独立的fixture实例。 4. autouse、scope和params可以结合使用,以满足不同的测试需求。 示例代码如下: ```python import pytest # 定义一个简单的fixture @pytest.fixture(scope="module") def setup_module(): print("执行 setup_module") # 使用fixture def test_example(setup_module): print("执行 test_example") # 使用autouse=True的fixture @pytest.fixture(autouse=True) def setup_autouse(): print("执行 setup_autouse") # 使用params的fixture @pytest.fixture(params=[1, 2, 3]) def setup_params(request): print(f"执行 setup_params,参值为{request.param}") # 使用autouse和scope的fixture @pytest.fixture(autouse=True, scope="class") def setup_class(): print("执行 setup_class") # 使用多个fixture def test_multiple_fixtures(setup_module, setup_autouse, setup_params): print("执行 test_multiple_fixtures") ``` 运行上述代码,输出结果如下: ``` 执行 setup_module 执行 setup_autouse 执行 setup_class 执行 setup_params,参值为1 执行 test_example 执行 setup_params,参值为2 执行 test_example 执行 setup_params,参值为3 执行 test_example 执行 test_multiple_fixtures ``` 这是一个简单的示例,演示了如何使用pytest fixture参来管理测试固件。fixture参可以帮助我们更方便地创建、共享和管理测试环境和据,提高测试代码的可维护性和复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值