You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过生成参数的函数实现Pytest参数化,使测试用例逐个执行?

如何用生成器函数实现Pytest多参数测试执行

当然可以实现和test_2完全相同的执行效果!问题出在你当前的provider()生成器只返回了一个测试参数(把[1,2]作为单个列表传入),所以pytest只会执行一次测试。而test_2的列表参数是把每个元素作为独立参数,因此触发两次测试。

只需要修改生成器的逻辑,让它逐个yield每个独立的参数值(可以用pytest.param包裹,也可以直接yield原始值),就能达到和列表参数化一样的效果。

修改后的代码示例

import pytest

def provider():
    # 逐个返回每个参数,和列表[1,2]的参数化逻辑一致
    yield pytest.param(1)
    yield pytest.param(2)
    # 也可以直接写 yield 1、yield 2,效果相同;pytest.param支持添加标记、自定义测试ID等额外配置

class Test:
    @pytest.mark.parametrize("a", provider())
    def test(self, a, logger):
        logger.info("a: {}".format(a))

    @pytest.mark.parametrize("a", [1, 2])
    def test_2(self, a, logger):
        logger.info("a: {}".format(a))

执行效果验证

修改后运行测试,test的执行日志会和test_2完全一致:

2019-12-09 14:39:36 test[1] start a: 1
2019-12-09 14:39:36 test[1] passed
2019-12-09 14:39:36 test[2] start a: 2
2019-12-09 14:39:36 test[2] passed
2019-12-09 14:39:36 test_2[1] start a: 1
2019-12-09 14:39:36 test_2[1] passed
2019-12-09 14:39:36 test_2[2] start a: 2
2019-12-09 14:39:36 test_2[2] passed

扩展:动态生成参数的场景

如果你的provider需要从外部数据源(比如配置文件、数据库)动态获取参数,只需要在生成器里遍历数据源,逐个yield参数即可。比如:

def provider():
    # 模拟从外部获取参数列表
    dynamic_params = [1, 2, 3, 4]
    for param in dynamic_params:
        # 可以自定义测试ID,让日志更清晰
        yield pytest.param(param, id=f"test_case_{param}")

这样pytest会为每个yield的参数创建独立的测试用例,行为和直接传入列表完全一致。

内容的提问来源于stack exchange,提问作者Diana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:53:19