Плагин 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: как пропустить остальные тесты в классе, если один из них не прошел?
  • Используйте пользовательский набор тестов с pytest-django
  • py.test пропускает тестовый класс, если конструктор определен
  • Как правильно утверждать, что исключение возникает в pytest?
  • py.test: format failed assert И распечатать собственное сообщение
  • Как собрать мои тесты с py.test?
  • Pytest - привязка к функциональному уровню
  • Как мне показать, почему некоторые тесты, которые были пропущены при использовании py.test?
  • Python - лучший язык программирования в мире.