pytest用例间传递参数

文章介绍了如何在pytest测试框架中,通过conftest.py文件设置全局变量,以便在不同测试用例间共享接口返回的参数。通过定义set_data和get_data两个fixture,可以在测试方法中设置和获取这些全局数据。

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

        pytest使用过程中,我们遇到一种情况,测试框架中使用的test_001用例的接口返回值是test_002、test_003需要用到的入参。

        这种情况下,该如何将所需的参数提取出来并在别处调用呢?

可以借助conftest.py文件实现设置多个全局级别参数,再需要的地方调用指定的参数:

原理:

        字典里存放数据,可以通过:

        dict1['num1'] = 10

        设置字典中key所对应的value,像这样:

dict1 = {}  # 先定义一个空字典

dict1['num1'] = 10  # 字典里设置一个key为num1 ,value为10
dict1['num2'] = 20
print(type(dict1))
print(dict1['num1'], dict1.get('num2'))

# 打印结果:
# <class 'dict'>
# 10 20

conftest.py中这样写:

global_data = {}


# 也可以写成@pytest.fixture()。默认的scope就是function级别
@pytest.fixture(scope='function')
def set_data():
    def _set_data(key, value):
        global_data[key] = value

    return _set_data


@pytest.fixture()
def get_data():
    def _get_data(key):
        return global_data.get(key)

    return _get_data

此处注意,conftest.py只针对同级package下的test_***.py文件生效,如图下,只会对test_002、test_003、test_004、test_005、test_006生效。

我们用test_006做演示:

006中的代码:

import pytest

class Test001:
    def test_001(self, set_data):
        num1 = 1
        set_data('num1', num1)

    def test_002(self, get_data):
        print('值是', get_data("num1"))

    def test_003(self, get_data):
        print('值是', get_data("num1"))

class Test002:
    def test_001(self, get_data):
        print('num1值是', get_data("num1"))
        print('num2值是', get_data("num2"))

if __name__ == '__main__':
    pytest.main()

在需要设置全局参数时,调用set_data(),并传入唯一的key和value。

在需要调用全局参数时,调用get_data(),并传入所需value的key。

通过以上方式,即可将接口返回值中的值拿到并在其他函数中使用。

### Pytest 装饰器概述 Pytest 提供了多种内置装饰器来增强测试用的功能和灵活性。这些装饰器可以用来标记测试函数、控制执行顺序以及处理依赖关系等。 #### `@pytest.mark.skip` 和 `@pytest.mark.xfail` 为了跳过某些特定条件下的测试或者预期失败的测试,可以使用这两个装饰器。这有助于保持测试套件的清洁并专注于真正需要关注的地方[^1]。 ```python import pytest @pytest.mark.skip(reason="no way of currently testing this") def test_the_unknown(): pass @pytest.mark.xfail(reason="this feature is not implemented yet") def test_feature_not_implemented(): assert False ``` #### 参数化测试:`@pytest.mark.parametrize` 参数化允许同一个测试逻辑应用于不同的输入数据集,从而提高代码重用性和覆盖范围。通过传递多个参数组合给单个测试方法实现这一点[^2]。 ```python import pytest @pytest.mark.parametrize( "input,expected", [ (1, 2), (2, 3), (-1, 0), ], ) def test_increment(input, expected): from mymodule import increment_by_one result = increment_by_one(input) assert result == expected ``` #### 使用自定义标签:`@pytest.mark.<custom_tag>` 除了预定义好的标记外,还可以创建自己的标签以便更好地分类管理测试案。这对于大型项目特别有用,在那里可以根据功能模块或其他标准分组运行测试集合[^3]。 ```python import pytest @pytest.mark.database_operations class TestDatabase: @pytest.mark.create_user def test_create_new_user(self): # 测试创建新用户的逻辑... pass @pytest.mark.update_profile def test_update_existing_profile(self): # 更新现有配置文件的测试... pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值