Это правильное использование 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
. В фоновом режиме py.test изменяет ваш файл sys.path
, включая все подмодули, найденные в корневом пути.
Могу ли я иметь более одного файла conftest.py?
Да, вы можете, и это настоятельно рекомендуется, если ваша тестовая структура несколько сложна. conftest.py
файлы имеют область каталогов. Поэтому создание целевых приспособлений и помощников является хорошей практикой.
Когда бы я хотел это сделать? Примеры будут оценены.
Могут подойти несколько случаев:
Создание набора инструментов или хуков для определенной группы тестов.
корень / мода / 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"
Загрузка набора светильников для некоторых тестов, но не для других.
корень / мода / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
корень / mod 2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
корень / mod 2 / test.py
def test(fixture):
print(fixture)
Напечатает «некоторые другие вещи».
Перекрывающие крючки наследуются от корня conftest.py
.
корень / мода / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
корень / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
При запуске любого теста внутри root/mod
, печатается только «Я мод».
Вы можете прочитать больше о conftest.py
здесь .
РЕДАКТИРОВАТЬ:
Что если мне понадобятся простые старые вспомогательные функции для вызова из нескольких тестов в разных модулях - будут ли они мне доступны, если я положу их в файл conftest.py? Или я должен просто поместить их в модуль helpers.py и импортировать и использовать в своих тестовых модулях?
Вы можете использовать, conftest.py
чтобы определить ваши помощники. Тем не менее, вы должны следовать обычной практике. Помощники могут быть использованы в качестве светильников, по крайней мере, в pytest
. Например, в моих тестах у меня есть вспомогательный помощник redis, который я добавляю в свои тесты таким образом.
корень / помощник / Redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
корень / тесты / материал / conftest.py
pytest_plugin="helper.redis.redis"
корень / тесты / материал / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Это будет тестовый модуль, который вы можете свободно импортировать в свои тесты. Обратите внимание, что вы могли бы назвать, redis.py
как conftest.py
будто ваш модуль redis
содержит больше тестов. Однако такая практика не рекомендуется из-за двусмысленности.
Если вы хотите использовать conftest.py
, вы можете просто поместить этот помощник в свой корень conftest.py
и внедрить его при необходимости.
корень / тесты / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
корень / тесты / материал / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Еще одна вещь, которую вы можете сделать, это написать устанавливаемый плагин. В этом случае ваш помощник может быть написан где угодно, но ему нужно определить точку входа, которая будет установлена в вашей и других потенциальных тестовых средах. Смотрите это .
Если вы не хотите использовать фиксаторы, вы, конечно, можете определить простого помощника и просто использовать обычный старый импорт везде, где это необходимо.
корень / тесты / помощник / redis.py
class MockRedis():
# stuff
корень / тесты / материал / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Однако здесь могут возникнуть проблемы с путем, поскольку модуль не находится в дочерней папке теста. Вы должны быть в состоянии преодолеть это (не проверено), добавив __init__.py
к вашему помощнику
корень / тесты / помощник / __ init__.py
from .redis import MockRedis
Или просто добавив вспомогательный модуль к вашему PYTHONPATH
.
It seems great. However, I feel the documentation could be better.