В пы.тест, в чем польза conftest.py файлы?



Я недавно обнаружил pytest. Кажется, это здорово. Тем не менее, я чувствую, что документация может быть лучше.



Я пытаюсь понять, что conftest.py файлы предназначены для использования на.



в моем (в настоящее время небольшом) тестовом наборе у меня есть один conftest.py файл в корне проекта. Я использую его для определения приспособлений, которые я вводил в свои тесты.



у меня есть два вопроса:




  1. это правильное использование conftest.py? Есть ли у него другие использует?

  2. можно мне больше одного ? Когда я захочу это сделать? Примеры будут оценены.


в целом, как бы вы определили цель и правильное использование conftest.py файл(ы) в py.тестовый набор тестов?

771   3  

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.py

root/mod/conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff

root/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():
    # stuff

root/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

    Ничего не найдено.