No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Consultas SQL: Insert, Select y Delete en Base de Datos

12/17
Recursos

¿Cómo realizamos inserciones en bases de datos con Cypress?

Comenzar a trabajar con bases de datos desde Cypress puede parecer una tarea desalentadora, pero en realidad, con las herramientas correctas y un poco de práctica, es un proceso bastante sencillo. En este caso, nos enfocaremos en cómo realizar inserciones en una base de datos como parte de nuestras pruebas automatizadas.

Para realizar un insert, utilizamos la sintaxis SQL estándar:

insert into pruebas (nombre, apellido_paterno, apellido_materno) values ("Javier", "Fuentes", "Mora");
  • Insertar datos: Esta instrucción inserta un nuevo registro en la tabla pruebas.
  • Visualizar resultados: Al ejecutar el comando, podemos visualizar que el registro ha sido insertado correctamente.

Además, es importante validar que la inserción se realizó de manera correcta. En este caso, al ejecutar el insert, verificamos que solo una fila fue afectada:

expect(result.affectedRows).to.equal(1);

¿Cómo podemos realizar consultas con condiciones?

Posteriormente, podemos validar nuestra inserción mediante un SELECT usando un filtro por el ID generado. Esto se logra con la instrucción WHERE en SQL:

SELECT * FROM pruebas WHERE ID = ${this.ID};

Al ejecutar esta consulta, obtenemos únicamente el registro que acabamos de insertar. Una vez obtenida esta información, es posible realizar aserciones para comprobar que los datos obtenidos coinciden con los valores insertados:

expect(result[0].nombre).to.equal("Javier");

Es vital recordar que, para permitir el uso de variables de contexto como this.ID, no debemos usar funciones tipo flecha, sino funciones normales para preservar el contexto.

¿Cómo eliminamos registros específicos y limpiamos nuestra base de datos?

Una vez finalizadas nuestras pruebas, es común eliminar los datos de prueba. Esto puede lograrse mediante un DELETE condicionado a un ID específico:

DELETE FROM pruebas WHERE ID = ${this.ID};

Al igual que con el insert, es importante verificar que solo un registro fue eliminado:

expect(result.affectedRows).to.equal(1);

Para asegurar que la base de datos quede limpia después de todas las pruebas, podemos utilizar el hook de after para eliminar todos los registros:

after(() => {
  cy.task('queryDB', 'DELETE FROM pruebas');
});

Al ejecutar este comando, nos aseguramos que nuestra tabla pruebas esté vacía para las futuras pruebas. Sin embargo, esto debe usarse con cautela para evitar eliminar datos de producción por error.

Este ciclo de operaciones: inserción, selección, eliminación y limpieza, es fundamental para gestionar pruebas automatizadas en bases de datos SQL, asegurando consistencia y el correcto funcionamiento de las pruebas.

Aportes 3

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Probando DB por instancia

.
Tomando como inspiración 🔗 Pruebas de integración de Prisma ORM. Podemos genera una instancia de docker para nuestro propósito o, en cuyo caso, automatizar la conexión para que apunte a una base de datos alternativa.
.

Nota. Evitar lanzar pruebas unitarias directas a la base de datos, para ello generar mocks de la capa o, en su defecto, descentralizar su uso por entorno.

.
De la sesión anterior, podemos retomar la configuración de Cypress en su archivo de configuración cypress.config:

import {defineConfig} from 'cypress'
import Prisma from './src/libs/Prisma'

export default defineConfig({
    e2e: {
        baseUrl: 'URL',
        setupNodeEvents(on, _) {
            on('task', {
                create: async ({model, query}) => {
                    const client = new Prisma(model)
                    return await client.create(query)
                },
                findUnique: async ({model, query}) => {
                    const client = new Prisma(model)
                    return await client.findUnique(query)
                },
                deleteMany: async ({model, query}) => {
                    const client = new Prisma(model)
                    return await client.deleteMany(query)
                }
            })
        }
    }
})

En ella, generamos diferentes proceso que utilizaremos en nuestra prueba.
.
Como estaremos ejecutando y limpiando nuestra base de datos o mediante la recreación de instancia utilizamos el comando exec para levantar y eliminar una instancia.
.
Para ello, ocuparemos los hooks before (antes que todas las pruebas una vez) y after (después que todas las pruebas una vez).

interface IPost {
    title: string
    text: string
    author: string
}

const postSchema = (post: IPost) => {
    expect(post).to.be.an('object')
    expect(post).to.have.property('title')
    expect(post).to.have.property('text')
    expect(post).to.have.property('author')
}

describe("Testing Prisma", () => {
    before(function () {
        cy.fixture('post').then((post) => this.post = post)
    })
    after(function () {
        cy.task("deleteMany", {model: 'post', query: {}})
    })

    it("should create a post", function () {
        cy.task("create", {model: 'post', query: {data: this.post}})
            .then((result: any) => postSchema(result));
    });

    it("should find a posts", function () {
        cy.task("findUnique", {model: 'post', query: {where: {id: 1}}})
            .then((result: any) => postSchema(result));
    });
});

De aquí, considere apuntar a otra base de datos o levantar una instancia de base de datos mediante Docker

Si usan un ID único, recuerden hacerlo auto incrementable en la BDD, en caso contrario deberán añadir como parámetro el ID y su respectivo valor.

it(“Actualizar para comprobar”, function () {
cy.task(“queryDb”, UPDATE Usuario.usuarios Set nombre='Elizabeth', Apellidos='Romero', Edad=30, Celular=986346544 WHERE idusuarios= ${this.ID}).then((result) => {
cy.log(result)
expect(result.affectedRows).to.eq(1)
});
});