Recientemente descubrí pytest
. Parece genial Sin embargo, creo que la documentación podría ser mejor.
Estoy tratando de entender que conftest.py
archivos están destinados a ser utilizados.
En mi (actualmente pequeño) conjunto de pruebas tengo uno conftest.py
archivo en la raíz del proyecto. Lo uso para definir los accesorios que inyecto en mis pruebas.
Tengo dos preguntas:
- ¿Es este el uso correcto de
conftest.py
? ¿Tiene otros usos? - ¿Puedo tener más de un
conftest.py
archivo? ¿Cuándo querría hacer eso? Se apreciarán ejemplos.
En términos más generales, ¿cómo definiría el propósito y el uso correcto de los conftest.py
archivos en un conjunto de pruebas py.test?
It seems great. However, I feel the documentation could be better.
conftest.py
y, aunque hay muchas referencias para hacer esto o hacer eso con un archivo de conflicto, en ninguna parte de la documentación indica que cuando pytest prueba el descubrimiento, se encuentran todos los archivos conftest.py (dentro del la estructura del directorio sobre la que se realiza el descubrimiento de prueba) se ejecutará durante la fase de recopilación de pruebas (antes de que se ejecuten las pruebas). Tuve que resolverlo yo mismo a través de la experimentación.Respuestas:
Sí lo es. Los accesorios son un uso potencial y común de
conftest.py
. Los accesorios que definirá se compartirán entre todas las pruebas en su conjunto de pruebas. Sin embargo, la definición de accesorios en la raízconftest.py
podría ser inútil y ralentizaría las pruebas si dichos dispositivos no son utilizados por todas las pruebas.Si lo hace
Aparatos : defina aparatos para datos estáticos utilizados por las pruebas. Todas las pruebas de la suite pueden acceder a estos datos a menos que se especifique lo contrario. Estos podrían ser datos, así como ayudantes de módulos que se pasarán a todas las pruebas.
Carga de complementos externos :
conftest.py
se utiliza para importar complementos o módulos externos. Al definir la siguiente variable global, pytest cargará el módulo y lo pondrá a disposición para su prueba. Los complementos son generalmente archivos definidos en su proyecto u otros módulos que pueden ser necesarios en sus pruebas. También puede cargar un conjunto de complementos predefinidos como se explica aquí .pytest_plugins = "someapp.someplugin"
Ganchos : puede especificar ganchos como los métodos de configuración y desmontaje y mucho más para mejorar sus pruebas. Para un conjunto de ganchos disponibles, lea aquí . Ejemplo:
Probar ruta raíz : esta es una característica oculta. Al definir
conftest.py
en su ruta raíz, tendrá quepytest
reconocer sus módulos de aplicación sin especificarPYTHONPATH
. En segundo plano, py.test modifica tusys.path
mediante la inclusión de todos los submódulos que se encuentran desde la ruta raíz.Sí, puede hacerlo y es muy recomendable si su estructura de prueba es algo compleja.
conftest.py
los archivos tienen alcance de directorio. Por lo tanto, crear accesorios y ayudantes específicos es una buena práctica.Varios casos podrían caber:
Crear un conjunto de herramientas o ganchos para un grupo particular de pruebas.
root / mod / conftest.py
Cargando un conjunto de accesorios para algunas pruebas pero no para otras.
root / mod / conftest.py
root / mod2 / conftest.py
root / mod2 / test.py
Imprimirá "algunas otras cosas".
Anulando ganchos heredados de la raíz
conftest.py
.root / mod / conftest.py
root / conftest.py
Al ejecutar cualquier prueba dentro
root/mod
, solo se imprime "I am mod".Puedes leer más sobre
conftest.py
aquí .EDITAR:
Puede usar
conftest.py
para definir sus ayudantes. Sin embargo, debes seguir la práctica común. Los ayudantes se pueden usar como accesorios al menos enpytest
. Por ejemplo, en mis pruebas tengo un simulador de ayuda de redis que inyecto en mis pruebas de esta manera.root / helper / redis / redis.py
root / tests / stuff / conftest.py
root / tests / stuff / test.py
Este será un módulo de prueba que puede importar libremente en sus pruebas. NOTA que potencialmente podría nombrar
redis.py
comoconftest.py
si su móduloredis
contiene más pruebas. Sin embargo, esa práctica se desaconseja debido a la ambigüedad.Si desea usar
conftest.py
, simplemente puede poner ese ayudante en su raízconftest.py
e inyectarlo cuando sea necesario.root / tests / conftest.py
root / tests / stuff / test.py
Otra cosa que puedes hacer es escribir un complemento instalable. En ese caso, su asistente puede escribirse en cualquier lugar, pero debe definir un punto de entrada para instalarlo en su y otros marcos de prueba potenciales. Ver esto .
Si no desea usar accesorios, por supuesto, podría definir un simple ayudante y simplemente usar la importación antigua simple donde sea necesario.
root / tests / helper / redis.py
root / tests / stuff / test.py
Sin embargo, aquí puede tener problemas con la ruta ya que el módulo no está en una carpeta secundaria de la prueba. Debería poder superar esto (no probado) agregando un
__init__.py
a su ayudanteroot / tests / helper / __ init__.py
O simplemente agregando el módulo auxiliar a su
PYTHONPATH
.fuente
test_aaaaa.py
realmente está intentando ejecutarse antes de que se complete la configuración del dispositivoconftest.py
. ¿Alguna idea de por qué esto puede estar ocurriendo?En un sentido amplio, conftest.py es un complemento local por directorio. Aquí se definen ganchos y accesorios específicos del directorio. En mi caso, tengo un directorio raíz que contiene directorios de pruebas específicas del proyecto. Parte de la magia común está estacionada en 'root' conftest.py. Proyecto específico - en los propios. No puedo ver nada malo en el almacenamiento de accesorios en conftest.py a menos que no se usen ampliamente (en ese caso, prefiero definirlos directamente en los archivos de prueba)
fuente
Sí , generalmente se utiliza un dispositivo para preparar los datos para múltiples pruebas.
Sí , un dispositivo es una función que se ejecuta
pytest
antes y, a veces, después de las funciones de prueba reales. El código en el dispositivo puede hacer lo que quieras. Por ejemplo, un dispositivo se puede usar para obtener un conjunto de datos para que las pruebas funcionen, o un dispositivo también se puede usar para llevar un sistema a un estado conocido antes de ejecutar una prueba.Primero, es posible colocar accesorios en archivos de prueba individuales. Sin embargo, para compartir accesorios entre múltiples archivos de prueba, debe usar un
conftest.py
archivo en algún lugar ubicado centralmente para todas las pruebas. Los accesorios pueden ser compartidos por cualquier prueba. Se pueden colocar en archivos de prueba individuales si desea que el dispositivo solo sea utilizado por las pruebas en ese archivo.Segundo, sí , puede tener otros
conftest.py
archivos en subdirectorios del directorio de pruebas superior. Si lo hace, los accesorios definidos en estos niveles inferioresconftest.py
archivos de estarán disponibles para las pruebas en ese directorio y subdirectorios.Finalmente, al colocar accesorios en el
conftest.py
archivo en la raíz de prueba, estarán disponibles en todos los archivos de prueba.fuente