Ответ 1
Вы можете поместить свои вещи в другие модули и ссылаться на них с помощью переменной pytest_plugins
в conftest.py
:
pytest_plugins = ['module1', 'module2']
Это также будет работать, если ваш conftest.py
имеет hooks.
У меня есть большой файл conftest.py, который я хочу разбить на более мелкие части по двум причинам:
Мне не известно о каком-либо механизме, предоставляемом pytest, чтобы разрешать файлы-заглушки в нескольких местах внутри одной и той же папки, поэтому я нарисовал один из них ниже:
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
Это работает для моих нужд, но я задаюсь вопросом, есть ли лучший способ.
Вы можете поместить свои вещи в другие модули и ссылаться на них с помощью переменной pytest_plugins
в conftest.py
:
pytest_plugins = ['module1', 'module2']
Это также будет работать, если ваш conftest.py
имеет hooks.
Для этого вам не нужна волшебная магия. py.test автоматически добавляет путь к текущему тестовому файлу в sys.path
, а также все родительские пути до каталога, на который он был нацелен.
Из-за этого вам даже не нужно вводить этот общий код в conftest.py
. Вы можете просто вставлять простые модули или пакеты, а затем импортировать их (если вы хотите обмениваться документами, они должны быть в conftest.py
).
Также есть примечание об импорте из conftest.py
в документации:
Если у вас есть файлы conftest.py, которые не находятся в пакете python (т.е. один, содержащий
__init__.py
), тогда "import conftest
" может быть неоднозначным, поскольку могут быть другие файлыconftest.py
, такие как хорошо на вашихPYTHONPATH
илиsys.path
. Таким образом, хорошая практика для проекты, чтобы либо поставитьconftest.py
под область пакета, либо никогда импортировать что-либо из файлаconftest.py
.
Это работает для меня и кажется более простым/понятным:
Тесты верхнего уровня /conftest.py(пример повторной печати отладки запросов. Ответ):
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 *
Затем, в тестах ниже уровня в тестах /package 1/test _ *. py, вы просто импортируете через:
from tests.package1 import conftest
И тогда у вас есть объединенные конфигурации из одного доступного. Повторите этот шаблон для других подробных/модульных файлов conftest.py нижнего уровня по всей иерархии тестов.