【发布时间】:2015-06-27 20:11:45
【问题描述】:
我正在使用 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,导入这个, else import that) 是标准的 Python,不幸的是它与固定装置机制发生冲突:
import fixtures
def test(fixtures.hybrids.my_fixture): # of course it doesn't work :)
...
我也可以在init中一个接一个地导入每个fixture函数;更多的跑腿工作,但仍然是欺骗 pytest 并获得不带点的夹具名称的可行选择。
告诉我黑魔法。 :) 可以吗?
【问题讨论】: