Разделение a conftest.py файл в несколько меньших conftest-подобных частей
У меня большой conftest.py файл, который я хочу разделить на более мелкие части, по двум причинам:
- файл очень большой (~1000 строк, включая документацию)
- некоторые светильники зависят от других светильников, и у меня нет причин выставлять эти другие светильники как часть conftest "API", когда пользователи ищут соответствующие светильники
Я не знаю о каком-либо механизме, предоставляемом 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
это работает для моих нужд, но мне интересно, есть ли лучший способ.
3 ответов
вы можете поместить свои вещи в другие модули и ссылаться на них с помощью pytest_plugins
переменной в conftest.py
:
pytest_plugins = ['module1', 'module2']
Это также будет работать, если ваш conftest.py
и крючки на них.
для этого не нужно никакой причудливой магии. пай.test автоматически добавляет путь к текущему тестовому файлу в sys.path
, а также все родительские пути до каталога, на который он был нацелен.
из-за этого вам даже не нужно помещать этот общий код в conftest.py
. Вы можете просто поместить в простые модули или пакеты, а затем импортировать их (если вы хотите поделиться светильниками, они должны быть в conftest.py
).
кроме того, есть эта заметка об импорте из conftest.py
на документация:
если у вас есть conftest.py файлы, которые не находятся в пакете python каталог (т. е. содержащий
__init__.py
), то "import conftest
" может быть неоднозначным, потому что могут быть другиеconftest.py
файлы наPYTHONPATH
илиsys.path
. Таким образом, это хорошая практика для проекты либо поставитьconftest.py
в области пакета или никогда импортируйте что-нибудь из .
это работает для меня и, кажется, легче/понятнее:
верхний уровень tests/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 *
затем в тестах нижнего уровня в tests / package1 / test_*.py, вы просто импортируете через:
from tests.package1 import conftest
и затем у вас есть объединенные configtests из одного доступного conftest. Повторите эту картину для вашего другого более низкого уровня детального / модульного conftest.py файлы по всей иерархии тестов.