La implementación de fixtures de prueba es un aspecto clave de las pruebas automatizadas que asegura la preparación del entorno, los datos y las dependencias para los escenarios de prueba.
Historia de la pregunta Las fixtures surgieron en las pruebas automatizadas como una forma de gestionar de manera centralizada la configuración y limpieza del entorno antes de ejecutar las pruebas. Con su ayuda, los equipos lograron consistencia y previsibilidad en las pruebas, lo cual es especialmente importante cuando el código está en constante cambio.
Problema Sin las fixtures adecuadas, las pruebas automatizadas se vuelven inestables, dependen unas de otras, se interfieren al ejecutarse en paralelo y también aumentan la deuda técnica (ya que la lógica de configuración/lógica de limpieza se duplica y se expande).
Solución
Utiliza mecanismos estándar de fixtures proporcionados por los frameworks de prueba (por ejemplo, @BeforeAll, @BeforeEach en JUnit o conftest.py en pytest). Intenta hacer las fixtures configurables y aisladas:
Características clave:
¿Se pueden modificar los objetos creados por la fixture en una prueba si son necesarios para las pruebas siguientes?
No, así las pruebas se volverán dependientes: los cambios realizados por una prueba pueden romper otra. Es mejor usar objetos frescos para cada prueba o revertir los cambios después de cada ejecución.
¿Por qué no cargar toda la base de datos "de una vez" al inicio de la ejecución de pruebas automatizadas para acelerar el proceso?
Este enfoque puede llevar a pruebas inestables y errores difíciles de detectar. Los datos "permanecerán" entre las pruebas, y el orden de su ejecución se volverá crítico.
¿Se puede usar una única fixture global para todo el conjunto de pruebas?
No, las fixtures globales son aceptables solo para pruebas completamente independientes. Generalmente, este enfoque conduce a la influencia mutua de las pruebas, lo que dificulta el análisis y el mantenimiento.
En el proyecto decidieron ahorrar tiempo y ejecutar pruebas automatizadas en una sola base de datos, sin revertir los cambios después de cada prueba. Después de la aparición de pruebas que cambiaban los mismos datos, empezaron a surgir errores intermitentes: las pruebas comenzaron a "caer" una u otra, dependiendo del orden de ejecución.
Ventajas:
Desventajas:
Se utilizaron factories-fixtures: cada prueba crea sus propios datos y los elimina después de completarse. Los errores antiguos ya no se reproducen, el orden de las pruebas no importa.
Ventajas:
Desventajas: