Testing de bases de datos es probar la capa de datos del sistema —las consultas, el esquema (tablas, columnas, restricciones), los procedimientos almacenados, la integridad— y no solo la interfaz que ve el usuario. Es necesario porque la aplicación puede verse perfecta y aun así corromper datos en silencio: una consulta que redondea mal, un JOIN que duplica filas, una restricción que falta y deja entrar datos inválidos, un procedimiento que actualiza de más. Esos errores no siempre se notan en la pantalla, pero envenenan lo más valioso del sistema: los datos. Qué validar, por niveles: en las consultas, que devuelvan exactamente los datos correctos ante casos normales y límite; en el esquema, que las restricciones (claves, unicidad, no nulos) hagan cumplir las reglas; en los procedimientos y disparadores, que su lógica produzca el estado esperado; y en la integridad, que no queden datos huérfanos ni inconsistentes. Dos prácticas son la clave del testing de datos fiable: partir de un estado conocido (datos de prueba controlados, no la base de producción) y dejar la base limpia después de cada prueba (revirtiendo cambios con una transacción, o recreando el estado), para que las pruebas no se contaminen entre sí. Se automatiza con marcos que corren dentro de la propia base de datos o desde el código de la aplicación.
Ver índice de contenidos
Por qué probar la base de datos
Es tentador pensar que si la aplicación «se ve bien» al probarla por la interfaz, la base de datos también está bien. No es así. Muchos errores de datos son silenciosos: la pantalla muestra algo plausible, pero por debajo un cálculo se hizo mal, una fila se duplicó, o un dato inválido entró porque faltaba una restricción. Y como los datos son lo más valioso e irreemplazable de un sistema, un error ahí es de los más caros.
La interfaz miente por omisión
Probar solo por la interfaz tiene un punto ciego: solo ves lo que la interfaz muestra. Si una consulta devuelve un total mal calculado pero con el formato correcto, se ve bien; si un JOIN duplica filas pero la interfaz muestra solo la primera, se ve bien; si un dato corrupto se guardó pero nadie lo consulta todavía, se ve bien —hasta que explota más tarde—. El testing de base de datos mira directamente los datos, no su reflejo en la pantalla.
Qué validar en cada nivel
El testing de base de datos cubre cuatro frentes:
- Consultas. Que devuelvan exactamente los datos correctos: cálculos y agregaciones bien hechos, JOIN que no dupliquen ni pierdan filas, filtros que seleccionen lo que deben, y buen manejo de casos límite y valores vacíos.
- Esquema. Que las restricciones rechacen lo que deben: claves, unicidad, no nulos y validaciones impiden datos inválidos. Se prueba intentando meter datos malos y verificando que la base los rechaza.
- Procedimientos y disparadores. Que su lógica deje el estado esperado, incluidos los casos de error.
- Integridad. Que el conjunto sea coherente: nada huérfano, sin inconsistencias entre tablas relacionadas.
Datos de prueba y limpieza
Aquí está lo que separa el testing de datos fiable del que da resultados erráticos. Dos prácticas son innegociables:
Primero: partí de un estado conocido. Una prueba que verifica «hay 3 clientes activos» solo tiene sentido si vos pusiste esos 3 clientes; nunca se prueba contra la base de producción (ni sus datos reales, por privacidad y por imprevisibilidad). Se usan datos de prueba controlados. Segundo: dejá la base limpia después de cada prueba. Si una prueba inserta datos y no los revierte, la siguiente hereda ese estado y los resultados dependen del orden de ejecución —el peor tipo de test frágil—. La técnica más limpia es envolver cada prueba en una transacción y hacer rollback al final: los cambios nunca se confirman y la base vuelve sola al estado inicial.
Para automatizar, hay dos enfoques: marcos que corren dentro de la propia base de datos (escribís las pruebas en SQL, útiles para procedimientos y restricciones) y pruebas desde el código de la aplicación (que preparan datos, ejecutan la operación y verifican el resultado, encajando como pruebas de integración). Ambos se integran en la automatización continua.
Errores frecuentes
- Suponer que si la interfaz se ve bien, los datos están bien. Muchos errores de datos son silenciosos; mirar los datos directamente.
- Probar contra la base de producción. Riesgo de privacidad y de resultados imprevisibles; usar datos de prueba controlados.
- No limpiar entre pruebas. Los datos que quedan contaminan las pruebas siguientes; revertir con transacción o recrear.
- Depender del orden de ejecución. Cada prueba debe partir de un estado conocido por sí misma, no del que dejó otra.
- Probar solo el «camino feliz» de las consultas. Faltan casos límite, valores vacíos y datos que deberían rechazarse.
- No probar las restricciones. Que existan no garantiza que funcionen; intentar meter datos malos y verificar el rechazo.
- Olvidar los procedimientos y disparadores. Contienen lógica que también falla; probarlos con varias entradas.
Preguntas frecuentes
¿Por qué hay que probar la base de datos además de la aplicación?
Hay que probar la base de datos además de la aplicación porque probar únicamente a través de la interfaz de usuario deja un punto ciego importante: solo se comprueba lo que la interfaz muestra, no lo que realmente ocurre con los datos por debajo. Muchos errores de la capa de datos son silenciosos, en el sentido de que no producen ningún síntoma visible en la pantalla en el momento en que se cometen, pero corrompen o degradan los datos de forma que tarde o temprano causa problemas. Por ejemplo, una consulta puede calcular mal un total pero devolverlo con el formato correcto, de modo que en pantalla se ve un número plausible aunque esté equivocado; una unión entre tablas mal planteada puede duplicar filas sin que se note si la interfaz solo muestra un resumen; una restricción que falta puede permitir que entre un dato inválido o inconsistente que nadie advierte hasta que otra parte del sistema tropieza con él; o un procedimiento almacenado puede actualizar más registros de los debidos. Todos estos son fallos que una prueba centrada en la interfaz difícilmente detecta, porque la interfaz miente por omisión: enseña una versión parcial y presentable de un estado que puede estar dañado. Dado que los datos son casi siempre el activo más valioso e irreemplazable de un sistema, ya que el código y la infraestructura se pueden reconstruir pero los datos de los usuarios no, un error en la capa de datos es de los más costosos que existen. Por eso el testing de base de datos mira directamente los datos, las consultas, el esquema y la lógica que vive en la propia base, en lugar de conformarse con su reflejo en la pantalla, y constituye una capa de protección esencial para la integridad de la información.
¿Qué se valida al probar consultas?
Al probar consultas, lo que se valida es que devuelvan exactamente los datos correctos en todas las situaciones relevantes, y no solo en el caso más sencillo. Esto abarca varios aspectos. En primer lugar, se comprueba que los cálculos y las agregaciones que realiza la consulta, como sumas, promedios, conteos y agrupaciones, produzcan el resultado matemáticamente correcto, ya que un error sutil en un cálculo puede pasar inadvertido en pantalla pero falsear informes y decisiones. En segundo lugar, se verifica que las uniones entre tablas se comporten como corresponde, sin duplicar filas por una relación de uno a muchos mal manejada ni perder filas que deberían aparecer, algo especialmente delicado porque las uniones son una fuente clásica de resultados engañosos. En tercer lugar, se valida que los filtros seleccionen justo el conjunto de registros que deben, ni de más ni de menos, comprobando las condiciones con distintos valores. En cuarto lugar, y muy importante, se prueban los casos límite y especiales, como conjuntos de datos vacíos, valores en los extremos de los rangos, y el manejo de los valores nulos que representan la ausencia de dato, ya que estos casos son donde más frecuentemente fallan las consultas y donde el comportamiento por defecto puede sorprender. Para probar todo esto de forma fiable, se parte de un conjunto de datos de prueba conocido y controlado, de manera que se sepa de antemano cuál debe ser el resultado exacto de cada consulta y se pueda comparar con lo que realmente devuelve. En conjunto, probar consultas consiste en tratar cada consulta como una función que, ante unas entradas conocidas, debe producir una salida exacta, y verificar rigurosamente que así sea tanto en los casos normales como en los límite.
¿Cómo se prueban las restricciones del esquema?
Las restricciones del esquema, como las claves primarias y foráneas, las restricciones de unicidad, las de no nulo y otras reglas de validación, se prueban de una manera que resulta un poco contraintuitiva al principio: en lugar de comprobar que la base acepta los datos correctos, se comprueba sobre todo que rechaza los datos incorrectos. La idea es que el valor de una restricción está precisamente en impedir que entren datos inválidos o inconsistentes, de modo que la prueba consiste en intentar deliberadamente introducir esos datos malos y verificar que la base de datos los rechaza como debe. Por ejemplo, para probar una restricción de unicidad, se intenta insertar dos registros con el mismo valor en la columna que debe ser única y se verifica que el segundo es rechazado; para probar una restricción de no nulo, se intenta insertar un registro dejando vacío ese campo y se comprueba que la operación falla; para probar una clave foránea, se intenta crear un registro que apunte a otro inexistente y se verifica que la base lo impide; y para probar una regla de validación, se intenta guardar un valor fuera del rango o formato permitido y se confirma que no se acepta. Este enfoque es importante porque el mero hecho de que una restricción esté definida en el esquema no garantiza que funcione como se espera en todos los casos, ni que no haya sido debilitada o mal configurada, y tampoco garantiza que la aplicación no tenga alguna vía por la que se salten esas comprobaciones. Probar las restricciones intentando violarlas confirma que la última línea de defensa de la integridad de los datos, que reside en la propia base de datos, está efectivamente activa y hace su trabajo, lo cual es especialmente valioso porque esa defensa protege los datos incluso frente a errores de la aplicación o accesos por vías inesperadas.
¿Por qué no debo probar contra la base de datos de producción?
No se debe probar contra la base de datos de producción por dos razones fundamentales, una de riesgo y otra de fiabilidad. La razón de riesgo es que las pruebas suelen crear, modificar y borrar datos, y hacerlo sobre la base real, la que usan los usuarios y contiene su información, puede corromper o destruir datos valiosos, generar registros falsos, disparar procesos reales indeseados como envíos de correos o cobros, y en general provocar daños difíciles o imposibles de revertir. A esto se suma una cuestión de privacidad y cumplimiento normativo muy seria: los datos de producción suelen contener información personal y sensible de personas reales, y usarlos para pruebas los expone innecesariamente y puede vulnerar la normativa de protección de datos, por lo que incluso copiarlos a un entorno de pruebas requiere, como mínimo, anonimizarlos o enmascararlos adecuadamente. La razón de fiabilidad es que la base de producción es un blanco móvil e impredecible: sus datos cambian constantemente por la actividad de los usuarios, de modo que una prueba que hoy espera encontrar cierto número de registros o cierto valor puede fallar mañana no porque haya un bug, sino porque los datos cambiaron, generando resultados erráticos y falsos positivos o negativos que erosionan la confianza en las pruebas. El testing fiable requiere partir de un estado conocido y reproducible, con datos de prueba controlados que uno mismo prepara y cuyos resultados esperados conoce de antemano. Por todo ello, la práctica correcta es usar un entorno de pruebas dedicado, con una base de datos poblada con datos de prueba diseñados para los casos que se quieren cubrir, aislada de la de producción, y dejar la base de producción exclusivamente para el uso real, protegida de cualquier operación de prueba.
¿Cómo dejo la base de datos limpia entre pruebas?
Dejar la base de datos limpia entre pruebas, es decir, asegurarse de que cada prueba parte del mismo estado conocido y no se ve afectada por lo que hicieron las pruebas anteriores, es una de las claves para tener un testing de datos fiable y no frágil, y existen varias técnicas para lograrlo. La más elegante y recomendada, cuando es aplicable, consiste en envolver cada prueba en una transacción y, al terminar la prueba, en lugar de confirmar los cambios, revertirlos con una operación de deshacer. De este modo, todo lo que la prueba insertó, modificó o borró se anula al final, y la base de datos vuelve automáticamente al estado exacto en que estaba antes de la prueba, sin que los cambios lleguen siquiera a hacerse permanentes; esta técnica es rápida y muy limpia, ya que no requiere borrar nada manualmente. Una segunda técnica es recrear el estado inicial antes de cada prueba, ya sea vaciando y volviendo a poblar las tablas con el conjunto de datos de prueba conocido, o incluso recreando la base de datos desde cero a partir de un esquema y unos datos semilla; es más lenta pero garantiza un punto de partida idéntico y sirve incluso cuando la prueba necesita que los cambios se confirmen. Una tercera opción es que cada prueba limpie explícitamente lo que creó al terminar, aunque esta es la más propensa a errores, porque es fácil olvidar borrar algo o hacerlo en el orden equivocado por las dependencias entre tablas. El principio de fondo, cualquiera que sea la técnica, es que ninguna prueba debe depender del estado que dejó otra ni del orden en que se ejecutan las pruebas, porque esa dependencia produce el peor tipo de fragilidad, en la que las pruebas pasan o fallan según qué otras corrieron antes. Garantizar el aislamiento y la limpieza entre pruebas es lo que hace que los resultados sean reproducibles y dignos de confianza.
¿Con qué herramientas se automatiza el testing de bases de datos?
El testing de bases de datos se puede automatizar mediante dos grandes enfoques, a menudo complementarios, cada uno con sus herramientas características. El primer enfoque consiste en escribir las pruebas dentro de la propia base de datos, usando marcos de pruebas específicos para cada motor que permiten expresar las verificaciones en el lenguaje de la base, es decir, en SQL o en su lenguaje de procedimientos. Estos marcos son especialmente útiles para probar objetos que viven dentro de la base, como los procedimientos almacenados, las funciones, los disparadores y las restricciones, porque las pruebas se ejecutan en el mismo entorno que el código que verifican y pueden comprobar directamente el comportamiento de esos objetos, incluyendo a menudo mecanismos para preparar datos y revertir los cambios al final de cada prueba. El segundo enfoque consiste en probar la base de datos desde el código de la aplicación, escribiendo pruebas en el mismo lenguaje de programación del proyecto que se conectan a una base de datos de prueba, preparan un estado conocido, ejecutan las operaciones o consultas que se quieren verificar, y comprueban que el resultado y el estado de los datos son los esperados; estas pruebas encajan de forma natural como pruebas de integración, ya que verifican la interacción real entre el código y la base de datos. Ambos enfoques se integran en los procesos de automatización continua, de modo que las pruebas de base de datos se ejecutan automáticamente ante cada cambio, junto con el resto de la suite, alertando enseguida si una modificación rompe una consulta, una restricción o un procedimiento. La elección entre uno y otro, o su combinación, depende de qué se quiera probar y de las prácticas del equipo, pero en cualquier caso lo importante es que las pruebas de datos partan de un estado controlado, dejen la base limpia y se ejecuten de forma repetible, para que su automatización aporte confianza real y no falsos resultados.
Fuentes
Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 28 de julio de 2026.
Aportes de la comunidad Underc0de
- Underc0de, foro. Sección Bases de datos. Validación y calidad de datos.
- Underc0de, foro. Sección Desarrollo web. Testing de aplicaciones.
Documentación oficial
- PostgreSQL. Regression Tests. Cómo se prueban las consultas y el motor.
- Martin Fowler. Evolutionary Database Design. Pruebas y migraciones de base de datos.
- MySQL. Consultas SELECT. Referencia de las consultas a validar.
- tSQLt / pgTAP. pgTAP. Marco de pruebas dentro de la propia base de datos.