【pytest-fixture】九、fixture的参数化

本文介绍了pytest中fixture的参数化使用,包括参数化入门、为fixture参数设置ID、使用带有参数化fixture的标记以及配置fixture参数化自动分组测试。通过示例代码展示了如何实现测试的参数化,并分析了运行结果,帮助读者更好地理解和应用pytest的fixture功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。

1.fxiture参数化入门

1.1介绍

fixture函数可以被参数化, 在这种情况下他们可以被多次调用,每次执行一组依赖测试,即依赖于这个fixture的测试.测试函数通常不需要知道它们的重新运行.fixture参数化有助于为组件编写详细的功能测试,这些组件本身可以通过多种方式进行配置.

1.2示例代码

文件名: test_demo.py

import pytest


@pytest.fixture(params=["杨过", "小龙女", "黄蓉"])
def login(request):
	# 通过request.param获取当前参数
    print("用户" + request.param + ": 进行登录")


def test_demo(login):
    print("测试用例")

1.3运行结果

在这里插入图片描述

1.4分析结果

通过上述例子,我们可以看出fixture参数化后,有多少个参数就会进行几组依赖测试.然后我们可以通过request.param获取当前的参数.

2.为fixture各参数设置ID

2.1介绍

pytest 将构建一个字符串,该字符串是参数化夹具中每个夹具值的测试 ID,比如我们上述图片中,左侧那些乱码(其实就是我们的参数值,只不过是中文,所以出现了乱码),如果我们没有设置ID,那么pytest默认就使用参数值,如果我们设置了ID,那么就会用我们的ID.如果我们在黑窗口(cmd)中显示ID,那么我们在执行的时候需要增加pytest运行参数: pytest --collect-only将显示生成的ID.

2.2示例代码

文件名: test_demo.py

import pytest


@pytest.fixture(params=["杨过", "小龙女", "黄蓉"], ids=["yg", "xln", "hr"])
def login(request):
    print("用户" + request.param + ": 进行登录")


def test_demo(login):
    print("测试用例")

2.3运行结果

在这里插入图片描述

2.4结果分析

我们设置了ID后,可以看到左侧的列表,fixture执行的每组用例,都有我们设置上去的ID.
注意: 我们使用ID后,一定要跟前面的参数对应,不然会报错.

import pytest


@pytest.fixture(params=["杨过", "小龙女", "黄蓉"], ids=["yg"])
def login(request):
    print("用户" + request.param + ": 进行登录")


def test_demo(login):
    print("测试用例")

在这里插入图片描述

3.使用带有参数化fixture的标记

3.1介绍

pytest.param()可用于在参数化夹具的值集中应用标记,其方式与可与@pytest.mark.parametrize一起使用的方式相同。

3.2示例代码

文件名: test_demo.py

import pytest


@pytest.fixture(params=[0, 1, pytest.param(2, marks=pytest.mark.skip)])
def login(request):
    print("用户" + request.param + ": 进行登录")


def test_demo(login):
    print("测试用例")

3.3运行结果

在这里插入图片描述

3.4分析结果

我们通过在fixtrue参数中标记,然后完成了跳过第三次执行.

4.配置fixture参数化自动分组测试

4.1介绍

pytest 在测试运行期间最大限度地减少活动夹具的数量。如果您有一个参数化的夹具,那么使用它的所有测试将首先使用一个实例执行,然后在创建下一个夹具实例之前调用终结器。除此之外,这简化了对创建和使用全局状态的应用程序的测试。

4.2示例代码

文件名: test_demo.py

import pytest


@pytest.fixture(scope="module", params=["mod1", "mod2"])
def modarg(request):
    param = request.param
    print("  SETUP modarg", param)
    yield param
    print("  TEARDOWN modarg", param)


@pytest.fixture(scope="function", params=[1, 2])
def otherarg(request):
    param = request.param
    print("  SETUP otherarg", param)
    yield param
    print("  TEARDOWN otherarg", param)


def test_0(otherarg):
    print("  RUN test0 with otherarg", otherarg)


def test_1(modarg):
    print("  RUN test1 with modarg", modarg)


def test_2(otherarg, modarg):
    print("  RUN test2 with otherarg {} and modarg {}".format(otherarg, modarg))

4.3运行结果

在这里插入图片描述

4.4分析结果

上面这个例子是官网的例子,里面内容比较多,也不太容易观察,首先有两个点,一个是test0是最先执行的,它的fixture函数是函数级别的,所以正常的执行了两次.但是test1和test2就不同了,它这里是需要理解几个地方.
首先,他执行test1,然后执行了模块级别的fixture(modarg),然后这里的执行顺序就改变了,这样改变的方式会让我们尽可能的少的激活资源.然后它的执行顺序就是:
(最外层第一轮分组)前置mod1->test_1Run->前置otherarg1->test_2Run->后置otherarg1->前置otherarg2->test_2Run->后置otherarg2->后置mod1->
(最外层第二轮分组)前置mod2->test_1Run->前置otherarg1->test_2Run->后置otherarg1->前置otherarg2->test_2Run->后置otherarg2->后置mod2
通过上述的顺序,相信大家应该明白了标题所说的自动分组测试了吧,其实就是范围较大的fixture只会在范围较小的fixture参数化执行完后在执行范围较大的fixture的第二轮.
可能大家又会问为什么在test_2上面的modarg没有执行,那是因为modarg是模块级别,在这个模块的周期中只会执行一次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值