Pytest精通指南(09)利用Fixture给函数设置别名

46 篇文章 1 订阅
32 篇文章 1 订阅


请添加图片描述

前言

pytest 中,@pytest.fixture 装饰器用于定义可以在多个测试函数中重用的设置和清理代码。

  • name 参数允许为fixture函数指定一个更易读、更有描述性的名称,这样在其他测试函数或fixture中引用它时就可以使用这个别名,而不是函数名本身。
  • ids 参数则是与 @pytest.fixture 装饰器一起使用的,用于给参数化测试中的每一组数据提供一个描述性的名称。这样,当运行测试时,每个测试实例在输出中会有一个更易于理解的名称,而不是默认生成的基于参数值的名称。

这样做的好处:

  • 可读性高:通过为 fixture 和参数化数据提供描述性的名称,测试代码和输出报告的可读性大大提高,使得开发和维护测试变得更加容易。
  • 明确意图:使用别名可以让其他开发者更容易理解测试的意图和目的,特别是当测试逻辑变得复杂时。
  • 组织性高:别名有助于组织和管理测试代码,特别是在大型项目中有许多测试函数和 fixture 时。
  • 调试方便:当测试失败时,描述性的名称可以帮助开发者更快地定位问题所在,而不需要逐个检查每个测试实例的参数值。

测试用例默认显示

传递一个参数

示例代码


import pytest


@pytest.fixture(params=[111, 222, 333])
def data(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, data):
        print(f"\n---test_case:data={data}")
        assert isinstance(data, int), "数据非int类型"

执行效果

请添加图片描述

传递多个参数

示例代码


import pytest


@pytest.fixture(params=[111, 222, 333])
def data1(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


@pytest.fixture(params=["aaa", "bbb", "ccc"])
def data2(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, data1, data2):
        print(f"\n---test_case:data1={data1}, data2={data2}")
        assert isinstance(data1, int), "数据1非int类型"
        assert isinstance(data2, str), "数据2非str类型"

通过Test类执行效果

请添加图片描述

通过命令行执行效果

请添加图片描述

利用Fixture修改测试函数名称

传递一个参数

示例代码

import pytest


# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[111, 222, 333], ids=["item1", "item2", "item3"])
def data(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, data):
        print(f"\n---test_case:data={data}")
        assert isinstance(data, int), "数据非int类型"

执行效果

请添加图片描述

传递多个参数

示例代码

# -*- coding: utf-8 -*-
"""
@WorkNo  : CS4224
@Author  : yangkai
@Email   : yangkai1@dev.bosc
@Project : PythonWorkspace
@Module  : test_case_05.py
@DateTime: 2024/4/3 08:30
"""

import pytest


# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[18, 19, 20], ids=["age=18", "age=19", "age=20"])
def age(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


@pytest.fixture(params=["张三", "李四", "王五"], ids=["name=zhangsan", "name=lisi", "name=wangwu"])
def name(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, age, name):
        print(f"\n---test_case:age={age}, name={name}")
        assert age >= 18, "年龄不可低于18岁"
        assert name is not None, "姓名不可为None"

通过Test类执行效果

请添加图片描述

通过命令行执行效果

请添加图片描述

验证ids和params长度不一致

示例代码

import pytest


# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[111, 222, 333], ids=["item1", "item2"])
def data(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, data):
        print(f"\n---test_case:data={data}")
        assert isinstance(data, int), "数据非int类型"

验证结果

请添加图片描述

修改Fixture函数名称

利用name参数给被@pytest.fixture修饰的函数取别名

import pytest


# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=["张三", "李四", "王五"],
                ids=["name=zhangsan", "name=lisi", "name=wangwu"],
                name="names")
def data(request):  # 必须是request这个参数名
    return request.param  # 依次取列表中的每个值返回


class TestClassCase05:

    def test_case(self, data):
        print(f"\n---test_case:data={data}")
        assert data is not None, "姓名不可为None"

执行效果

请添加图片描述

这时,我们将依赖的fixture函数名称修改成names别名

结果:程序运行正常,但是没有得到实际的数据,data被识别为可调用函数

请添加图片描述

结论,当给fixture设置别名时,引用时需要使用别名

请添加图片描述

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值