Skip to content
NeuralSkills
Pruebas

Estratega de Tests de Base de Datos

Testea operaciones de base de datos de forma confiable — migraciones, transacciones, constraints e integridad de datos.

Intermedio Gratis Publicado: 15 de abril de 2026
Herramientas Compatibles claude-codechatgptgeminicopilotcursorwindsurfuniversal

El Problema

Los tests de base de datos son los mas dificiles de hacer bien. Los tests se contaminan con datos compartidos, las transacciones se filtran, las migraciones corren en orden equivocado y las bases de test se desincronizan del schema de produccion. Una estrategia solida aisla tests, verifica constraints y corre suficientemente rapido para CI.

El Prompt

Disena una estrategia de testing de base de datos para mi aplicacion. Necesito tests que verifiquen comportamiento real de la base de datos sin ser lentos o fragiles.

BASE DE DATOS: [PostgreSQL / MySQL / MongoDB / SQLite]
ORM/CAPA DE QUERIES: [Prisma / TypeORM / Drizzle / Knex / raw SQL]
SCHEMA: [pega tu schema/migraciones]

Genera:

1. **Setup de Base de Datos de Test** — Base aislada, aislamiento por transaccion, estrategia de seed data
2. **Tests de Migracion** — Verificar migraciones forward y rollback
3. **Tests de Constraints** — Unique, Foreign Key, NOT NULL, Check
4. **Tests de Queries** — Queries complejos, joins, filtros, paginacion
5. **Tests de Concurrencia** — Updates paralelos, optimistic locking, deadlocks

Ejemplo de Salida

describe('Operaciones de base de datos de usuario', () => {
  beforeEach(async () => { await db.query('BEGIN'); });
  afterEach(async () => { await db.query('ROLLBACK'); });

  it('debe aplicar constraint de email unico', async () => {
    await createUser({ email: 'tomado@test.com' });
    await expect(createUser({ email: 'tomado@test.com' }))
      .rejects.toThrow(/unique constraint/i);
  });

  it('debe eliminar ordenes en cascada cuando se elimina usuario', async () => {
    const user = await createUser({ email: 'eliminar@test.com' });
    await createOrder({ userId: user.id });
    await deleteUser(user.id);
    const orders = await db.query('SELECT * FROM orders WHERE user_id = $1', [user.id]);
    expect(orders.rows).toHaveLength(0);
  });
});

Cuando Usar

Cuando tu aplicacion depende de queries complejos de base de datos, cuando tienes constraints que necesitan verificacion, o al configurar un proyecto nuevo con capa de base de datos.

Tips Pro

  • Rollback de transaccion es el aislamiento mas rapido — envolver cada test en una transaccion y hacer rollback.
  • Testear con volumenes realistas — un query que funciona con 10 filas puede fallar con 10,000.
  • Usar testcontainers para bases de datos reales — SQLite no es PostgreSQL. Testear contra el mismo motor que usas en produccion.
  • Versionar tus seed data — mantener scripts de seed data junto a las migraciones.