-
Notifications
You must be signed in to change notification settings - Fork 14
Tutorial: Pruebas UI con Cypress ‐ Maestro Detalle
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 Detalle de Libro del proyecto de referencia del curso "Bookstore".
Imagen 1. Componente de detalle de libro que aparece al hacer clic en una tarjeta de libro
Cubriremos dos requisitos específicos:
- Verificar que al hacer clic en cualquier tarjeta de libro, aparece el componente de detalle (en este caso, aparece encima de la lista de tarjetas de libros, no en una nueva ruta).
- Comprobar que el componente de detalle muestra la siguiente información: título del libro, autores, ISBN, fecha de publicación, editorial, descripción y la imagen del libro.
- 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. - Haber configurado Cypress en el proyecto (si no lo has hecho, sigue el Tutorial de Pruebas con Cypress para el Componente Listar Books).
-
Inicializar Cypress en el proyecto Angular (si aún no lo has hecho):
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. -
Estructura de Directorios:
La carpeta
cypress
contiene:-
fixtures
: Datos estáticos para utilizar en las pruebas. -
integration
oe2e
: Lugar donde escribiremos las pruebas. -
plugins
: Plugins para extender funcionalidades. -
support
: Comandos y configuraciones globales.
-
Para crear un nuevo archivo de pruebas e2e, luego de ejecutar el comando npx cypress open
, selecciona la opción de "E2E Testing" y luego la opción de "Crear nuevo spec" (si necesitas mayor claridad en este paso, revisa el Tutorial de Pruebas con Cypress para el Componente Listar Books).
Asigna al archivo el nombre book-detail.cy.ts
.
Para editar el test de manera cómoda, puedes hacerlo desde un IDE como Visual Studio Code.
describe('Detalle de Libro', () => {
beforeEach(() => {
cy.visit('http://localhost:4200/'); // Ruta principal de la aplicación
});
it('Should show detail component when clicking on a book card', () => {
cy.get('.book-card img').first().click(); // Hacer clic en la primera tarjeta de libro
cy.get('app-book-detail').should('be.visible'); // Verificar que el componente de detalle es visible
});
});
Imagen 2. Resultado esperado después de la ejecución de la primera prueba en Cypress
Explicación:
-
cy.get('.book-card img').first().click();
: Selecciona la imagen de la primera tarjeta de libro y simula un clic (según el HTML del componente Detalle, el eventoclick
está en la imagen de la tarjeta). -
cy.get('.book-detail').should('be.visible');
: Verifica que el componente de detalle tenga la clasebook-detail
y sea visible.
Para la correcta ejecución de esta segunda prueba, es necesario asignarle selectores a los diferentes tags o elementos HTML que componen el archivo 'book-detail.component.html'. Estos selectores son de utilidad para que Cypress pueda saber qué elemento debe buscar y analizar dentro de los snapshot que toma durante las pruebas.
Basándonos en el archivo HTML del componente detalle de libro: book-detail.component.html
, los selectores CSS que se han elegido y añadido son los siguientes:
-
app-book-detail
: Selector general del componente de Detalle de los libros, está definido en 'book-detail.component.ts'. -
.book-title
: Elemento que contiene{{ bookDetail?.name }}
. -
.book-authors
: Elementos que contienen los autores del libro. -
.book-isbn
: Elemento que contiene{{ bookDetail?.isbn }}
. -
.book-publishing-date
: Elemento que contiene{{ bookDetail?.publishingDate }}
. -
.book-editorial
: Elemento que contiene{{ bookDetail?.editorial?.name }}
. -
.book-description
: Elemento que contiene{{ bookDetail?.description }}
. -
.book-detail img
: La imagen del libro.
En el caso de este tutorial, se añadieron las siguientes clases en el archivo HTML del componente para asignar los selectores anteriores:
<p class="h3 p-3 book-title">{{ bookDetail?.name }}</p>
<!-- ... -->
<dt>Authors</dt>
<dd class="caption book-authors" *ngFor="let author of bookDetail?.authors">
<a routerLink="/authors/{{ author.id }}">{{ author.name }}</a>
</dd>
<!-- ... -->
<dt>ISBN</dt>
<dd class="book-isbn">{{ bookDetail?.isbn }}</dd>
<!-- ... -->
<dt>Publishing Date</dt>
<dd class="book-publishing-date">{{ bookDetail?.publishingDate }}</dd>
<!-- ... -->
<dt class="bold">Editorial</dt>
<dd class="caption book-editorial">{{ bookDetail?.editorial?.name }}</dd>
<!-- ... -->
<dt class="bold">Description</dt>
<dd class="book-description">{{ bookDetail?.description }}</dd>
it('El componente de detalle debe mostrar la información del libro', () => {
cy.get('.book-card img').first().click(); // Hacer clic en la primera tarjeta de libro
// Verificar que el título del libro se muestra
cy.get('app-book-detail .book-title').should('be.visible').and('not.be.empty');
// Verificar que los autores se muestran
cy.get('app-book-detail .book-authors').should('be.visible').and('not.be.empty');
// Verificar que el ISBN se muestra
cy.get('app-book-detail .book-isbn').should('be.visible').and('not.be.empty');
// Verificar que la fecha de publicación se muestra
cy.get('app-book-detail .book-publishing-date').should('be.visible').and('not.be.empty');
// Verificar que la editorial se muestra
cy.get('app-book-detail .book-editorial').should('be.visible').and('not.be.empty');
// Verificar que la descripción se muestra
cy.get('app-book-detail .book-description').should('be.visible').and('not.be.empty');
// Verificar que la imagen del libro se muestra
cy.get('app-book-detail img').should('be.visible').and('have.attr', 'src').and('not.be.empty');
});
Después de ejecutar las pruebas, deberían aparecer como exitosas en la interfaz de Cypress.
Imagen 2. Resultado esperado luego de ejecutar las pruebas del componente de detalle
El archivo de prueba book-detail.cy.ts
debería verse de la siguiente forma al final:
describe('Detalle de Libro', () => {
beforeEach(() => {
cy.visit('http://localhost:4200/'); // Ruta principal de la aplicación
});
it('Should show detail component when clicking on a book card', () => {
cy.get('.book-card img').first().click(); // Hacer clic en la primera tarjeta de libro
cy.get('app-book-detail').should('be.visible'); // Verificar que el componente de detalle es visible
});
it('El componente de detalle debe mostrar la información del libro', () => {
cy.get('.book-card img').first().click(); // Hacer clic en la primera tarjeta de libro
// Verificar que el título del libro se muestra
cy.get('app-book-detail .book-title').should('be.visible').and('not.be.empty');
// Verificar que los autores se muestran
cy.get('app-book-detail .book-authors').should('be.visible').and('not.be.empty');
// Verificar que el ISBN se muestra
cy.get('app-book-detail .book-isbn').should('be.visible').and('not.be.empty');
// Verificar que la fecha de publicación se muestra
cy.get('app-book-detail .book-publishing-date').should('be.visible').and('not.be.empty');
// Verificar que la editorial se muestra
cy.get('app-book-detail .book-editorial').should('be.visible').and('not.be.empty');
// Verificar que la descripción se muestra
cy.get('app-book-detail .book-description').should('be.visible').and('not.be.empty');
// Verificar que la imagen del libro se muestra
cy.get('app-book-detail img').should('be.visible').and('have.attr', 'src').and('not.be.empty');
});
});
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.
- Uso de Fixtures: Si deseas simular datos o respuestas de API, puedes utilizar fixtures para proporcionar datos estáticos a tus pruebas.
-
Comandos Personalizados: Puedes 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 necesitas esperar por solicitudes o elementos específicos, utiliza
cy.wait()
ycy.intercept()
.
¡Con esto, has aprendido cómo implementar pruebas básicas para el componente de detalle de libro en tu aplicación Angular utilizando Cypress! Estas pruebas aseguran que el componente de detalle se muestra correctamente y que toda la información esencial del libro está presente. Recuerda revisar también el tutorial de pruebas con Cypress para el componente de Listar Libros, el cual se encuentra en la wiki del curso.
- Alonso Hernández Tavera ([email protected])
Esta wiki fue creada para el curso ISIS2603 Desarrollo de Software en Equipos en la Universidad de los Andes. Desarrollado por Rubby Casallas con la colaboración de César Forero, Kelly Garcés, Jaime Chavarriaga y José Bocanegra. Universidad de los Andes, Bogotá, Colombia. 2021.
- Instalación del ambiente en máquina propia
- Configuración de la máquina virtual
- Ejecución del back
- Uso de Codespaces
- Clases
- Herencia
- Asociaciones
- Tipos de asociaciones
- Caso de estudio: la biblioteca
- Caso de estudio: la empresa
- Java Persistence API (JPA)
- Implementación paso a paso persistencia
- Ejemplo implementación persistencia
- Carga de datos en el Backend
- Relaciones compartidas (Shared) OneToOne
- Relaciones compartidas (Shared) OneToMany/ManyToOne
- Relaciones compuestas (Composite) OneToMany/ManyToOne
- Conceptos básicos de REST
- Diseño API REST
- Tutorial documentación diseño API
- Implementación API REST con Spring
- Tutorial implementación API