Pruebas de Bases de Datos Relacionales con MySQL y Cypress
Clase 11 de 17 • Curso de Automatización de Pruebas de Backend con Cypress
Contenido del curso
Clase 11 de 17 • Curso de Automatización de Pruebas de Backend con Cypress
Contenido del curso
Isilreiberth José Pérez Rodríguez
Diego Vergara
Nicolas Cardona
Fabián Alejandro Oger
Emmanuel Rodríguez
Cristian Urbano
Marco Antonio Urquidi Espada
Geovanni Atavales Quiroga
Juan Pablo González
Mark Joaquin
Diego Fernando Gómez Álvarez
Gabriel Hans González Peña
Javier Fuentes Mora
Mario Alexander Vargas Celis
Isilreiberth José Pérez Rodríguez
Tanisha Salazar
Javier Fuentes Mora
Abdul Orlando Florez Lopez
Javier Fuentes Mora
David steven Abril Pulecio
Juan Morillo
Luis Alberto Juarez Corona
Nicolas Cardona
Asi seria la conexión mysql + cypress 12:
npm install mysql2 --save-dev
//cypress.config.js const { defineConfig } = require('cypress'); const mysql = require('mysql2'); function queryTestDB(query) { const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '*******', database: 'MiDataBase', }); connection.connect(); return new Promise((resolve, reject) => { connection.query(query, (error, results) => { if (error) reject(error); else { connection.end(); return resolve(results); } }); }); } module.exports = defineConfig({ e2e: { setupNodeEvents(on) { on('task', { queryDB: (query) => { return queryTestDB(query); }, }); }, }, }); //Test describe('Haremos una conexión con MySQL', () => { it('Debe obtener los resultados de una consulta', () => { cy.task('queryDB', 'SELECT * FROM ACTOR').then( (result) => { expect(result.length).to.equal(4); } ); }); });
Con este código y mysql en un contenedor docker pude correr las pruebas en la version 12, aunque no me cargan las variables de entorno :(.
Config:
const { defineConfig } = require("cypress"); const mysql = require('mysql') module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('task',{ queryTestDb:function(query,config) { const connection = mysql.createConnection({ "user":"root", "password":"example", "database":"db" }) connection.connect() return new Promise((resolve, reject) => { connection.query(query,(err,results)=>{ if(err){ reject(err) } else { connection.end() return resolve(results) } }) }) } }) // implement node event listeners here }, excludeSpecPattern: [ "cypress/e2e/getting-started/*.js", "cypress/e2e/advanced-examples/*.js", ], baseUrl:"" } });
Create dummy DATABASE
CREATE DATABASE people (id int,name varchar(255));
Test:
describe('testing database', () => { it('select',()=>{ cy.task('queryTestDb',"select * from people").then((response)=>{ cy.log(response) }) }) })
Buenas Diego, el por qué de que no te trae las variables de entorno es porque la sintaxis queryTestDb: function (query, config) {
Debería ser queryTestDb (query) {
.
Otra cosa, el config no se le debe pasar a esta función ya que el setupNodeEvents(on, config) { lo tiene y está en el mismo closure.
Un tanto diferente por el cambio de versión.
Espero te sirva.
Ya vi el tema que estás teniendo ahí, te falta el host. En vez de esto:
mysql.createConnection({ "user":"root", "password":"example", "database":"db" })
Poné esto:
mysql.createConnection({ "user":"root", "password":"example", "database":"db" "host":"{completar}" })
Prisma ORM con Cypress
. Para este efecto, partimos de que poseemos una abstracción como clase de Prisma o mediante la abstracción del 🔗 Prisma client. . Para poder probar ciertos casos de uso, podemos utilizar los eventos de Cypress mediante 📚 Plugins. Por lo que primero, empezamos a escribir nuestro plugin. .
Nota. Para la versión 10 de Cypresss, la generación de plugins dentro de la carpeta
pluginesta descontinuada y soportada en el archivocypress.config.
. Definiendo nuestro Plugin:
import {defineConfig} from 'cypress' import Prisma from './src/libs/Prisma' export default defineConfig({ e2e: { baseUrl: 'URL', setupNodeEvents(on, _) { on('task', { findMany: ({model, query}) => { const client = new Prisma(model) return client.findMany(query) }, }) } } })
De aquí importa la forma en cómo abstraemos nuestra Librería / ORM / Driver para que según sea el caso, mock o instancia, usemos la definición apropiada. . Luego, escribimos nuestra(s) prueba(s):
interface IPost { title: string text: string author: string } const findPosts = (posts: IPost[]) => { expect(posts).to.be.an('array') expect(posts).to.have.length.of.at.least(1) posts.forEach((post: IPost) => { expect(post).to.have.property('title') expect(post).to.have.property('text') expect(post).to.have.property('author') }) } describe("Testing Prisma", () => { it("should works to find many posts", function () { cy.task("findMany", {model: 'post', query: {}}) .then((result: any) => findPosts(result)); }); });
En mi caso, me interesa evaluar el formato de respuesta que me entrega Prisma mediante findMany, lo que me permite evaluar la siguiente estructura de esquema:
model Post { id Int @id @default(autoincrement()) title String text String author String createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @@map("post") }
El sistema de comentarios esta roto, poprque a 6 personas les parecio util este aporte, nos lo muestra a todos en primer lugar, deberiamos tener un dislike o un ocultar. Para mi, que en estas lecciones se hagan "aportes" que son mas avanzados o incluyen tecnologias o lenguajes que no se vieron en el curso. Confunden y bloquean, no suman. Saludos
Yo siempre refuerzo, lo visto en el video con los comentarios que se tienen y en verdad un 99% aportan algo a lo aprendido, en este caso tendre que concordar con el compa @damsorian.
pero sigan comentando ayuda mucho.... espero algun dia tb dar aportes como los suyos.
Si no utilizan recurrentemente MySql, es posible se encuentren con errores varios de configuración. Uno de ellos, y según mi experiencia el más recurrente al inicio, es: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", para corregirslo, solo ejecuten la siguiente query : " ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; " en donde deben reemplazar 'password' por la contraseña a usar en las pruebas.
Hola, me gustaria que muestrne como configurar la base de datos desde 0 ya que si bien yo tengo el concepto de base de datos es importante que se muestre todo el ciclo de configuración en cypress. Además, recordar que la versión de cypress del curso está desactualizada y debo realizar mucho esfuerzo para poder ver todos los cambios en la nueva versión. El curso de UI me sirvió, pero así con BE no puedo! Me gustaría un poco más de detalle en este sentido.
Lo mismo digo, existen vacios al momento de la explicación de nuevos temas.
Estuve siguiendo el curso pero usando la version 12 de Cypress. Varias cosas cambian entre esta versión y la que se usó en el curso pero los comentarios de los compañeros fueron de mucha ayuda :)
Para las clases que requieren mongodb y mysql utilicé Docker, en el readme dejé algunos comentarios de como crear los contenedores.
¿Saben como se configura el plugin de base de datos en el cypress versión 10?
hola es casi lo mismo , solo que se hace desde el config dentro de la propiedad setupNodeEvents
mi codigo:
Así seria la conexión mssql + cypress 15: Espero les sirva:
npm install mssql --save-dev
/////////////////////CONNECTION SQL SERVER/////////////////////////////////////////
//cypress.config.js
const { defineConfig } = require('cypress');
const sql = require('mssql');
async function queryTestDB(query, dbConfig) {
try {
const pool = await sql.connect({
server: dbConfig.server,
port: dbConfig.port,
database: dbConfig.database,
user: dbConfig.user,
password: dbConfig.password,
encrypt: dbConfig.encrypt,
trustServerCertificate: dbConfig.trustServerCertificate,
});
const result = await pool.request().query(query);
console.dir(result);
await sql.close();
return result;
} catch (err) {
throw new Error(Error executing query "${query}": ${err});
}
}
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
// Leemos las credenciales desde config.env
const dbConfig = config.env.testing;
on('task', {
queryDB: (query) => queryTestDB(query, dbConfig),
});
return config;
},
},
});
//cypress.env.json
{
"testing": {
"server": "xxx.x.x.x",
"port": XXXXX,
"database": "xxx",
"user": "xxxxx",
"password": "xxxxxxxxxxx",
"encrypt": true,
"trustServerCertificate": true
}
}
¿Lo de la función que se crea para conectarse en la base de datos, se escribe en el archivo de cypress.config.js para cypress 10?
¿El archivo de cyress.env.json funciona en cypress 10?
asi es es lo mismo :) en el curso avanzado de cypress lo explicare estate atento
Como seria esta estructura en Cypress 10?
Hey esto te puede servir https://docs.cypress.io/guides/references/migration-guide
Si no quieren descargar bases de datos en su pc pueden crear y usar una online gratis desde
Pueden usar el codigo de mi repo funcionando en 2025 con cypress version 14
Solo tengan en cuenta que deberan agregar su ip como conexion segura a su base de datos de google cloud, pero es full facil usando su interfaz online.
David101111101/cypress-backend-automation at MySQL
No olviden agregar en las credenciales para conectarse a la base de datos mysql el "port" = "XXXX" en mi caso uso un puerto diferente al 3306 y daba un AggregatedError a la hora de correr la prueba
En el archivo cypress.config.js
¡Hola!
La razón de que no carga las variables de entorno es porque el config del callback setNodeEvents está vacío.
¿Saben por qué?