我正在使用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.pyfoo.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不同,后者可以正常工作(但这样就不能使用fixture,因为名称将包含点符号)。
我意识到我可以使用pytest_generate_test来动态地改变固定装置(也许?)但是我真的很讨厌在这个函数中手动管理每个fixture……我希望动态导入(如果x,导入这个,否则导入那个)是标准的Python,不幸的是它与fixtures机制冲突:
import fixtures
def test(fixtures.hybrids.my_fixture): # of course it doesn't work :)
...我还可以在init中一个接一个地导入每个fixture函数;更多的跑腿工作,但仍然是愚弄pytest并获得不带点的fixture名称的可行选择。
让我看看黑魔法。:)能做到吗?
发布于 2015-04-22 02:49:33
发布于 2016-03-11 00:31:17
你可能在这里遗漏了一些东西:如果你想重用这些fixture,你需要明确地说出来:
from fixtures.hybrids.foo import my_fixture
@pytest.mark.usefixtures('my_fixture')
def test_hybrid(my_fixture):
assert my_fixture在这种情况下,您可以调整pytest,如下所示:
from local_hybrids import local_hybrids_fixture
from cloud_hybrids import cloud_hybrids_fixture
fixtures_to_test = {
"local":None,
"cloud":None
}
@pytest.mark.usefixtures("local_hybrids_fixture")
def test_add_local_fixture(local_hybrids_fixture):
fixtures_to_test["local"] = local_hybrids_fixture
@pytest.mark.usefixtures("cloud_hybrids_fixture")
def test_add_local_fixture(cloud_hybrids_fixture):
fixtures_to_test["cloud"] = cloud_hybrids_fixture
def test_on_fixtures():
if cloud_enabled:
fixture = fixtures_to_test["cloud"]
else:
fixture = fixtures_to_test["local"]
...如果周围有更好的解决方案,我也很感兴趣;)
发布于 2017-05-16 06:28:58
我真的不认为在python中有一种“好方法”可以做到这一点,但仍然可以通过少量的that来实现。您可以使用要使用的装置更新子文件夹的sys.path,并直接导入装置。在脏的情况下,它看起来像这样:
对于您的fixtures/__init__.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_bribds.py)中:
import fixtures
from foo import spam
spam()在其他情况下,您可以使用更复杂的操作将所有模块/包/函数等直接从云/本地文件夹假移动到fixture的__init__.py中。尽管如此,我认为-它不值得一试。
还有一件事-黑魔法不是最好的使用,我建议你使用一个带点的符号"import X from Y“-这是一个更稳定的解决方案。
https://stackoverflow.com/questions/29759117
复制相似问题