В пы.тест, в чем польза conftest.py файлы?
Я недавно обнаружил pytest. Кажется, это здорово. Тем не менее, я чувствую, что документация может быть лучше.
Я пытаюсь понять, что conftest.py файлы предназначены для использования на.
в моем (в настоящее время небольшом) тестовом наборе у меня есть один conftest.py файл в корне проекта. Я использую его для определения приспособлений, которые я вводил в свои тесты.
у меня есть два вопроса:
- это правильное использование
conftest.py? Есть ли у него другие использует? - можно мне больше одного ? Когда я захочу это сделать? Примеры будут оценены.
в целом, как бы вы определили цель и правильное использование conftest.py файл(ы) в py.тестовый набор тестов?
3 ответов:
это правильное использование conftest.py?
да, светильники являются потенциальным и общим использованием
conftest.py. Этот светильники, которые вы определите, будут совместно использоваться всеми тестами в вашем наборе тестов. Однако определение светильников в корнеconftest.pyможет быть бесполезно, и это замедлит тестирование, если такие приспособления не используются всеми тестами.есть ли у него другие применения?
да делает.
светильники: определение приспособлений для статических данных, используемых тестами. Эти данные могут быть доступны для всех тестов в комплекте, если не указано. Это могут быть данные, а также помощники модулей, которые будут переданы всем тестам.
загрузка внешнего плагина: conftest.py используется для импорта внешних плагинов или модулей. Определив следующую глобальную переменную, pytest загрузит модуль и сделает его для ее тестирования. Плагины обычно представляют собой файлы, определенные в вашем проекте или других модулях, которые могут потребоваться в ваших тестах. Вы также можете загрузить набор предопределенных плагинов с здесь.
pytest_plugins = "someapp.someplugin"крючки: вы можете указать крючки, такие как методы настройки и демонтажа и многое другое, чтобы улучшить свои тесты. Для набора доступных крючков, прочитайте здесь. Пример:
def pytest_runtest_setup(item): """ called before ``pytest_runtest_call(item). """ #do some stuff`проверить корневой путь: это немного скрытая функция. Определением
conftest.pyв корневом пути, вы будете иметьpytestраспознавание модулей приложения без указанияPYTHONPATH. На заднем плане, Пи.тест изменяет вашsys.pathпутем включения всех подмодулей, которые находятся из корневого пути.могу ли я иметь более одного conftest.py файл?
да можно и настоятельно рекомендуется, если ваша структура теста является каким-то сложным.
conftest.pyфайлы имеют область каталогов, поэтому создание целевых светильников и помощников является хорошей практикой.когда бы я хотел это сделать? Примеры будут оценены.
несколько случаев может поместиться:
создание набора инструментов или крючки для определенной группы тесты
root/mod/conftest.py
def pytest_runtest_setup(item): print("I am mod") #do some stuff test root/mod2/test.py will NOT produce "I am mod"загрузить набор светильники для некоторых тестов, но не для других.
root/mod/conftest.py
@pytest.fixture() def fixture(): return "some stuff"root/mod2/conftest.py
@pytest.fixture() def fixture(): return "some other stuff"root/mod2/test.py
def test(fixture): print(fixture)напечатает "некоторые другие вещи"
переопределить крючки наследуются от корня
conftest.pyroot/mod/conftest.py
def pytest_runtest_setup(item): print("I am mod") #do some stuffroot/conftest.py
def pytest_runtest_setup(item): print("I am root") #do some stuffзапустив любой тест внутри
root/mod, только "я мод" печатается.вы можете прочитать больше о
conftest.pyздесь.EDIT:
что делать, если мне нужны простые старые вспомогательные функции для вызова из номера тестов в разных модулях - будут ли они доступно для меня, если я поставлю они в а conftest.py или я должен просто положить их в a helpers.py модуль и импортировать и использовать его в моих тестовых модулях?
можно использовать
conftest.pyчтобы определить ваших помощников, однако вы должны следовать общей практике. помощники могут быть использованы в качестве светильников, по крайней мере, вpy.test. Например, в моих тестах у меня есть издевательский помощник redis, который я ввожу в свои тесты это путь.root/helper/redis/redis.py
@pytest.fixture def mock_redis(): return MockRedis()root/tests/stuff/conftest.py
pytest_plugin="helper.redis.redis"root/tests/stuff/test.py
def test(mock_redis): print(mock_redis.get('stuff'))это будет тестовый модуль, который вы можете свободно импортировать в свои тесты. Примечание что вы могли бы потенциально имя
redis.pyкакconftest.pyесли ваш модульredisсодержит дополнительные тесты. Однако эта практика не поощряется из-за двусмысленность.если вы хотите использовать
conftest.pyпросто вы можете поместить этого помощника в свой корень conftest.py и впрысните его когда нужно.root/tests/conftest.py
@pytest.fixture def mock_redis(): return MockRedis()root/tests/stuff/test.py
def test(mock_redis): print(mock_redis.get(stuff))еще одна вещь, которую вы можете сделать, это написать устанавливаемый плагин. В этом случае ваш помощник может быть записан в любом месте, но он должен определить точку входа, которая будет установлена в вашем и другом потенциале тестовые платформы. Смотрите этой.
если вы не хотите использовать светильники, вы можете, конечно, определить простой помощник и просто использовать простой старый импорт везде, где это необходимо.
root/tests/helper/redis.py
class MockRedis(): # stuffroot/tests/stuff/test.py
from helper.redis import MockRedis def test(): print(MockRedis().get(stuff))однако здесь у вас могут возникнуть проблемы с путем, так как модуль не находится в дочерней папке теста. Вы должны быть в состоянии преодолейте это (не проверено), добавив init к вашему помощнику
root/tests/helper/__init__.py
from .redis import MockRedisили просто добавить вспомогательный модуль к вашему
PYTHONPATH.
в широком смысле conftest.py это локальный плагин для каждого каталога. Здесь вы определяете крючки и приспособления для конкретных каталогов. В моем случае у A есть корневой каталог, содержащий каталоги тестов для конкретных проектов. Некоторые общие магии размещены в "корень" conftest.py проект специфический-в своих собственных. Не вижу ничего плохого в хранении светильников внутри conftest.py если они не используются широко (в этом случае я предпочитаю определять их в тестовых файлах напрямую)
Я использую
conftest.pyфайл для определения светильников, которые я ввожу в свои тесты, это правильное использованиеconftest.py?да, приспособление обычно использовано для того чтобы получить данные готовыми для множественных тестов.
есть ли у него другие применения?
да, приспособление-это функция, которая выполняется
pytestраньше, а иногда после, фактические функции теста. Код в приспособлении может сделать все, что угодно вы хотите, чтобы он. Например, приспособление может использоваться для получения набора данных для работы с тестами, или приспособление также может использоваться для приведения системы в известное состояние перед запуском теста.можно мне больше одного ? Когда я захочу это сделать?
во-первых, можно поместить светильники в отдельные тестовые файлы. Однако для совместного использования светильников между несколькими тестовыми файлами необходимо использовать где-то в центре города все тесты. Светильники могут быть разделены любым тестом. Они могут быть помещены в отдельные тестовые файлы, если вы хотите, чтобы прибор использовался только тестами в этом файле.
второе, да, вы можете иметь другие
conftest.pyфайлы в подкаталогах верхнего каталога тестов. Если вы это сделаете, светильники, определенные в этих нижних уровняхconftest.pyфайлы будут доступны для тестов в этом каталоге и его подкаталогах.наконец, положить светильники в
conftest.pyфайл в корне теста сделает их доступными во всех тестовых файлах.
Comments