使用“参数化”和标记的组合来配置pytest装置

pytest-paramark的Python项目详细描述


PyPI versionPython versionsSee Build Status on Travis CI

使用参数化和标记的组合配置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'

安装

您可以通过pipPyPI安装“pytest paramark”:

$ pip install pytest-paramark

贡献

捐款是非常欢迎的。可以使用tox运行测试,请确保 在提交请求前,保险范围至少保持不变。在

许可证

根据MIT许可证的条款分发,“pytest paramark”是一种免费的开源软件

问题

如果您遇到任何问题,请file an issue并提供详细说明。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中两个ArrayList的内部联接   java如何制作按钮侦听器组方法?   Java位表示法中的字节、字符和int   java如何测试控制台输出代码?   JAXB在编组java时将xmlns添加到元素中   java 安卓 Web服务调用问题   java从按钮中选择多个正确答案   java如何获取sensu服务器事件数据   java如何在编写时添加分隔符。使用openCSV的csv文件   在fedora 23上通过jnlp运行jenkins slave的java问题   如何从java web应用程序创建http可见文件?   java如何在安卓中通过编程改变矢量绘图的颜色   java为什么我总是得到未初始化的变量x?   无法从java/Android Studio中的网站获取数据   ArrayList实现在Java中的最低级别是如何工作的?   java告诉SAX解析器忽略无效字符?   java无法使用JarSplice创建可运行的LWJGL jar   java解析一个包含许多字段的json对象   用于Command+T的java JavaFX密钥组合(新选项卡)   java StreamAPI收集器。groupingBy空集合而不是null