我正在使用 pytest 为可以在本地和云中运行的软件编写功能测试。我想创建 2 个模块,每个模块具有相同的模块/夹具名称,并让 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
(两个都):
import pytest
@pytest.fixture()
def my_fixture():
return True
/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
正在查看文件系统而不是__init__.py
的“假”命名空间,这不像from fixtures import hybrids
,它可以工作(但是你不能使用灯具,因为名称会涉及点符号)。
我意识到我可以使用 pytest_generate_test 来动态更改固定装置(也许?),但我真的很讨厌从该函数中手动管理每个固定装置...我希望动态导入(如果 x,导入这个,否则导入那个) )是标准的Python,不幸的是它与fixtures机制发生冲突:
import fixtures
def test(fixtures.hybrids.my_fixture): # of course it doesn't work :)
...
我还可以在 init 中逐个导入每个固定功能;更多的跑腿工作,但仍然是愚弄 pytest 并获得不带点的夹具名称的可行选择。
让我看看黑魔法。 :) 可以吗?