如何通过生成参数的函数实现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
相关产品推荐
相关产品推荐

