使用“参数化”和标记的组合来配置pytest装置
pytest-paramark的Python项目详细描述
使用参数化和标记的组合配置pytest设备
这是什么东西?在
问题
Pytest fixture名称在整个依赖关系图中必须是唯一的 (#3966)。在
这意味着当您想要参数化fixture时,每个参数名必须 与众不同:
importpytest@pytest.fixturedeffoo(foo_option):return{'option':foo_option}@pytest.fixturedefbar(bar_option):return{'option':bar_option}@pytest.mark.parametrize('foo_option, bar_option',[(42,24),])deftest_options(foo,bar):assertfoo['option']==42assertbar['option']==24
此外,如果要为选项提供默认值,它们也必须是固定装置:
^{pr2}$当选项和固定装置的数量增加时,这就不方便了 有很多这样的样板代码:
@pytest.fixture()defapp_elements():{}@pytest.fixture()defapp_sequence():returnNone@pytest.fixture()defapp_uuid(uuid=None):returnuuidoruuid4()@pytest.fixturedefapp_app_key():returnApplicationKey(bytes.fromhex('63964771734fbd76e3b40519d1d94a48'))@pytest.fixturedefapp_net_key():returnNetworkKey(bytes.fromhex('7dd7364cd842ad18c17c2b820c84c3d6'))@pytest.fixturedefapp_dev_key():returnDeviceKey(bytes.fromhex('9d6dd0e96eb25dc19a40ed9914f8f03f'))@pytest.fixturedefapp_addr():return0x5f2@pytest.fixturedefapp_iv_index():return0@pytest.fixture()defapplication(app_uuid,app_elements,app_dev_key,app_app_key,app_net_ket,app_addr,app_iv_index,app_sequence):...
解决方案
这个插件提供了一种更简洁的方法来将这些选项传递给选定的fixutre, 通过实现一个名为paramark的神奇fixture,它返回一个different值 对于依赖它的每个固定装置:
@pytest.fixturedeffoo(paramark):returnparamark@pytest.fixturedefbar(paramark):returnparamark@pytest.mark.foo(option=42)@pytest.mark.bar(option=24)deftest_options(foo,bar):assertfoo['option']==42assertbar['option']==24
在这个例子中可以看到,paramark返回一个带有键和 从具有与从属fixture同名的的自定义标记中提取的值。 注意这些标记仍然需要是registered。在
这也适用于parametrize,方法是扩展参数名语法以包含一个点:
@pytest.mark.parametrize('foo.option, bar.option',[(43,24),])@pytest.mark.bar(option=24)deftest_options(foo,bar):assertfoo['option']==42assertbar['option']==24
或者,如果要参数化整个字典:
@pytest.mark.parametrize('foo.*, bar.option',[({'option':42,'another: 17}, 24),])@pytest.mark.bar(option=24)deftest_options(foo,bar):assertfoo['option']==42assertfoo['another']==17assertbar['option']==24
因此,定义默认值不再需要为每个选项单独设置fixture:
@pytest.fixturedeffoo(paramark):default={'option':'default_foo_option'}return{**default,**paramark)@pytest.fixturedefbar(paramark):default={'option':'default_bar_option'}return{**default,**paramark)@pytest.mark.foo(option='custom_foo_option')deftest_options(foo,bar):assertfoo['option']=='custom_foo_option'assertbar['option']=='default_bar_option'
或者,如果你想更安全更漂亮:
importtyping@pytest.fixturedeffoo(paramark):classFoo(typing.NamedTuple):option:str='default_foo_option'returnFoo(**paramark)deftest_options(foo):assertfoo.option=='default_foo_option'
贡献
捐款是非常欢迎的。可以使用tox运行测试,请确保 在提交请求前,保险范围至少保持不变。在
许可证
根据MIT许可证的条款分发,“pytest paramark”是一种免费的开源软件
问题
如果您遇到任何问题,请file an issue并提供详细说明。在
- 项目
标签: