Configuración de Cypress con Next.js
Cypress es un ejecutor de pruebas utilizado para pruebas de extremo a extremo (E2E) y pruebas de componentes. Esta página te mostrará cómo configurar Cypress con Next.js y escribir tus primeras pruebas.
Advertencia:
- Para pruebas de componentes, Cypress actualmente no es compatible con Next.js versión 14 y los Componentes de Servidor
async
. Estos problemas están siendo monitoreados. Por ahora, las pruebas de componentes funcionan con Next.js versión 13, y recomendamos pruebas E2E para Componentes de Servidorasync
.- Cypress actualmente no es compatible con TypeScript versión 5 usando
moduleResolution:"bundler"
. Este problema está siendo monitoreado.
Configuración manual
Para configurar Cypress manualmente, instala cypress
como una dependencia de desarrollo:
npm install -D cypress
# o
yarn add -D cypress
# o
pnpm install -D cypress
Agrega el comando open
de Cypress al campo scripts
del package.json
:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"cypress:open": "cypress open"
}
}
Ejecuta Cypress por primera vez para abrir el conjunto de pruebas:
npm run cypress:open
Puedes elegir configurar Pruebas E2E y/o Pruebas de Componentes. Seleccionar cualquiera de estas opciones creará automáticamente un archivo cypress.config.js
y una carpeta cypress
en tu proyecto.
Creando tu primera prueba E2E con Cypress
Asegúrate de que tu archivo cypress.config.js
tenga la siguiente configuración:
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
setupNodeEvents(on, config) {},
},
})
const { defineConfig } = require('cypress')
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {},
},
})
Luego, crea dos nuevos archivos de Next.js:
import Link from 'next/link'
export default function Home() {
return (
<div>
<h1>Home</h1>
<Link href="/about">About</Link>
</div>
)
}
import Link from 'next/link'
export default function About() {
return (
<div>
<h1>About</h1>
<Link href="/">Home</Link>
</div>
)
}
Agrega una prueba para verificar que tu navegación funciona correctamente:
describe('Navigation', () => {
it('should navigate to the about page', () => {
// Comienza desde la página de inicio
cy.visit('http://localhost:3000/')
// Encuentra un enlace con un atributo href que contenga "about" y haz clic
cy.get('a[href*="about"]').click()
// La nueva URL debe incluir "/about"
cy.url().should('include', '/about')
// La nueva página debe contener un h1 con "About"
cy.get('h1').contains('About')
})
})
Ejecutando pruebas E2E
Cypress simulará un usuario navegando por tu aplicación, lo que requiere que tu servidor Next.js esté en ejecución. Recomendamos ejecutar tus pruebas contra tu código de producción para asemejarte más al comportamiento real de tu aplicación.
Ejecuta npm run build && npm run start
para construir tu aplicación Next.js, luego ejecuta npm run cypress:open
en otra ventana de terminal para iniciar Cypress y ejecutar tu suite de pruebas E2E.
Nota útil:
- Puedes usar
cy.visit("/")
en lugar decy.visit("http://localhost:3000/")
agregandobaseUrl: 'http://localhost:3000'
al archivo de configuracióncypress.config.js
.- Alternativamente, puedes instalar el paquete
start-server-and-test
para ejecutar el servidor de producción de Next.js junto con Cypress. Después de la instalación, agrega"test": "start-server-and-test start http://localhost:3000 cypress"
al camposcripts
de tupackage.json
. Recuerda reconstruir tu aplicación después de nuevos cambios.
Creando tu primera prueba de componentes con Cypress
Las pruebas de componentes construyen y montan un componente específico sin necesidad de empaquetar toda tu aplicación o iniciar un servidor.
Selecciona Pruebas de Componentes en la aplicación de Cypress, luego selecciona Next.js como tu framework front-end. Se creará una carpeta cypress/component
en tu proyecto y se actualizará el archivo cypress.config.js
para habilitar pruebas de componentes.
Asegúrate de que tu archivo cypress.config.js
tenga la siguiente configuración:
import { defineConfig } from 'cypress'
export default defineConfig({
component: {
devServer: {
framework: 'next',
bundler: 'webpack',
},
},
})
const { defineConfig } = require('cypress')
module.exports = defineConfig({
component: {
devServer: {
framework: 'next',
bundler: 'webpack',
},
},
})
Asumiendo los mismos componentes de la sección anterior, agrega una prueba para validar que un componente renderiza el resultado esperado:
import AboutPage from '../../pages/about'
describe('<AboutPage />', () => {
it('should render and display expected content', () => {
// Monta el componente React para la página About
cy.mount(<AboutPage />)
// La nueva página debe contener un h1 con "About page"
cy.get('h1').contains('About')
// Valida que un enlace con la URL esperada esté presente
// *Seguir* el enlace es más adecuado para una prueba E2E
cy.get('a[href="/"]').should('be.visible')
})
})
Nota útil:
- Cypress actualmente no admite pruebas de componentes para Componentes de Servidor
async
. Recomendamos usar pruebas E2E.- Dado que las pruebas de componentes no requieren un servidor Next.js, características como
<Image />
que dependen de un servidor disponible pueden no funcionar directamente.
Ejecutando pruebas de componentes
Ejecuta npm run cypress:open
en tu terminal para iniciar Cypress y ejecutar tu suite de pruebas de componentes.
Integración Continua (CI)
Además de las pruebas interactivas, también puedes ejecutar Cypress en modo sin cabeza usando el comando cypress run
, que es más adecuado para entornos de CI:
{
"scripts": {
//...
"e2e": "start-server-and-test dev http://localhost:3000 \"cypress open --e2e\"",
"e2e:headless": "start-server-and-test dev http://localhost:3000 \"cypress run --e2e\"",
"component": "cypress open --component",
"component:headless": "cypress run --component"
}
}
Puedes aprender más sobre Cypress e Integración Continua en estos recursos: