Разделение a conftest.py файл в несколько меньших conftest-подобных частей

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

  1. файл очень большой (~1000 строк, включая документацию)
  2. некоторые светильники зависят от других светильников, и у меня нет причин выставлять эти другие светильники как часть 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 файлы по всей иерархии тестов.