Pruebas Metodología
137 pruebas end-to-end validan que cada consulta SQL generada coincide exactamente con la salida de Prisma
Cómo validamos la corrección
Cada prueba sigue un proceso riguroso de 5 pasos para asegurar que el SQL generado produce resultados idénticos a Prisma
Generar SQL desde una consulta Prisma
Parsea los argumentos de la consulta Prisma y genera SQL equivalente usando los mismos modelos y esquema. El SQL generado usa consultas parametrizadas para seguridad y rendimiento.
Ejecutar ambas consultas en paralelo
Ejecuta el SQL generado directamente con postgres.js o better-sqlite3, y ejecuta la misma consulta a través de Prisma. Ambas consultan el mismo estado de la base de datos.
Normalizar resultados
Maneja diferencias de tipos (BigInt vs Number, precisión Decimal, serialización de Date) y normaliza el orden de claves de objetos para una comparación justa.
Comprobación de igualdad profunda
Verifica que los resultados coinciden exactamente: mismo número de filas, mismos valores de campos, mismas relaciones anidadas, mismo orden. Cualquier diferencia falla la prueba.
Benchmark de rendimiento
Mide el tiempo de ejecución con 5 ejecuciones de calentamiento y luego promedia 10-50 iteraciones por prueba. Compara contra Prisma v6, Prisma v7 y Drizzle ORM.
Técnicas avanzadas de validación
Normalización de tipos de datos
- • Conversión BigInt: BigInt de JavaScript → Number para comparación
- • Manejo de Decimal: Decimal de Prisma → Float con precisión de 10 dígitos
- • Normalización de fechas: Todos los valores DateTime → null (enfoque en datos, no timestamps)
- • Parseo JSON: Detección automática y parseo de strings JSON
- • Ordenación de claves: Orden alfabético para comparación consistente
Benchmarking de rendimiento
- • Fase de calentamiento: 5 iteraciones para preparar caches y JIT
- • Iteraciones adaptativas: 5-50 ejecuciones según complejidad de la consulta
- • Medición aislada: Cada tipo de consulta se mide de forma independiente
- • Comparación multi-ORM: Prisma v6, v7, Drizzle, SQL generado
- • Tiempo de generación de SQL: Medición separada de la sobrecarga de generación de consultas
Cobertura de pruebas integral
Las pruebas cubren cada operación de lectura de Prisma en múltiples niveles de complejidad
Operaciones de consulta
- findMany con filtros complejos
- findFirst con skip y paginación
- findUnique por ID y campos únicos
- count con condiciones WHERE
- aggregate (sum, avg, min, max)
- groupBy con cláusulas HAVING
Escenarios complejos
- Includes anidados (4 niveles de profundidad)
- Filtros de relación (some/every/none)
- Distinct con funciones de ventana
- Paginación con cursor
- Select + include combinados
- Conteos de relación (_count)
Tipos de filtro
- Comparación (lt/lte/gt/gte)
- Lógicos (AND/OR/NOT)
- Operaciones de string (contains/startsWith)
- Comprobaciones NULL (is/isNot)
- IN/NOT IN con arrays
- Modos de sensibilidad a mayúsculas/minúsculas
Pruebas en PostgreSQL
- ✓ Búsquedas case-insensitive con ILIKE
- ✓ Operaciones JSON/JSONB
- ✓ Manejo de campos array
- ✓ Soporte para tipos compuestos
- ✓ Validación de funciones de ventana
- ✓ Pruebas de aislamiento de transacciones
Pruebas en SQLite
- ✓ Coincidencia de patrones LIKE
- ✓ Validación de la extensión JSON1
- ✓ Emulación de funciones de ventana
- ✓ Optimización DISTINCT
- ✓ Correlación de subconsultas
- ✓ Manejo de afinidad de texto
Ejemplo de caso de prueba
Mira cómo validamos una consulta anidada compleja con filtros de relación
it('nested relation filter', () =>
runParityTest(
db,
benchmarkResults,
'findMany nested relation',
'Organization',
{
method: 'findMany',
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
}
},
() => db.prisma.organization.findMany({
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
},
orderBy: { id: 'asc' }
}),
)
)
// runParityTest internally:
// 1. Calls generateSQL() with the args
// 2. Executes generated SQL directly
// 3. Executes Prisma query
// 4. Normalizes both results
// 5. Deep equality check - fails if any difference
// 6. Benchmarks execution time Qué ocurre durante la ejecución de las pruebas
1. Generación de consulta (microsegundos)
La función generateSQL() parsea los args de Prisma y crea SQL parametrizado. Este paso se mide por separado para medir la sobrecarga de generación.
2. Ejecución paralela (milisegundos)
Ambas consultas alcanzan el mismo estado de base de datos simultáneamente usando Promise.all(), garantizando comparación justa y condiciones de datos idénticas.
3. Normalización profunda
Los resultados pasan por normalización recursiva: BigInt→Number, Decimal→Float(10), Date→null, parseo JSON, ordenación de claves. Esto asegura comparación byte a byte.
4. Igualdad estricta
Comparación por JSON stringify con tolerancia cero. Cualquier diferencia en número de filas, valores de campos, objetos anidados u orden falla la prueba con un diff detallado.
5. Medición de rendimiento
Tras la validación, 5-50 iteraciones miden el tiempo medio de ejecución. Los resultados incluyen: Prisma v6, Prisma v7, Drizzle ORM, SQL generado y sobrecarga de generación de SQL.
Validación multi-versión
Cada prueba se ejecuta contra Prisma v6 y v7 para asegurar compatibilidad entre versiones:
Prisma v6 (6.16.3)
- • Uso directo de PrismaClient
- • Arquitectura legacy del engine
- • Métricas base de rendimiento
Prisma v7 (7.2.0)
- • Arquitectura basada en adapters
- • @prisma/adapter-pg y adapter-better-sqlite3
- • Nuevas optimizaciones del engine
Reportes automáticos de benchmarks
Todos los resultados de benchmarks se generan automáticamente y se guardan como archivos JSON para transparencia total:
benchmark-results/v6-postgres-latest.json benchmark-results/v7-postgres-latest.json benchmark-results/v6-sqlite-latest.json benchmark-results/v7-sqlite-latest.json Cada archivo contiene: nombre de prueba, tiempo de ejecución Prisma, tiempo de SQL generado, tiempo de Drizzle, ratios de aceleración y timestamp ISO.
Explora la suite completa de pruebas
Las 137 pruebas son open source. Revisa el código de pruebas, benchmarks y la lógica de validación.