我有一个参数化的固定装置,我的测试使用参数调用它,但我喜欢用户/测试运行者提交自己的参数,并覆盖测试中编码的“默认”参数。 对于非参数化夹具,我通过 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 测试参数化覆盖)
我最终使用的解决方法是参数类
class PARAMCLASS
forced_param = default value
@classmethod
def force_value(cls, value):
cls.forced_value = value'''
fixture(通过间接测试本身进行参数化)然后查看是否有人(某些运行程序或 pytest 插件或诸如此类)将 PARAMCLASS.forced_value 设置为默认值以外的任何值,如果是,则相应地执行操作,忽略测试参数。
这是一个可怕的解决方案,因为 PARAMCLASS 实际上就像全局变量一样,而且它是 pytest 之外的一些影子测试参数管理。
一个鲜为人知的技巧是
pytest.mark.parameterize
将覆盖灯具。所以这是一种方法。
如果您想覆盖夹具参数,那么您也可以使用pytest.mark.parametrize
,但设置indirect=True
。
有关更多详细信息,请参阅此问题@pytest.mark.parametrize() 中的间接=True 与间接=False?