我有一个大的conftest.py文件,我希望将其分成更小的部分,原因有两个:
我不知道pytest提供了解决同一文件夹中多个位置的conftest文件的任何机制,所以我设计了一个,如下:
import sys
import os
sys.path.append(os.path.dirname(__file__))
from _conftest_private_part_1 import *
from _conftest_private_part_2 import *
from _conftest_private_part_3 import *
@pytest.fixture
def a_fixture_that_is_part_of_the_public_conftest_api():
pass
这适合我的需要,但我确实想知道是否有更好的方法。
答案 0 :(得分:20)
您可以将您的资料放入其他模块,并使用pytest_plugins
中的conftest.py
变量引用它们:
pytest_plugins = ['module1', 'module2']
如果conftest.py
上有hooks,这也会有用。
答案 1 :(得分:3)
你不应该为此花费任何神奇的魔力。 py.test自动将当前测试文件的路径添加到sys.path
,以及直到目标目录的所有父路径。
因此,您甚至不需要将该共享代码放入conftest.py
。你可以放入普通的模块或包然后导入它(如果你想共享灯具,那些必须在conftest.py
)。
此外,还有关于从documentation中的conftest.py
导入
如果你有conftest.py文件,它们不在python包中 目录(即包含
__init__.py
的目录)然后“import conftest
” 可能含糊不清,因为可能有其他conftest.py
个文件 在您的PYTHONPATH
或sys.path
上。因此,这是一个很好的做法 将conftest.py
放在包范围内或从不放置的项目 从conftest.py
文件中导入任何内容。
答案 2 :(得分:0)
这对我有用,看起来更容易/更清晰:
顶级测试/ conftest.py(requests.Response的可重复打印调试示例):
import pytest
import requests
from requests_toolbelt.utils import dump
@pytest.fixture(scope="session")
def print_response(response: requests.Response):
data = dump.dump_all(response)
print("========================")
print(data.decode('utf-8'))
print("========================")
print("response.url = {}".format(response.url))
print("response.request = {}".format(response.request))
print("response.status_code = {}".format(response.status_code))
print("response.headers['content-type'] = {}".format(response.headers['content-type']))
print("response.encoding = {}".format(response.encoding))
try:
print("response.json = {}".format(response.json()))
except Exception:
print("response.text = {}".format(response.text))
print("response.end")
从较低级别的conftest导入更高级别的conftest代码 - 例如,tests / package1 / conftest.py:
from tests.conftest import *
然后,在tests / package1 / test _ *。py中的低级测试中,您只需通过以下方式导入:
from tests.package1 import conftest
然后你可以从一个conftest中获得合并的配置测试。在整个测试层次结构中为您的其他较低级别详细/模块化conftest.py文件重复此模式。
答案 3 :(得分:0)
或者,您可以尝试:
在my_fixtures.py
中:
@pytest.fixture
def some_fixture():
yield
在conftest.py
中:
import my_fixtures
# Adding the fixture to attributes of `conftest` will register it
some_fixture = my_fixtures.some_fixture
似乎pytest
通过遍历conftest
属性并检查attr._pytestfixturefunction
添加的某些@pytest.fixture
来检测固定装置。
只要conftest.py
包含fixture属性,定义的fixture并不重要: