Плагин Pytest: переопределение pytest_runtest_call и друзей

Я разрабатываю тестовый набор, используя pytest для моего проекта. Из-за характера проекта мне нужно создать плагин Pytest, который контролирует, как выполняются тесты; они не запускаются локально, а отправляются в другой процесс для запуска. (Я знаю о xdist но я думаю, что это не решает мою проблему.)

Я пишу свой собственный плагин Pytest, переопределяя различные методы pytest_runtest_* . Пока все идет хорошо. Вот где я pytest_runtest_setup на стену: мне нужны мои реализации pytest_runtest_setup , pytest_runtest_call и pytest_runtest_teardown чтобы на самом деле нести ответственность за выполнение настройки, вызова и разрыва. Они собираются сделать это в другом процессе. Моя проблема: после того, как Pytest называет мой pytest_runtest_setup , он также вызывает все остальные pytest_runtest_setup по строке плагинов. Это связано с тем, что спецификация hook для pytest_runtest_setup имеет firstresult=False .

Я не хочу этого, потому что я не хочу, чтобы pytest_runtest_setup фактически выполнялся в текущем процессе. Я хочу быть ответственным за запуск этого самостоятельно. Я хочу переопределить, как он выполняется, а не добавлять к нему. Я хочу, чтобы другие реализации pytest_runtest_setup ниже моих собственных, чтобы они не запускались.

Как я могу это сделать?

One Solution collect form web for “Плагин Pytest: переопределение pytest_runtest_call и друзей”

Родовые «runtest» крючки

Все крючки, связанные с runtest, получают объект pytest.Item.

pytest_runtest_protocol (item, nextitem) [источник]

 implements the runtest_setup/call/teardown protocol for the given test item, including capturing exceptions and calling reporting hooks. Parameters: item – test item for which the runtest protocol is performed. nextitem – the scheduled-to-be-next test item (or None if this is the end my friend). This argument is passed on to pytest_runtest_teardown(). Return boolean: True if no further hook implementations should be invoked. 

pytest_runtest_setup (пункт) [источник]

 called before pytest_runtest_call(item). 

pytest_runtest_call (пункт) [источник]

 called to execute the test item. 

pytest_runtest_teardown (item, nextitem) [источник]

 called after pytest_runtest_call. Parameters: nextitem – the scheduled-to-be-next test item (None if no further test item is scheduled). This argument can be used to perform exact teardowns, ie calling just enough finalizers so that nextitem only needs to call setup-functions. 

pytest_runtest_makereport (item, call) [источник]

 return a _pytest.runner.TestReport object for the given pytest.Item and _pytest.runner.CallInfo. 

Для более глубокого понимания вы можете взглянуть на реализацию этих крючков по умолчанию в _pytest.runner и, возможно, также в _pytest.pdb, которая взаимодействует с _pytest.capture и его захватом ввода / вывода, чтобы немедленно перейти к интерактивной отладке, когда происходит сбой тестирования.

Сообщается, что _pytest.terminal использует крючок отчетности для печати информации о пробном прогоне.

  • pytest: как передать параметр класса в setup_class
  • проверьте код ошибки или сообщение от SystemExit в pytest
  • ограничить максимальное время работы для модульного теста
  • py.test: ImportError: нет модуля с именем mysql
  • Как насмехаться / установить системную дату в pytest?
  • В pytest, как я могу выяснить, не прошел тест? (из «запроса»)
  • Можно ли запускать срывное приспособление только после того, как все параметры запущены?
  • Разделение файла conftest.py на несколько меньших по размеру частей
  • Проверка допустимых типов перечислений из protobufs
  • Py.test Нет модуля с именем *
  • Выполнить код до и после каждого теста в py.test?
  • Python - лучший язык программирования в мире.