Я недавно обнаружил pytest
. Кажется, отлично. Тем не менее, я чувствую, что документация может быть лучше.
Я пытаюсь понять, для каких conftest.py
файлов они предназначены.
В моем (в настоящее время небольшом) наборе тестов у меня есть один conftest.py
файл в корне проекта. Я использую его для определения приборов, которые я добавляю в свои тесты.
У меня есть два вопроса:
- Это правильное использование
conftest.py
? У этого есть другое использование? - Могу ли я иметь более одного
conftest.py
файла? Когда бы я хотел это сделать? Примеры будут оценены.
В более общем смысле, как бы вы определили цель и правильное использование conftest.py
файлов в наборе тестов py.test?
It seems great. However, I feel the documentation could be better.
conftest.py
и, хотя есть много ссылок на то, чтобы делать это или делать это с помощью файла conftest, нигде в документации это не указывает на то, что когда pytest проверяет обнаружение, все найденные файлы conftest.py (в пределах структура каталога, над которой выполняется обнаружение тестов) будет запущена на этапе сбора тестов (до запуска любых тестов). Пришлось самому разобраться в этом с помощью экспериментов.Ответы:
Да, это так. Светильники являются потенциальным и широко используемым
conftest.py
. Определенные вами приборы будут доступны всем тестам в вашем наборе тестов. Однако определение приборов в корневом каталогеconftest.py
может оказаться бесполезным, и это приведет к замедлению тестирования, если такие приборы не используются всеми тестами.Да, это так.
Приспособления : Определите приспособления для статических данных, используемых тестами. Эти данные могут быть доступны для всех тестов в наборе, если не указано иное. Это могут быть как данные, так и помощники модулей, которые будут переданы во все тесты.
Загрузка внешних плагинов :
conftest.py
используется для импорта внешних плагинов или модулей. Определив следующую глобальную переменную, pytest загрузит модуль и сделает его доступным для его тестирования. Плагины - это, как правило, файлы, определенные в вашем проекте или других модулях, которые могут понадобиться в ваших тестах. Вы также можете загрузить набор предопределенных плагинов, как описано здесь .pytest_plugins = "someapp.someplugin"
Хуки : Вы можете указать хуки, такие как методы настройки и демонтажа, и многое другое для улучшения ваших тестов. Для набора доступных хуков, прочитайте здесь . Пример:
Проверка корневого пути : это немного скрытая функция. Определяя
conftest.py
в своем корневом пути, вы будетеpytest
распознавать модули приложения без указанияPYTHONPATH
. В фоновом режиме py.test изменяет ваш файлsys.path
, включая все подмодули, найденные в корневом пути.Да, вы можете, и это настоятельно рекомендуется, если ваша тестовая структура несколько сложна.
conftest.py
файлы имеют область каталогов. Поэтому создание целевых приспособлений и помощников является хорошей практикой.Могут подойти несколько случаев:
Создание набора инструментов или хуков для определенной группы тестов.
корень / мода / conftest.py
Загрузка набора светильников для некоторых тестов, но не для других.
корень / мода / conftest.py
корень / mod 2 / conftest.py
корень / mod 2 / test.py
Напечатает «некоторые другие вещи».
Перекрывающие крючки наследуются от корня
conftest.py
.корень / мода / conftest.py
корень / conftest.py
При запуске любого теста внутри
root/mod
, печатается только «Я мод».Вы можете прочитать больше о
conftest.py
здесь .РЕДАКТИРОВАТЬ:
Вы можете использовать,
conftest.py
чтобы определить ваши помощники. Тем не менее, вы должны следовать обычной практике. Помощники могут быть использованы в качестве светильников, по крайней мере, вpytest
. Например, в моих тестах у меня есть вспомогательный помощник redis, который я добавляю в свои тесты таким образом.корень / помощник / Redis / redis.py
корень / тесты / материал / conftest.py
корень / тесты / материал / test.py
Это будет тестовый модуль, который вы можете свободно импортировать в свои тесты. Обратите внимание, что вы могли бы назвать,
redis.py
какconftest.py
будто ваш модульredis
содержит больше тестов. Однако такая практика не рекомендуется из-за двусмысленности.Если вы хотите использовать
conftest.py
, вы можете просто поместить этот помощник в свой кореньconftest.py
и внедрить его при необходимости.корень / тесты / conftest.py
корень / тесты / материал / test.py
Еще одна вещь, которую вы можете сделать, это написать устанавливаемый плагин. В этом случае ваш помощник может быть написан где угодно, но ему нужно определить точку входа, которая будет установлена в вашей и других потенциальных тестовых средах. Смотрите это .
Если вы не хотите использовать фиксаторы, вы, конечно, можете определить простого помощника и просто использовать обычный старый импорт везде, где это необходимо.
корень / тесты / помощник / redis.py
корень / тесты / материал / test.py
Однако здесь могут возникнуть проблемы с путем, поскольку модуль не находится в дочерней папке теста. Вы должны быть в состоянии преодолеть это (не проверено), добавив
__init__.py
к вашему помощникукорень / тесты / помощник / __ init__.py
Или просто добавив вспомогательный модуль к вашему
PYTHONPATH
.источник
test_aaaaa.py
на самом деле пытается запустить до завершения установки прибораconftest.py
. Есть мысли о том, почему это может происходить?В широком смысле conftest.py - локальный плагин для каждого каталога. Здесь вы определяете специфичные для каталога хуки и приспособления. В моем случае есть корневой каталог, содержащий каталоги специфических тестов проекта. Некоторая распространенная магия находится в «root» conftest.py. Конкретный проект - в своих. Не вижу ничего плохого в хранении приборов в conftest.py, если они не используются широко (в этом случае я предпочитаю определять их непосредственно в тестовых файлах)
источник
Да , прибор обычно используется для подготовки данных к нескольким тестам.
Да , прибор - это функция, которая запускается
pytest
до, а иногда и после, реальных тестовых функций. Код в приборе может делать все, что вы хотите. Например, прибор может использоваться для получения набора данных для работы тестов, или прибор также может использоваться для приведения системы в известное состояние перед запуском теста.Во-первых, возможно поместить приборы в отдельные тестовые файлы. Однако для совместного использования приборов между несколькими тестовыми файлами вам нужно использовать
conftest.py
файл, расположенный где-то в центре для всех тестов. Светильники могут быть разделены любым тестом. Они могут быть помещены в отдельные тестовые файлы, если вы хотите, чтобы прибор использовался только тестами в этом файле.Во-вторых, да , у вас могут быть другие
conftest.py
файлы в подкаталогах каталога верхних тестов. Если вы это сделаете, приборы, определенные в этихconftest.py
файлах более низкого уровня, будут доступны для тестов в этом каталоге и подкаталогах.Наконец, размещение осветителей в
conftest.py
файле в тестовом корне сделает их доступными во всех тестовых файлах.источник