Pytest和动态夹具模块

2024-10-06 14:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pytest为一个可以在本地和云中运行的软件编写功能测试。我想创建两个模块,每个模块都有相同的模块/设备名称,并让pytest加载一个或另一个,这取决于我是在本地还是在云中运行测试:

/fixtures
/fixtures/__init__.py
/fixtures/local_hybrids
/fixtures/local_hybrids/__init__.py
/fixtures/local_hybrids/foo.py
/fixtures/cloud_hybrids
/fixtures/cloud_hybrids/__init__.py
/fixtures/cloud_hybrids/foo.py
/test_hybrids/test_hybrids.py

foo.py(两者):

^{pr2}$

/fixtures/__init__.py

if True:
    import local_hybrids as hybrids
else:
    import cloud_hybrids as hybrids

/test_hybrids/test_hybrids.py

from fixtures.hybrids.foo import my_fixture

def test_hybrid(my_fixture):
   assert my_fixture

最后一个代码块当然不起作用,因为import fixtures.hybrids查看的是文件系统,而不是{}的“假”名称空间,这与{}不同,后者是有效的(但是你不能使用fixture,因为名称会涉及到点符号)。在

我意识到我可以使用pytest生成测试来动态地改变fixture(也许?)但我真的不喜欢在这个函数中手动管理每个fixture。。。我希望动态导入(if x,import this,else import that)是标准Python,不幸的是它与fixtures机制冲突:

import fixtures
def test(fixtures.hybrids.my_fixture):  # of course it doesn't work :)
    ...

我还可以在init中一个接一个地导入每个fixture函数;更多的是leggrow,但是仍然是一个可行的选项,可以愚弄pytest并获得没有点的fixture名称。在

给我看看魔法。:)能做到吗?在


Tags: 模块pytestimport名称cloudiffoo
3条回答

您可能在这里遗漏了一些东西:如果您想重用这些装置,您需要明确说明:

from fixtures.hybrids.foo import my_fixture

@pytest.mark.usefixtures('my_fixture')
def test_hybrid(my_fixture):
    assert my_fixture

在这种情况下,可以对pytest进行如下调整:

^{pr2}$

如果周围有更好的解决方案,我也很感兴趣;)

我真的不认为在python中有一个“好方法”来做到这一点,但只要稍加修改,还是可以做到的。你可以更新系统路径对于包含要直接使用和导入装置的子文件夹。在肮脏的情况下是这样的:

对于您的固定装置/\uu init_u.py:

if True:
    import local as hybrids
else:
    import cloud as hybrids

def update_path(module):
    from sys import path
    from os.path import join, pardir, abspath
    mod_dir = abspath(join(module.__file__, pardir))
    path.insert(0, mod_dir)

update_path(hybrids)

在客户端代码中(test_hybrids/test_混合动力.py)公司名称:

^{pr2}$

在其他情况下,您可以使用更复杂的操作来执行将所有模块/包/函数等从cloud/local文件夹直接移动到fixture的\uyu init_uy.py中的假动作。不过,我认为-这不值得一试。在

还有一件事-黑魔法不是最好的选择,我建议你使用一个带有“importx from Y Y”的点符号-这是一个更稳定的解决方案。在

我认为在您的例子中,最好定义fixture-environment或其他好名字。在

这个固定装置可能只是操作系统环境['KEY']或者您可以添加自定义命令行参数,如here 然后像使用here 最后的用法是here。在

我想告诉你的是,你需要把思维转向依赖注入:一切都应该是固定的。在您的例子中(以及在我的插件中),运行时环境应该是一个fixture,它在依赖于环境的所有其他fixture中被检查。在

相关问题 更多 >