【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数

在这里插入图片描述
在之前的分享中,我们知道可以使用yield或者return关键字把fixture函数里的值传递给test函数

这种方法很实用,比如我在fixture函数里向数据库里插入必要的测试数据,那我就可以把相关数据返回给test函数用来做相关断言查询等操作。

那如果我想把test函数(也就是测试用例)中的数据传给fixture函数使用,要如何实现呢?

直接先贴上一段示例代码:

import pytest


@pytest.fixture
def fixt(request):
    marker = request.node.get_closest_marker("fixt_data")
    if marker is None:
        # Handle missing marker in some way...
        data = None
    else:
        data = marker.args[0]

    # Do something with the data
    return data


@pytest.mark.fixt_data(42)
def test_fixt(fixt):
    assert fixt == 42

一、前置知识

代码中可能有2个知识点,可能有的小伙伴并不熟悉,分别来看下。

1. Mark 标记

什么是mark标记,干什么用?

标记

在 `pytest` 中,测试用例之间的数据共享或传递可以通过多种方式实现,主要包括使用 `fixture`、模块级变量以及 `pytest` 的参数化机制。 ### 使用 `fixture` 传递数据 `@pytest.fixture` 是一种非常强大的机制,可以用于在多个测试用例之间共享数据。通过 `fixture`,可以在一个测试用例中生成的数据供其他测试用例使用。例如,以下代码展示了如何在一个测试用例中生成用户数据将其传递给另一个测试用例: ```python import pytest @pytest.fixture() def create_user(): user = {"username": "test_user", "password": "123456"} return user def test_login_success(create_user): assert login(create_user["username"], create_user["password"]) == True def test_profile_access(create_user): assert access_profile(create_user["username"]) == True ``` 在这个例子中,`create_user` 准备了一个用户对象,且该对象被 `test_login_success` 和 `test_profile_access` 共享[^3]。 ### 使用模块级变量 另一种方法是使用模块级变量来存储和传递数据。这种方法适用于需要在整个测试模块中共享的简单数据。例如: ```python # 模块级变量 user_data = {} @pytest.fixture() def setup_user(): global user_data user_data["username"] = "test_user" user_data["password"] = "123456" def test_login(setup_user): assert login(user_data["username"], user_data["password"]) == True def test_logout(setup_user): assert logout(user_data["username"]) == True ``` 这种方式虽然简单,但需要注意避免不同测试用例之间的数据污染问题。 ### 参数化测试用例 如果需要针对不同的输入组合进行测试,可以使用 `@pytest.mark.parametrize` 来参数化测试用例。这允许为同一个测试函数提供多组输入数据,从而减少重复代码。例如: ```python import pytest @pytest.mark.parametrize("username, password", [ ("valid_user", "valid_password"), ("invalid_user", "wrong_password"), ]) def test_login(username, password): if username == "valid_user": assert login(username, password) == True else: assert login(username, password) == False ``` 此方法特别适合验证注册功能中的用户名/密码规则,能够高效地覆盖多种边界情况[^1]。 ### 使用 `pytest` 的缓存机制 `pytest` 还提供了内置的缓存机制,可以通过 `request.config.cache` 来存储和读取数据。这种方法通常用于跨测试会话的数据传递,例如保存上一次测试的结果以供后续比较: ```python def test_cache_data(request): cache = request.config.cache cache.set("example_key", "example_value") assert cache.get("example_key", None) == "example_value" ``` 这种机制适用于需要持久化存储某些测试结果的场景。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值