【发布时间】:2020-02-24 12:04:54
【问题描述】:
我正在尝试使用 pytest 固定装置动态范围。 文档声明范围将在夹具定义期间确定;这是否意味着一旦在 pytest run 中动态设置范围,该范围将适用于使用该夹具的所有测试? 是否有可能在测试运行期间影响范围(即使用标记)? 如果没有,我该如何更改配置(不使用命令行 arg)来更改范围?
我尝试添加一个标记并将其值用作 pytest_generate_tests 中的范围,但是夹具定义在 pytest_generate_tests 之前运行。
def pytest_generate_tests(metafunc):
fixture_scope = metafunc.definition.get_closest_marker('scope').args
if fixture_scope is not None:
metafunc.config.addinivalue_line('markers', f'scope:{fixture_scope[0]}')
def determine_scope(fixture_name, config):
scope = [i for i in config.getini('markers') if 'scope' in i][0]
if scope:
return scope.split(':')[-1]
return "function"
@pytest.fixture(scope=determine_scope)
def some_fixture():
【问题讨论】:
-
也许你应该在你的问题中包含你为什么要这样做,以便有人可以建议一种替代方法。
-
我想避免重复代码;我有一些代码在某些测试的功能级别和其他测试的模块级别需要。我想为 2 个用例重复使用相同的夹具
-
只是想:你可以把这段代码放在一个函数
foo中重用,然后定义两个fixture:一个具有函数范围,另一个具有模块范围,实际上只是调用这个函数foo和然后根据需要用固定装置装饰测试。 -
这是我作为解决方法所做的;但是,创建 2 个仅具有不同范围的精确夹具,特别是如果您需要使用多个夹具来创建,这并不是真正可读的。
标签: pytest