pytest 用户覆盖参数化夹具

问题描述 投票:0回答:2

我有一个参数化的固定装置,我的测试使用参数调用它,但我喜欢用户/测试运行者提交自己的参数,并覆盖测试中编码的“默认”参数。 对于非参数化夹具,我通过 pytest hook 覆盖夹具返回值

def pytest_generate_tests(self, metafunc):
    for fixture_name, parameters in self.fixture_parameters.items():
        if fixture_name in metafunc.fixturenames:
            metafunc.parametrize(fixture_name, parameters)

但是对于参数化装置,我收到“ValueError:重复< fixture name >”。 如何覆盖参数化夹具?

(有一个类似的问题,但它反过来提出了问题 - 推动测试(代码)参数的优先级,而不是通过 pytest hook pytest_generate_tests() 提交的值pytest 测试参数化覆盖

python pytest
2个回答
0
投票

我最终使用的解决方法是参数类

    class PARAMCLASS
         forced_param = default value

        @classmethod 
        def force_value(cls, value):
            cls.forced_value = value'''

fixture(通过间接测试本身进行参数化)然后查看是否有人(某些运行程序或 pytest 插件或诸如此类)将 PARAMCLASS.forced_value 设置为默认值以外的任何值,如果是,则相应地执行操作,忽略测试参数。

这是一个可怕的解决方案,因为 PARAMCLASS 实际上就像全局变量一样,而且它是 pytest 之外的一些影子测试参数管理。


0
投票

一个鲜为人知的技巧是

pytest.mark.parameterize
将覆盖灯具。所以这是一种方法。 如果您想覆盖夹具参数,那么您也可以使用
pytest.mark.parametrize
,但设置
indirect=True
。 有关更多详细信息,请参阅此问题@pytest.mark.parametrize() 中的间接=True 与间接=False?

© www.soinside.com 2019 - 2024. All rights reserved.