INSERT, SELECT y DELETE en Cypress con MySQL

Resumen

Probar operaciones contra una base de datos SQL desde Cypress te permite validar que tu aplicación realmente persiste, consulta y elimina información como esperas. Con un plugin personalizado y los hooks del framework, puedes encadenar pruebas de INSERT, SELECT y DELETE sin contaminar tu entorno. Es ideal para QA Engineers que automatizan flujos end to end con datos reales.

¿Cómo se prueba un INSERT en Cypress contra MySQL?

El primer paso es enviar el query desde el comando cy.task que invoca al plugin de base de datos. La sentencia INSERT INTO pruebas (nombre, apellido_paterno, apellido_materno) VALUES ('Javier', 'Fuentes', 'Mora') agrega un registro nuevo y te devuelve un objeto con metadatos clave.

Entre la información que regresa MySQL están los affected rows y el insertId. El primero confirma cuántas filas se vieron impactadas; el segundo, el identificador autogenerado del registro recién creado. [00:55]

¿Qué son los affected rows en MySQL? Son el número de filas que una operación modificó en la base de datos. Si insertas un solo registro, deben ser 1; si son 0, la operación no impactó nada.

La aserción mínima para un INSERT exitoso es validar que affectedRows sea igual a 1, porque solo agregaste un registro. Esa verificación te da una señal clara de que la escritura ocurrió.

¿Cómo guardar el insertId para usarlo en otra prueba?

Aquí entra cy.wrap con la sintaxis as('id'), que convierte el insertId en un alias accesible mediante this.id en pruebas posteriores. [02:10]

Un detalle técnico que vale subrayar: las funciones que reciben el contexto no deben ser arrow functions. Las arrow functions carecen de contexto propio, y sin ese contexto pierdes acceso a this, donde Cypress guarda los alias. Usa funciones tradicionales con function().

¿Cómo validar un SELECT con WHERE usando el ID guardado?

Una vez que tienes el alias del ID, puedes lanzar un query mucho más quirúrgico. En vez de traer toda la tabla, ejecutas SELECT * FROM pruebas WHERE id = ? pasando this.id como parámetro.

El resultado llega como un arreglo de objetos. Como esperas un único registro, accedes a la posición cero y validas cada campo:

  • result[0].nombre debe ser Javier.
  • result[0].apellido_paterno debe ser Fuentes.
  • result[0].apellido_materno debe ser Mora.

Esta cadena de pruebas confirma que el dato persistió correctamente y que la consulta filtra justo el registro que creaste.

¿Cómo borrar registros con DELETE y validar el resultado?

El DELETE sigue la misma lógica: lanzas DELETE FROM pruebas WHERE id = ? reutilizando el alias del ID. La aserción nuevamente revisa los affected rows esperando un valor de 1.

¿Qué es el serverStatus en MySQL? Es un código numérico que indica el estado del servidor tras ejecutar una sentencia. El valor 2 señala una operación exitosa, equivalente a un 200 en HTTP. [05:05]

MySQL también expone otros campos útiles en la respuesta: message, warningCount y protocol41. Revisarlos te ayuda a detectar advertencias silenciosas que no rompen la prueba pero indican algo raro.

¿Por qué siempre debes incluir WHERE en un DELETE?

Un DELETE FROM pruebas sin cláusula WHERE borra toda la tabla. En entornos de producción, esto puede ser catastrófico. La regla es simple: filtra siempre por un identificador, salvo cuando intencionalmente quieras limpiar una tabla de pruebas.

¿Cómo limpiar la base de datos con hooks de Cypress?

Los hooks before y after te permiten ejecutar código antes o después de tus pruebas. Para mantener limpia tu tabla de pruebas, coloca un DELETE FROM pruebas dentro del after, de modo que cada corrida termine con la tabla vacía. [06:30]

Esto resuelve un problema real: si una prueba intermedia falla, el DELETE específico nunca se ejecuta y la base se llena de basura. El hook after actúa como red de seguridad.

Para verificarlo, ejecuta un SELECT general al inicio de tu suite. Si todo está bien configurado, la primera consulta debería devolver un arreglo vacío, confirmando que el cleanup funcionó en la corrida anterior.

  • INSERT: agrega datos y captura el insertId.
  • SELECT con WHERE: valida que el registro exista con los valores correctos.
  • DELETE con WHERE: elimina solo el registro creado.
  • Hook after: garantiza una tabla limpia al cerrar la suite.

Falta una operación CRUD por cubrir: el UPDATE. Tu reto es implementarlo reutilizando el alias guardado con cy.wrap y as('id'). Cuéntame en los comentarios cómo lo resolverías y qué aserciones agregarías para validar el cambio.