Разделение файла conftest.py на несколько меньших по размеру частей

У меня есть большой файл conftest.py, который я хочу разбить на более мелкие части по двум причинам:

  • Файл очень большой (~ 1000 строк, включая документацию)
  • Некоторые из светильников зависят от других светильников, и у меня нет причин раскрывать эти другие светильники как часть "API-интерфейса", когда пользователи ищут соответствующие светильники.

Мне не известно о каком-либо механизме, предоставляемом 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

Это работает для моих нужд, но я задаюсь вопросом, есть ли лучший способ.

Ответ 1

Вы можете поместить свои вещи в другие модули и ссылаться на них с помощью переменной pytest_plugins в conftest.py:

pytest_plugins = ['module1', 'module2']

Это также будет работать, если ваш conftest.py имеет hooks.

Ответ 2

Для этого вам не нужна волшебная магия. 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.

Ответ 3

Это работает для меня и кажется более простым/понятным:

Тесты верхнего уровня /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 нижнего уровня по всей иерархии тестов.