Skip to content

Tutorial: Pruebas UI con Cypress ‐ Listar

Alonso Hernandez Tavera edited this page Oct 8, 2024 · 5 revisions

Tutorial de Pruebas de UI con Cypress en una Aplicación Angular: Componente de Listar Libros

En este tutorial, aprenderemos a utilizar Cypress para realizar pruebas de interfaz de usuario en una aplicación Angular. Nos enfocaremos en realizar pruebas al componente de Listar Libros del proyecto de referencia del curso "Booksotre".

Bookstore app main section

Imagen 1. Página de inicio de la aplicación Bookstore donde se puede ver el componente de listar libros


Cubriremos tres requisitos específicos:

  1. Verificar que el número de tarjetas renderizadas es el correcto.
  2. Comprobar que todas las tarjetas tienen su imagen renderizada.
  3. Asegurarse de que debajo de cada imagen de tarjeta, se muestra el nombre del libro book.name y su editorial book.editorial.name.

Prerrequisitos

  • Tener instalados Node.js y npm.
  • Haber clonado localmente los repositorios de backend y frontend de la aplicación Bookstore.
  • Haber ejecutado npm install cypress en una terminal de comandos dentro del proyecto frontend.

Configuración Inicial de Cypress

  1. Inicializar Cypress en el proyecto Angular:

    Navega al directorio raíz de tu proyecto Angular y ejecuta:

    npx cypress open

    Este comando inicializará Cypress y creará una carpeta cypress con archivos de ejemplo.

  2. Estructura de Directorios:

    La carpeta cypress contiene:

    • fixtures: Datos estáticos para utilizar en las pruebas.
    • integration o e2e: Lugar donde escribiremos las pruebas.
    • plugins: Plugins para extender funcionalidades.
    • support: Comandos y configuraciones globales.
Creation of test file

Imagen 2. Visualización de la organización de carpetas de Cypress

Codificación de las Pruebas

Para crear un nuevo archivo de pruebas e2e, luego de ejecutar el comando 'npx cypress open', hay que seleccionar la opción de "Pruebas e2e" y luego, la opción de 'create new spec', como en la siguiente imagen.

Creation of test file

Imagen 3. Opción para crear un nuevo test e2e

Aparecerá un campo para darle un nombre al archivo de pruebas, en este caso, lo nombraremos book-list.cy.ts:

Creation of test file

Imagen 4. Selección del nombre para el nuevo test e2e

Para editar el test de manera cómoda, es posible hacerlo desde un IDE como Visual Studio Code. La prueba e2e se codifica en lenguaje typescript para luego ser traducida a lenguaje javascript y ejecutada por Cypress en el navegador seleccionado.

Creation of test file

Imagen 5. Edición del código typescript de la prueba e2e creada en el IDE VSCode

Al haber completado la prueba y guardado el archivo typescript, al volver a la interfaz gráfica de Cypress, nos daremos cuenta que habrá reconocido, ejecudado la prueba y se podrán ver los resultados. En caso de querer volver a ver la ejecución secuencial de las pruebas, se puede oprimir la tecla R o hacer click sobre el botón de "Run All Tests" en la parte superior de la pantalla.

Ahora, se presenta la definición y resultado de ejecución de los 3 test propuestos para este tutorial.

Test 1. Verificar el Número Correcto de Tarjetas Renderizadas

describe('Book List', () => {
  beforeEach(() => {
    cy.visit('http://localhost:4200/'); // Ruta principal de la aplicación, donde aparece el component book-list
  });

  it('Must display the correct number of book cards', () => {
    cy.get('.book-card').should('have.length', 10);
  });
});

Nota: En este caso, se considera que hay un total de 10 libros con sus imágenes respectivas e información básica en la vista principal de la aplicación.

Resultado de ejecución

Creation of test file

Imagen 6. Resultado esperado luego de ejecutar la primera prueba

Se espera que la prueba en la interfaz de cypress aparezca marcada con color verde, lo cual significa que se ejecutó correctamente y el resultado fue el esperado. Además, es necesario comprobar que en la parte superior de la pantalla, arriba del nombre del archivo de prueba, aparezcan 0 tests con fallas (al lado del ícono rojo en forma de X).

Test 2. Comprobar que Todas las Tarjetas Tienen su Imagen Renderizada

Importante: Las pruebas deben ir dentro del método 'describe' creado en la primera prueba y en el mismo nivel del método beforeEach() y el test 1.

it('Should check that all cards have a rendered image', () => {
  cy.get('.book-card img').each(($img) => {
    cy.wrap($img).should('be.visible');
    cy.wrap($img).should('have.attr', 'src').should('not.be.empty');
  });
});

Resultado esperado

Creation of test file

Imagen 7. Resultado esperado luego de ejecutar la segunda prueba

Ahora, deben aparecer 2 pruebas exitosas y 0 con fallas en la interfaz de Cypress.

Test 3. Verificar que se Muestran el Nombre del Libro y el Nombre de la Editorial

it('Should check that each card shows the name of the book and the editorial', () => {
  cy.get('.book-card').each(($card) => {
    cy.wrap($card).within(() => {
      cy.get('.card-title').should('be.visible').and('not.be.empty');
      cy.get('.card-text').should('be.visible').and('not.be.empty');
    });
  });
});

Resultado esperado

Creation of test file

Imagen 8. Resultado esperado luego de ejecutar la tercera prueba

Ahora, las 3 pruebas deben aparecer ejecutadas de manera exitosa por la herramienta Cypress!

Versión final de la prueba e2e creada

El archivo de prueba 'book-list.cy.ts' debería verse de la siguiente forma al final:

describe('Lista de Libros', () => {
  beforeEach(() => {
    cy.visit('http://localhost:4200/'); // Ruta principal de la aplicación, donde aparece el component book-list
  });

  // Test 1
  it('Must display the correct number of book cards', () => {
    cy.get('.book-card').should('have.length', 10);
  });

  // Test 2
  it('All cards must have a rendered image', () => {
    cy.get('.book-card img').each(($img) => {
      cy.wrap($img).should('be.visible');
      cy.wrap($img).should('have.attr', 'src').should('not.be.empty');
    });
  });

  // Test 3
  it('Each card must show the name of the book and the editorial', () => {
    cy.get('.book-card').each(($card) => {
      cy.wrap($card).within(() => {
        cy.get('.card-title').should('be.visible').and('not.be.empty');
        cy.get('.card-text').should('be.visible').and('not.be.empty');
      });
    });
  });

});

Explicación de los Selectores Utilizados

Basándonos en el archivo HTML del componente book-list: book-list.component.html, los selectores CSS que se han utilizado son:

  • .book-card: Clase asignada a cada tarjeta de libro.
  • .book-card img: La imagen dentro de cada tarjeta.
  • .card-title: El elemento que contiene el atributo {{ book.name }}.
  • .card-text: El elemento que contiene el atributo {{ book.editorial.name }}.

Es importante asegurarse de que estos selectores coinciden con el HTML real del componente. Si las clases o estructuras son diferentes, ajusta los selectores en consecuencia (en otros proyectos donde vayas a aplicar las pruebas).

Ejecución de las Pruebas

Para ejecutar las pruebas en modo interactivo, como se mostró a lo largo del tutorial (con la interfaz gráfica de Cypress), ejecuta en una terminal:

npx cypress open

y sigue los pasos dados anteriormente.

Para ejecutar las pruebas en modo headless (sin interfaz gráfica), ejecuta en una terminal:

npx cypress run

Y verifica que los resultados sean todos exitosos.

Opciones por Explorar

  • Uso de Fixtures: Si se desea simular datos o respuestas de API, es posible utilizar fixtures para proporcionar datos estáticos a tus pruebas.
  • Comandos Personalizados: Se pueden crear comandos personalizados en cypress/support/commands.js para reutilizar código común.
  • Esperas y Sincronización: Cypress maneja automáticamente las esperas, pero si es necesario esperar por solicitudes o elementos específicos, utiliza cy.wait() y cy.intercept().

Recursos Adicionales


Autores

Versión 1: Octubre de 2024

Clone this wiki locally