Para pruebas estables de extremo a extremo (E2E), necesitamos un entorno que esté lo más aislado posible del exterior.
Las pruebas escamosas son pruebas que fallan por razones no relacionadas con su código. Hacen que sea difícil usar E2E como una verificación confiable de la corrección de la aplicación. En casos extremos, las pruebas escamosas le enseñarán a su equipo a ignorar los resultados de E2E. Esto puede acabar con el esfuerzo de automatizar el control de calidad (QA).
El enfoque que se presenta aquí aborda dos grandes fuentes de problemas potenciales en sus ejecuciones de prueba:
Hay otras fuentes de descamación que no se ven afectadas por este enfoque:
Antes de que mi equipo y yo realizáramos mis pruebas en un contenedor back-end dedicado, usamos uno de nuestros servidores que no son de producción. Este enfoque estuvo bien en la etapa de experimentación de nuestra solución E2E.
Cuando solo había unas pocas pruebas, no podíamos usar los resultados de las pruebas para tomar decisiones de todos modos.
Sin embargo, a medida que agregamos más pruebas y generamos tiempos de ejecución más prolongados, este enfoque comenzó a desmoronarse. Los principales problemas fueron los siguientes:
Una solución a este problema fue dedicar un servidor back-end y una base de datos separados para cada trabajo de prueba. Este enfoque sería muy desafiante si no fuera por Docker.
Los contenedores Docker son una herramienta perfecta para crear un entorno contenido con todo lo que necesita una aplicación para ejecutarse:
Para su prueba, puede preparar un contenedor de base de datos dedicado que viene con datos de prueba predecibles. De esta forma, podrá reproducir exactamente el punto de partida en cada ejecución E2E, lo que hará que sus pruebas sean más estables.
Puede usar diferentes etiquetas para su imagen de Docker, para el control de versiones de la base de datos de prueba. La misma base de datos de prueba también se puede utilizar en un entorno de desarrollo. Para las pruebas manuales en desarrollo, necesita entidades de ejemplo similares a las de las pruebas automatizadas.
Si ya usó Docker para implementar su backend, será bastante fácil reutilizar la misma imagen para ejecutar su E2E. En mi equipo, implementamos un backend como contenedores y proporcionamos las URL y las credenciales de la base de datos como variables de entorno.
La misma versión del contenedor puede implementarse en producción o usarse en integración continua (CI) para ejecutar pruebas: cada entorno proporciona los valores correctos para conectarse a la base de datos.
En función de su estrategia de implementación, puede realizar una de las siguientes acciones:
Usa los contenedores que creas como parte de la construcción del frontend.
Obtenga los archivos compilados y asegúrese de que estén disponibles a través de HTTP para las pruebas.
En nuestro caso, usamos la opción 2: implementamos la aplicación como archivos estáticos, por lo que simplemente creamos un contenedor dedicado para servir los archivos creados durante las ejecuciones del trabajo E2E.
Usamos GitLab como plataforma para ejecutar nuestro CI. Cada trabajo en GitLab se ejecuta dentro de un contenedor con una imagen de su elección. Además del contenedor principal, puede definir servicios : contenedores adicionales que se ejecutan junto con sus pruebas. La configuración es tan fácil como:
<job-name>: services: - name: <image> alias: <container-url>
Las opciones disponibles son similares a las que tiene en Docker Compose, pero son más limitadas.
Un problema en la configuración de GitLab es establecer la variable FF_NETWORK_PER_BUILD
en 1 si desea permitir que los servicios accedan entre sí durante la ejecución de la prueba.
En algún momento, estábamos ejecutando todas las pruebas en paralelo dentro de un trabajo. En ese momento, era necesario aplicar un aislamiento aún más fuerte: cada prueba usaba el mismo backend y la misma base de datos.
Para solucionar este problema, actualizamos nuestras pruebas para que dependan principalmente de los datos aleatorios que inyectamos justo dentro de la sección before
de las pruebas. Esto permitió que las pruebas se ejecutaran sin verse afectadas por otros cambios que ocurrían en otros subprocesos.
Este enfoque puede ser un poco complicado al principio, pero puede tener sentido según las circunstancias.
Aunque comenzamos una nueva base de datos para cada trabajo de prueba, todavía estamos tratando de hacer que nuestras pruebas dejen la aplicación en el mismo estado en que la encontraron. Tal vez sea un remanente del período en el que estábamos ejecutando pruebas en un entorno compartido.
Ya no es crucial, pero aún puede ayudar durante el desarrollo de la prueba en los siguientes casos:
Hay casos en los que trasladar los servicios a un contenedor no es una opción. Por ejemplo:
En ambos casos, para aislar las ejecuciones de prueba, puede simular las solicitudes que van a esos servicios. Esto evitará que los servicios externos impredecibles afecten los resultados de su prueba. Una desventaja de este enfoque es que sus pruebas se desconectarán del contexto en el que operan sus aplicaciones.
Con los simulacros implementados, sus pruebas no detectarán casos cuando los cambios en esos servicios afecten su aplicación.
Si está interesado en obtener más información sobre las pruebas u otros temas relacionados con la programación, puede registrarse aquí para recibir actualizaciones cuando publique contenido relacionado.