Template Cypress E2E Tests
Propósito y Alcance
Este proyecto proporciona una plantilla base para la creación de pruebas End-to-End (E2E) utilizando Cypress y Cucumber (Gherkin) para aplicaciones web. Su objetivo principal es facilitar la configuración inicial de un entorno de pruebas automatizadas, incluyendo la integración con Azure Active Directory (AAD) para la autenticación, y la generación de reportes de prueba detallados.
Problema que resuelve:
- Estandariza la creación de proyectos de pruebas E2E con Cypress.
- Proporciona una solución preconfigurada para la autenticación AAD en pruebas Cypress.
- Facilita la ejecución de pruebas en diferentes entornos (dev, intg, cert, prod).
- Integra la generación de reportes con Mochawesome.
Alcance:
- Configuración y ejecución de pruebas E2E para interfaces de usuario (UI).
- Configuración y ejecución de pruebas para APIs.
- Integración con Cucumber para Behavior-Driven Development (BDD).
- Manejo de configuraciones específicas por entorno.
- Autenticación con Azure AD.
- Generación de reportes de prueba.
- Integración con pipeline de CI/CD (Jenkins).
Arquitectura
El proyecto se centra en la automatización de pruebas con Cypress. La arquitectura es la siguiente:
- Cypress Test Runner: El motor principal que ejecuta los scripts de prueba.
- Application Under Test (AUT): La aplicación web o API externa que se está probando
(ej.
strategic-planning.dev.appslatam.com). - Cucumber (Gherkin): Permite escribir casos de prueba en un lenguaje natural (
.featurefiles) que se mapean a código JavaScript/TypeScript (step definitions). - Azure Active Directory (AAD): Para pruebas que requieren autenticación, el proyecto incluye un flujo personalizado para manejar el login con AAD.
- Mochawesome: Generador de reportes HTML para visualizar los resultados de las pruebas.
- Node.js Environment: Cypress y sus dependencias se ejecutan sobre Node.js.
- Jenkins CI/CD: El
Jenkinsfiledefine el pipeline para la ejecución automatizada de las pruebas en entornos de integración continua.
No se requiere un diagrama de arquitectura complejo, ya que es un proyecto de pruebas. La interacción principal es Cypress comunicándose con el AUT a través de HTTP/HTTPS y manipulando el DOM del navegador.
Tecnologías y Dependencias
Las principales tecnologías y dependencias del proyecto se encuentran definidas en el archivo package.json:
- Framework de Pruebas: Cypress (
^13.14.1) - BDD (Behavior-Driven Development):
@badeball/cypress-cucumber-preprocessor: (^20.1.2) para integrar Cucumber con Cypress.
- Preprocesador de Archivos:
@bahmutov/cypress-esbuild-preprocessor: (^2.2.2) para usar ESBuild con Cypress.esbuild: (^0.23.1) bundler rápido para JavaScript/TypeScript.
- Reportería:
mochawesome: (^7.1.3) para generar reportes HTML.mochawesome-merge: (^4.3.0) para unir múltiples reportes JSON de Mochawesome.mochawesome-report-generator: (^6.2.0) generador de reportes base para Mochawesome.
- Gestión de Variables de Entorno:
dotenv: (^16.4.5) para cargar variables de entorno desde un archivo.env.
- Utilitarios:
fs-extra: (^11.2.0) para operaciones extendidas del sistema de archivos.
- Entorno de Ejecución: Node.js (versión recomendada
>=16)
Configuración Local
Prerrequisitos
- Node.js (v16 o superior recomendado)
- npm (generalmente viene con Node.js) o Yarn
- Un editor de código (ej. VSCode)
- Git
Pasos de Configuración
-
Clonar el repositorio: Sigue los siguientes pasos
-
Instalar dependencias:
npm installo si usas Yarn:
yarn install -
Configurar variables de entorno: Crea un archivo
.enven la raíz del proyecto. Este archivo es ignorado por Git (.gitignore). Basado encypress.config.jsycypress/support/e2e.js, las siguientes variables son necesarias para la autenticación AAD:# Credenciales para el usuario con rol editor (ejemplo)AUTH0_USERNAME="tu_usuario_editor_aad@example.com"AUTH0_PASSWORD="tu_password_editor_aad"# Credenciales para el usuario con rol lector (ejemplo)AUTH1_USERNAME="tu_usuario_lector_aad@example.com"AUTH1_PASSWORD="tu_password_lector_aad"Reemplaza los valores con las credenciales correspondientes para tus entornos de prueba.
-
Verificar la instalación de Cypress (opcional):
npm run cypress:verify# onpx cypress verify
Ejecutar Pruebas Localmente
El archivo package.json contiene varios scripts para ejecutar las pruebas:
-
Abrir Cypress Test Runner (UI):
npm run cy:openEsto abrirá la interfaz de Cypress donde puedes seleccionar y ejecutar pruebas individualmente.
-
Ejecutar todas las pruebas en consola (headless, por defecto en Chrome):
npm run cy:run -
Ejecutar pruebas UI con reporte Mochawesome:
npm run cy:ui -
Ejecutar pruebas API con reporte Mochawesome:
npm run cy:api -
Ejecutar pruebas para un entorno específico: El proyecto está configurado para cargar diferentes
baseUrlsegún el entorno.npm run cy:run:dev # Para entorno de desarrollonpm run cy:run:intg # Para entorno de integraciónnpm run cy:run:cert # Para entorno de certificaciónnpm run cy:run:prod # Para entorno de producciónEstos scripts utilizan los archivos de configuración en
cypress/config/cypress.[entorno].config.json. -
Generar Reporte Consolidado: Después de ejecutar pruebas con Mochawesome (ej.
npm run cy:run:dev), puedes generar un reporte HTML consolidado:npm run cy:reportEsto creará un archivo
merged-report.jsony abrirá el reporte HTML enmochawesome-report/merged-report.html.
Despliegue
El despliegue de este proyecto de pruebas se refiere a su ejecución en un entorno de Integración Continua (CI), típicamente Jenkins.
Jenkins
El proyecto incluye un Jenkinsfile:
#!groovy
pipelineLatamEMX("cypress-e2e")
Esto indica que utiliza una pipeline compartida llamada pipelineLatamEMX con el perfil cypress-e2e. Esta pipeline
se encargará de:
- Clonar el repositorio.
- Instalar dependencias.
- Ejecutar las pruebas Cypress (probablemente usando uno de los scripts de
package.json). - Publicar los artefactos de prueba (reportes Mochawesome, videos, screenshots).
Configuración de Entornos en CI
La configuración para diferentes entornos (dev, intg, cert, prod) en CI se gestiona a través de archivos YAML en el
directorio deploy/env/:
deploy/env/dev.yamldeploy/env/cert.yamldeploy/env/intg.yamldeploy/env/feature.yaml
Estos archivos pueden contener variables específicas del entorno, como las credenciales de AAD:
# Ejemplo de deploy/env/dev.yaml
### ---> # OAuth Credentials - AAD
auth0_username: "test_emx_stplanng_ehvypln_editor@latam.com"
auth1_username: "test_emx_stplanng_ehvypln_reader@latam.com"
Configuración de Runtime (Cloud Run - si aplica a la ejecución de los tests, no al AUT)
Los archivos ERB (.yaml.erb) en deploy/run/ sugieren una configuración para Google Cloud Run, aunque esto podría
ser para una infraestructura que soporta la ejecución de las pruebas o servicios relacionados, no directamente el
proyecto Cypress en sí como una aplicación desplegada.
-
deploy/run/runtime-config.yaml.erb:# min-instances: 0# max-instances: 5# execution-environment: gen2# ingress: all# concurrency: 5# timeout: 600# update-secrets: AUTH0_PASSWORD=auth0_password,AUTH1_PASSWORD=auth1_password# set-secrets: "DATABASE_PASSWORD=projects/831702928814/secrets/tmpl_arq_dev_lataminit-dev-cloudsql_passwd:latest"La directiva
update-secretses crucial para la gestión de contraseñas AAD (AUTH0_PASSWORD,AUTH1_PASSWORD) en el entorno de CI/CD. -
deploy/run/environment.yaml.erb:### ---> OAuth Credentials - AADAUTH0_USERNAME: "<%= auth0_username %>"AUTH1_USERNAME: "<%= auth1_username %>"Este archivo plantilla se utiliza para inyectar los nombres de usuario AAD como variables de entorno en el runtime.
Endpoints de la API
Este proyecto se enfoca principalmente en pruebas E2E de UI, pero también incluye un ejemplo de prueba de API.
Pokémon GO API (Ejemplo)
Se utiliza como ejemplo para demostrar la capacidad de pruebas de API con Cypress.
-
Archivo Feature:
cypress/e2e/features/api/api-PokemonGo.featureFeature: Pokemon GO API"""Pokemon GO API"""Scenario: Testing API - METHOD: GET - Endpoint: Abilities by IDWhen I send "ability/1"Then I validate answers you want to receive -
Archivo Step Definition:
cypress/e2e/step_definitions/api/api-PokemonGo.cy.js/// <reference types="cypress" />import { When, Then } from "@badeball/cypress-cucumber-preprocessor";const url = "https://pokeapi.co/api/v2/";When("I send {string}", (endpoint) => {cy.request("GET", url + endpoint).as("response");});Then("I validate answers you want to receive", () => {cy.get("@response").its("status").should("equal", 200);cy.get("@response").its("body").should("have.property", "name", "stench"); // Ejemplo de aserción});
| Método | Endpoint Base | Ruta de Ejemplo | Parámetros | Autenticación | Ejemplo de Respuesta (Status 200) |
|---|---|---|---|---|---|
| GET | https://pokeapi.co/api/v2/ | ability/1 | ID de habilidad | No requerida | JSON con detalles de la habilidad (ej. { "name": "stench", ... }) |
Componentes Específicos
Cypress
- Configuración Principal:
cypress.config.js- Define el preprocesador para Cucumber (
@badeball/cypress-cucumber-preprocessory@bahmutov/cypress-esbuild-preprocessor). - Configura el reportero Mochawesome (
reporter: 'mochawesome'). - Maneja variables de entorno (
env). - Establece patrones para los archivos de especificación (
specPattern). - Carga configuraciones de
baseUrlespecíficas del entorno desdecypress/config/[entorno].config.json. - Filtra navegadores para usar solo los basados en Chromium.
// Ejemplo de cypress.config.js (extracto)module.exports = {reporter: "mochawesome",// ... otras configuraciones ...e2e: {env: {auth0_username: process.env.AUTH0_USERNAME,auth0_password: process.env.AUTH0_PASSWORD,// ...},specPattern: "cypress/e2e/features/*/*.feature",async setupNodeEvents(on, config) {// ... configuración del preprocesador y entornos ...const environmentName = config.env.environmentName || "cypress.dev";const environmentFileName = `./cypress/config/${environmentName}.config.json`;const settings = require(environmentFileName);if (settings.baseUrl) {config.baseUrl = settings.baseUrl;}return config;},},}; - Define el preprocesador para Cucumber (
- Configuración de Cucumber:
.cypress-cucumber-preprocessorrc.json- Define las rutas donde se encuentran los archivos de step definitions.
{"stepDefinitions": ["[filepath]/**/*/*.{js,ts}", "[filepath].{js,ts}", "cypress/e2e/step_definitions/*/*.{js,ts}"]}
Autenticación Azure Active Directory (AAD)
-
Implementación:
cypress/support/e2e.js- Define un comando personalizado
cy.loginToAAD(username, password). - Este comando maneja el flujo de inicio de sesión de Microsoft, interactuando con
login.microsoftonline.com. - Utiliza
cy.session()para cachear la sesión de autenticación y evitar logins repetitivos entre pruebas. - Intercepta las peticiones para añadir un header custom
eMantto-Custom-Header.
// cypress/support/e2e.js (extracto)function loginViaAAD(username, password) {// ... lógica de login con AAD ...cy.origin("login.microsoftonline.com" /* ... */);}Cypress.Commands.add("loginToAAD", (username, password) => {cy.session(`aad-${username}`,() => {/* ... */},{validate: () => {cy.getCookie("eMantto").should("exist");},cacheAcrossSpecs: true,});}); - Define un comando personalizado
-
Uso: En los archivos de step definitions (ej.
cypress/e2e/step_definitions/ui/LoginPage.cy.js):import LoginAadPage from "../../../support/pages/login-aad-page";// ...Given("Previous authentication with AAD", () => {LoginAadPage.authADD; // Llama a cy.loginToAAD con credenciales del .envcy.visit("/");});El
login-aad-page.jsabstrae el uso de las credenciales del.env:// cypress/support/pages/login-aad-page.jsclass LoginAAD {get authADD() {cy.loginToAAD(Cypress.env("auth0_username"), Cypress.env("auth0_password"));}get authADD1() {// Para otro rol/usuariocy.loginToAAD(Cypress.env("auth1_username"), Cypress.env("auth1_password"));}}export default new LoginAAD();
Page Object Model (POM)
El proyecto utiliza el patrón Page Object Model para organizar los selectores y acciones de la UI. Los archivos de
Page Objects se encuentran en cypress/support/pages/.
principal-page.js: Define elementos y métodos para la página principal de la aplicación.login-page.js: Podría ser para un login no-AAD o elementos genéricos de login.login-aad-page.js: Proporciona métodos para invocar el login AAD con diferentes usuarios/roles.
Mochawesome Reporter
- Configuración: En
cypress.config.js, se especificareporter: 'mochawesome'yreporterOptions.// cypress.config.js (extracto)reporterOptions: {html: true,json: true,charts: true,overwrite: true,inlineAssets: true,embeddedScreenshots: true,reportDir: 'cypress/results',reportFilename: '[name].json',}, - Generación: Las pruebas ejecutadas con el flag
-r mochawesome(o si es el reporter por defecto) generan archivos JSON encypress/results/. El scriptnpm run cy:reportluego los fusiona (mochawesome-merge) y genera un reporte HTML (marge). Screenshots y videos de las fallas también son capturados y pueden ser enlazados en el reporte.
Pruebas
Este proyecto está dedicado enteramente a la creación y ejecución de pruebas automatizadas.
Tipos de Pruebas
- Pruebas de UI (End-to-End): Verifican el flujo completo de la aplicación desde la perspectiva del usuario,
interactuando con la interfaz gráfica.
Ejemplo:
cypress/e2e/features/ui/LoginAAD.feature - Pruebas de API: Verifican endpoints específicos de servicios backend.
- Ejemplo:
cypress/e2e/features/api/api-PokemonGo.feature
- Ejemplo:
Estructura de las Pruebas
- Features: Archivos
.featureescritos en Gherkin, ubicados encypress/e2e/features/. Describen el comportamiento esperado del sistema. - Step Definitions: Archivos JavaScript (
.cy.js) ubicados encypress/e2e/step_definitions/. Mapean los pasos de Gherkin a código Cypress ejecutable. - Support Files:
cypress/support/commands.js: Para definir comandos Cypress personalizados (aunqueloginToAADestá ene2e.js).cypress/support/e2e.js: Archivo principal de soporte, donde se importacommands.jsy se pueden definir configuraciones globales o listeners. Aquí se encuentra la lógica deloginToAAD.cypress/support/pages/: Contiene los Page Objects.
- Fixtures: Datos de prueba estáticos en formato JSON, ubicados en
cypress/fixtures/(ej.example.json).
Cómo Ejecutar Pruebas
Consulta la sección "Ejecutar Pruebas Localmente" dentro de "Configuración Local" para ver los comandos npm run ....
Reportes de Pruebas
- Las pruebas generan reportes JSON individuales por Mochawesome en
cypress/results/. - Videos de las ejecuciones se guardan en
cypress/videos/(sivideo: true). - Screenshots de fallos se guardan en
cypress/screenshots/(siscreenshotOnRunFailure: true). - Utiliza
npm run cy:reportpara generar un reporte HTML consolidado, que incluirá estos artefactos.
Consideraciones de Seguridad
- Gestión de Credenciales:
- Local: Las credenciales sensibles (como contraseñas de AAD) deben almacenarse en un archivo
.enven la raíz del proyecto. Este archivo está incluido en.gitignorepara evitar que se suba al repositorio. - CI/CD (Jenkins/Cloud Run): Las credenciales NO deben estar hardcodeadas en el código ni en los archivos de
configuración de entorno versionados (
deploy/env/*.yaml). Se deben gestionar como secretos en el sistema de CI/CD. - El archivodeploy/run/runtime-config.yaml.erbmuestra cómo se pueden pasar secretos:update-secrets: AUTH0_PASSWORD=auth0_password,AUTH1_PASSWORD=auth1_password. El CI/CD debe proveer los valores reales paraauth0_passwordyauth1_password.
- Local: Las credenciales sensibles (como contraseñas de AAD) deben almacenarse en un archivo
- Exposición de Información: Asegúrate de que los reportes y logs generados no expongan información sensible.
Mochawesome reporter options están configuradas para
inlineAssets: trueandembeddedScreenshots: true, lo cual es conveniente pero empaqueta todo en el HTML. Considera las políticas de compartición de estos reportes. - Headers Personalizados: El comando
loginToAADañadeeMantto-Custom-Header: eMx-e2e-testing-Cypress. Asegúrate de que este header es esperado y manejado adecuadamente por la aplicación bajo prueba y no introduce vulnerabilidades.