Probar si el código se ejecuta desde dentro de una sesión py.test

Me gustaría conectarme a una base de datos diferente si mi código se está ejecutando bajo py.test. ¿Hay una función a la que llamar o una variable de entorno que pueda probar que me dirá si estoy ejecutando en una sesión py.test? ¿Cuál es la mejor manera de manejar esto?

Una solución vino de RTFM , aunque no en un lugar obvio. El manual también tenía un error en el código, corregido a continuación.

Detectar si se ejecuta dentro de una ejecución pytest

Por lo general, es una mala idea hacer que el código de la aplicación se comporte de manera diferente si se llama desde una prueba. Pero si absolutamente debe averiguar si el código de su aplicación se está ejecutando desde una prueba, puede hacer algo como esto:

# content of conftest.py def pytest_configure(config): import sys sys._called_from_test = True def pytest_unconfigure(config): import sys # This was missing from the manual del sys._called_from_test 

y luego verifique el indicador sys._called_from_test:

 if hasattr(sys, '_called_from_test'): # called from within a test run else: # called "normally" 

en consecuencia en su aplicación. También es una buena idea usar su propio módulo de aplicación en lugar de sys para manejar el indicador.

Una solución más sencilla a la que llegué:

 import sys if "pytest" in sys.modules: ... 

Pytest Runner siempre cargará el módulo pytest , haciéndolo disponible en sys.modules .

Por supuesto, esta solución solo funciona si el código que estás tratando de probar no usa pytest .

Si bien el truco explicado en la otra respuesta ( http://pytest.org/latest/example/simple.html#detect-if-running-from-within-a-pytest-run ) realmente funciona, probablemente podría diseñar el código de tal manera que no tendría que hacer esto.

Si diseña el código para que la base de datos se conecte como un argumento de alguna manera, a través de una conexión u otra cosa, simplemente puede inyectar un argumento diferente cuando esté ejecutando las pruebas y luego cuando la aplicación lo impulse. Su código terminará con un estado menos global y más modulable y reutilizable. Entonces, a mí me parece un ejemplo en el que las pruebas lo llevan a diseñar mejor el código.