python testing py.test pytest

python - En pytest, ¿de qué sirven los archivos conftest.py?



testing py.test (3)

¿Es este el uso correcto de conftest.py?

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íz conftest.py podría ser inútil y ralentizaría las pruebas si dichos dispositivos no son utilizados por todas las pruebas.

¿Tiene otros usos?

Si lo hace

  • Aparatos : defina aparatos para datos estáticos utilizados por las pruebas. Todas las pruebas en la suite pueden acceder a estos datos a menos que se especifique lo contrario. Esto podría 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 here .

    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 here . Ejemplo:

    def pytest_runtest_setup(item): """ called before ``pytest_runtest_call(item). """ #do some stuff`

  • Probar ruta raíz : esta es una característica oculta. Al definir conftest.py en su ruta raíz, tendrá que pytest reconozca los módulos de su aplicación sin especificar PYTHONPATH . En segundo plano, py.test modifica su sys.path al incluir todos los submódulos que se encuentran desde la ruta raíz.

¿Puedo tener más de un archivo conftest.py?

Sí, puede hacerlo y es muy recomendable si su estructura de prueba es algo compleja. conftest.py archivos conftest.py tienen alcance de directorio. Por lo tanto, crear accesorios específicos y ayudantes es una buena práctica.

¿Cuándo querría hacer eso? Se apreciarán ejemplos.

Varios casos podrían caber:

Crear un conjunto de herramientas o ganchos para un grupo particular de pruebas.

root / mod / conftest.py

def pytest_runtest_setup(item): print("I am mod") #do some stuff test root/mod2/test.py will NOT produce "I am mod"

Cargar un conjunto de accesorios para algunas pruebas pero no para otras.

root / mod / conftest.py

@pytest.fixture() def fixture(): return "some stuff"

root / mod2 / conftest.py

@pytest.fixture() def fixture(): return "some other stuff"

root / mod2 / test.py

def test(fixture): print(fixture)

Imprimirá "algunas otras cosas".

Anulando ganchos heredados de la raíz conftest.py .

root / mod / conftest.py

def pytest_runtest_setup(item): print("I am mod") #do some stuff

root / conftest.py

def pytest_runtest_setup(item): print("I am root") #do some stuff

Al ejecutar cualquier prueba dentro de root/mod , solo se imprime "I am mod".

Puede leer más sobre conftest.py here .

EDITAR:

¿Qué sucede si necesito que se invoquen funciones auxiliares antiguas desde varias pruebas en diferentes módulos? ¿Estarán disponibles para mí si las pongo en un archivo conftest.py? ¿O debería simplemente ponerlos en un módulo helpers.py e importarlo y usarlo en mis módulos de prueba?

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 en pytest . 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

@pytest.fixture def mock_redis(): return MockRedis()

root / tests / stuff / conftest.py

pytest_plugin="helper.redis.redis"

root / tests / stuff / test.py

def test(mock_redis): print(mock_redis.get(''stuff''))

Este será un módulo de prueba que puede importar libremente en sus pruebas. redis.py en conftest.py que potencialmente podría nombrar redis.py como conftest.py si su módulo redis 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 asistente en su raíz conftest.py e inyectarlo cuando sea necesario.

root / tests / conftest.py

@pytest.fixture def mock_redis(): return MockRedis()

root / tests / stuff / test.py

def test(mock_redis): print(mock_redis.get(stuff))

Otra cosa que puede hacer es escribir un complemento instalable. En ese caso, su ayudante se puede escribir en cualquier lugar, pero necesita definir un punto de entrada para instalarlo en su y otros marcos de prueba potenciales. Mira this .

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

class MockRedis(): # stuff

root / tests / stuff / test.py

from helper.redis import MockRedis def test(): print(MockRedis().get(stuff))

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 ayudante

root / tests / helper / __ init__.py

from .redis import MockRedis

O simplemente agregando el módulo auxiliar a su PYTHONPATH .

Recientemente descubrí pytest . Parece genial Sin embargo, creo que la documentación podría ser mejor.

Estoy tratando de entender para qué están destinados los archivos conftest.py .

En mi (actualmente pequeño) conjunto de pruebas tengo un archivo conftest.py en la raíz del proyecto. Lo uso para definir los accesorios que inyecto en mis pruebas.

Tengo dos preguntas:

  1. ¿Es este el uso correcto de conftest.py ? ¿Tiene otros usos?
  2. ¿Puedo tener más de un archivo conftest.py ? ¿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 archivos conftest.py en un conjunto de pruebas py.test?


Uso el archivo conftest.py para definir los accesorios que conftest.py en mis pruebas, ¿es este el uso correcto de conftest.py ?

, generalmente se utiliza un dispositivo para preparar los datos para múltiples pruebas.

¿Tiene otros usos?

, un dispositivo es una función ejecutada por 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.

¿Puedo tener más de un archivo conftest.py ? ¿Cuándo querría hacer eso?

Primero, es posible colocar accesorios en archivos de prueba individuales. Sin embargo, para compartir accesorios entre múltiples archivos de prueba, debe usar un archivo conftest.py algún lugar ubicado centralmente para todas las pruebas. Los accesorios pueden ser compartidos por cualquier prueba. Se pueden poner en archivos de prueba individuales si desea que el dispositivo solo sea utilizado por las pruebas en ese archivo.

Segundo, , puede tener otros archivos conftest.py en subdirectorios del directorio de pruebas superior. Si lo hace, los dispositivos definidos en estos archivos conftest.py nivel conftest.py estarán disponibles para las pruebas en ese directorio y subdirectorios.

Finalmente, al colocar accesorios en el archivo conftest.py en la raíz de prueba, estarán disponibles en todos los archivos de prueba.


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)