我正在使用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
(两者):
/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
查看的是文件系统,而不是{
我意识到我可以使用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名称。在
给我看看魔法。:)能做到吗?在
您可能在这里遗漏了一些东西:如果您想重用这些装置,您需要明确说明:
在这种情况下,可以对pytest进行如下调整:
^{pr2}$如果周围有更好的解决方案,我也很感兴趣;)
我真的不认为在python中有一个“好方法”来做到这一点,但只要稍加修改,还是可以做到的。你可以更新系统路径对于包含要直接使用和导入装置的子文件夹。在肮脏的情况下是这样的:
对于您的固定装置/\uu init_u.py:
在客户端代码中(test_hybrids/test_混合动力.py)公司名称:
^{pr2}$在其他情况下,您可以使用更复杂的操作来执行将所有模块/包/函数等从cloud/local文件夹直接移动到fixture的\uyu init_uy.py中的假动作。不过,我认为-这不值得一试。在
还有一件事-黑魔法不是最好的选择,我建议你使用一个带有“importx from Y Y”的点符号-这是一个更稳定的解决方案。在
我认为在您的例子中,最好定义fixture-
environment
或其他好名字。在这个固定装置可能只是操作系统环境['KEY']或者您可以添加自定义命令行参数,如here 然后像使用here 最后的用法是here。在
我想告诉你的是,你需要把思维转向依赖注入:一切都应该是固定的。在您的例子中(以及在我的插件中),运行时环境应该是一个fixture,它在依赖于环境的所有其他fixture中被检查。在
相关问题 更多 >
编程相关推荐