Las buenas prácticas oficiales de Cypress, explicadas en español
Cypress tiene la página de buenas prácticas más explícita del ecosistema: docs.cypress.io — Best Practices nombra cada anti-patrón y su corrección. Aquí está completa en español, con comentarios donde el matiz importa.
Los 12 temas oficiales
1. Secretos y datos sensibles
Anti-patrón: hardcodear API keys, contraseñas o tokens en los specs.
Oficial: valores sensibles vía variables de entorno (Cypress.env()), inyectadas desde el CI — nunca commiteadas.
2. Organización, login y estado
Anti-patrón: loguearse por la interfaz en cada test y compartir page objects con estado.
Oficial: login programático (por API) y control del estado de la app con beforeEach + seeding de datos. Es la práctica que más minutos de suite ahorra — el detalle con cy.session() está en nuestra lección de sesiones.
3. Selección de elementos
Anti-patrón: selectores frágiles por clases CSS, IDs o atributos dinámicos.
Oficial, textual: "Add data- attributes to make it easier to target elements"* — atributos data-cy dedicados a testing, que ningún refactor visual rompe.
4. Asignar valores de retorno
Anti-patrón: const boton = cy.get('button') — los comandos son asíncronos y encolados, no devuelven el elemento.
Oficial: encadenar, y usar alias (.as() / @alias) o closures (.then()) cuando necesitas el valor.
5. Visitar sitios externos
Anti-patrón: testear o interactuar con sitios que no controlas.
Oficial: prueba solo lo tuyo. Para OAuth, cy.origin() en dominios propios o stubbear el proveedor por completo.
6. Tests que dependen entre sí
Anti-patrón: el test B necesita lo que dejó el A.
Oficial: cada test pasa solo — verifícalo con it.only. Si dos pasos son inseparables, son un test, no dos acoplados.
7. Tests de una sola assertion
Anti-patrón: llevar el estilo unit ("una assertion por test") al e2e. Oficial: en e2e las assertions múltiples por test están bien — el costo de setup de cada test e2e hace que fragmentarlos sea puro overhead.
8. Limpiar en after/afterEach
Anti-patrón: resetear estado en hooks de cierre (logout, borrar datos).
Oficial: el reset va en beforeEach — no hay garantía de que los hooks de cierre corran (un refresh se los salta). El estado se garantiza antes del test, no después.
9. Esperas innecesarias
Anti-patrón: cy.wait(5000).
Oficial: los comandos ya reintentan solos; para lo demás, alias de intercept: cy.intercept().as('ruta') + cy.wait('@ruta'). (Nuestra lección de intercepts lo practica completo.)
10. Servidores web
Anti-patrón: levantar el servidor desde dentro del test con cy.exec()/cy.task().
Oficial: el servidor arranca antes de Cypress y muere después — los procesos de fondo dan conflictos de puerto y logs inaccesibles.
11. baseUrl global
Anti-patrón: URLs completas hardcodeadas en cada cy.visit().
Oficial: baseUrl en cypress.config.js — visits cortos y sin el reinicio inicial del runner.
12. Orquestación inteligente
Para suites grandes, la recomendación oficial es la paralelización con balanceo de Cypress Cloud (producto pagado de Cypress). La alternativa gratis por shards está en nuestra lección de CI.
Nuestro veredicto
Lo notable de esta guía es que cada punto nace de un error masivamente repetido — es un catálogo de cicatrices de la comunidad. Los puntos 2, 8 y 9 son los que más suites heredadas violan; audita los tuyos hoy.
Fuente: docs.cypress.io/app/core-concepts/best-practices (Cypress.io, documentación oficial).