Complemento de Pytest: anulación de pytest_runtest_call y amigos

Estoy desarrollando una suite de prueba usando pytest para un proyecto mío. Debido a la naturaleza del proyecto, necesito crear un complemento de Pytest que controle cómo se ejecutan las pruebas; no se ejecutan localmente, sino que se envían a un proceso diferente para ejecutarse. (Sé sobre xdist pero creo que no resuelve mi problema.)

He estado escribiendo mi propio complemento de Pytest anulando los diversos métodos pytest_runtest_* . Hasta ahora ha ido progresando bien. Aquí es donde he chocado contra un muro: quiero que mis implementaciones de pytest_runtest_setup , pytest_runtest_call y pytest_runtest_teardown sean realmente responsables de hacer la configuración, las llamadas y el desassembly. Lo van a hacer en un proceso diferente. Mi problema es: después de que Pytest llama a mi pytest_runtest_setup , también llama a todos los demás pytest_runtest_setup a la línea de complementos. Esto se debe a que la especificación de pytest_runtest_setup para pytest_runtest_setup tiene firstresult=False .

No quiero esto, porque no quiero que pytest_runtest_setup realmente se ejecute en el proceso actual. Quiero ser responsable de ejecutarlo por mi cuenta. Quiero anular cómo se está ejecutando, no agregarlo . Quiero que las otras implementaciones de pytest_runtest_setup debajo de la mía no se ejecuten.

¿Cómo puedo hacer esto?

Ganchos generics “runtest”

Todos los enganches relacionados con la ejecución reciben un objeto pytest.Item.

pytest_runtest_protocol (item, nextitem) [fuente]

 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 (item) [fuente]

 called before pytest_runtest_call(item). 

pytest_runtest_call (item) [fuente]

 called to execute the test item. 

pytest_runtest_teardown (item, nextitem) [fuente]

 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 (elemento, llamada) [fuente]

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

Para una comprensión más profunda, puede consultar la implementación predeterminada de estos enlaces en _pytest.runner y tal vez también en _pytest.pdb, que interactúa con _pytest.capture y su captura de entrada / salida para caer inmediatamente en la depuración interactiva cuando se produce un error de prueba.

El _pytest.terminal informado utiliza específicamente el enlace de informes para imprimir información sobre una ejecución de prueba.