Saltar al contenido principal

Guía completa de pruebas dbt para garantizar la calidad de los datos

Conoce las distintas pruebas posibles en dbt para comprobar y garantizar la calidad de los datos.
Actualizado 2 jul 2025  · 11 min de lectura

dbt está ganando popularidad en el campo de la analítica por sus funciones de transformación y comprobación de datos. En este artículo, compartiremos qué es el dbt y cómo puedes realizar algunas pruebas de dbt para garantizar la calidad de los datos. Si estás empezando con el dbt, no dejes de consultar nuestro curso Introducción al dbt para aprender más. 

¿Qué es la dbt?

Como exploramos en nuestra guía separada, dbt (data build tool) es una popular herramienta de código abierto utilizada por los equipos de datos para transformar los datos brutos de su almacén en conjuntos de datos limpios, probados, documentados y listos para el análisis. 

A diferencia de las herramientas ETL, dbt se centra únicamente en el componente "T" (Transformación) de la canalización de datos y funciona sobre modernos almacenes de datos en la nube como BigQuery, Snowflake, Redshift y Databricks.

Una de las características más potentes de dbt es su marco de pruebas de datos incorporado, que permite a los profesionales de los datos escribir pruebas que validen las suposiciones sobre sus datos. Este marco de pruebas no sólo es útil para detectar problemas en una fase temprana, sino que también es crucial para mantener la calidad de los datos y la confianza en una base de código analítico modular y en crecimiento.

¿Por qué probar en dbt?

Las pruebas son una parte fundamental de la ingeniería analítica. A medida que crecen los conjuntos de datos y más partes interesadas dependen de ellos, aumenta el coste de los problemas de datos no detectados. las capacidades de comprobación de dbt te ayudan:

  • Detecta los problemas con los datos en una fase temprana: Antes de que se vean afectados los cuadros de mando e informes posteriores.
  • Automatiza los controles de calidad: Evita el trabajo de validación manual.
  • Fomentar buenas prácticas de modelado de datos: Promover transformaciones modulares y comprobables.
  • Apoya las prácticas CI/CD: Intégralo sin problemas en flujos de trabajo automatizados.
  • Haz cumplir los contratos de datos: Validar que las restricciones clave (por ejemplo, que no haya duplicados) se mantienen a lo largo del tiempo.

Tipos de pruebas dbt

En dbt, las pruebas son aserciones basadas en SQL que validan las suposiciones de los datos. Las pruebas en dbt se dividen en dos categorías principales:

1. Pruebas genéricas (incorporadas)

Estas pruebas están predefinidas por dbt y se aplican de forma declarativa en archivos YAML. Las pruebas genéricas cubren las restricciones comunes que suelen encontrarse en el modelado de datos y el almacenamiento de datos. 

Son:

  • Fácil de configurar
  • Reutilizable entre columnas y modelos
  • Alto rendimiento para comprobaciones sencillas

Los cuatro tipos de pruebas genéricas incorporadas son

  • not_null: Asegura que una columna no contiene valores NULL.
  • unique: Garantiza que los valores de una columna sean distintos en todas las filas (se utiliza normalmente para claves primarias).
  • accepted_values: Restringe una columna a un conjunto predefinido de valores permitidos.
  • relationships: Valida la integridad referencial entre tablas, garantizando que las claves externas coincidan con los valores de otra tabla.

Estas pruebas son ideales para reforzar la integridad de los datos básicos, especialmente en torno a claves, campos categóricos y relaciones entre tablas básicas.

Las pruebas genéricas funcionan generando automáticamente SQL bajo el capó. 

Por ejemplo, una prueba de not_null en la columna customer_id generará un SQL similar a:

SELECT *
FROM {{ ref('customers') }}
WHERE customer_id IS NULL

Si esta consulta devuelve alguna fila, la prueba falla.

2. Pruebas personalizadas (singulares)

Las pruebas personalizadas o singulares son consultas SQL definidas por el usuario y guardadas como archivos .sql en el directorio tests/. Se utilizan para:

  • Validaciones complejas que las pruebas genéricas no pueden expresar
  • Aplicación de normas empresariales
  • Lógica entre modelos
  • Umbrales estadísticos o condicionales

Las pruebas singulares ofrecen la máxima flexibilidad. Puedes validar los datos prácticamente de cualquier forma, siempre que tu consulta SQL devuelva sólo las filas que incumplan las expectativas.

Por ejemplo:

  • Garantizar que la fecha de lanzamiento de un producto no sea posterior a su fecha de retirada
  • Detectar valores inusualmente altos o bajos (detección de valores atípicos)
  • Validar que los valores agregados coinciden con los totales empresariales

Debido a su flexibilidad, las pruebas personalizadas son ideales para los equipos analíticos que desean aplicar contratos de calidad de datos matizados en producción.

También se pueden utilizar macros incluidas en dbt para realizar pruebas, como el paquete dbt-utils.

En resumen:

Función

Pruebas genéricas

Pruebas personalizadas (singulares)

Definido en

schema.yml

Archivos .sql en la carpeta tests/

Cobertura

Restricciones comunes (por ejemplo, nulos, claves)

Cualquier lógica expresable en SQL

Complejidad

Simple

Medio a complejo

Reutilización

Alta

Baja (suele ser específica para cada caso)

Flexibilidad

Limitado

Ilimitado (cualquier lógica SQL)

Combinar ambos tipos te da lo mejor de los dos mundos: cierta coherencia y cobertura de las pruebas genéricas, y cierta precisión de las pruebas personalizadas. Exploremos cada tipo con más detalle. 

1. Pruebas genéricas (incorporadas)

Las pruebas genéricas están predefinidas por dbt y se utilizan de forma declarativa añadiéndolas al archivo schema.yml de tu modelo. 

Estas pruebas suelen validar restricciones como la unicidad, la no anulabilidad, la integridad referencial o los valores de un conjunto definido.

Vamos a explorar un sencillo tutorial para probar pruebas genéricas en dbt.

Cómo declarar una prueba genérica

En el archivo schema.yml correspondiente a tu modelo, define las pruebas en la sección columns::

version: 2

models:
  - name: customers
    description: "Customer dimension table"
    columns:
      - name: customer_id
        description: "Unique customer identifier"
        tests:
          - not_null
          - unique
      - name: email
        tests:
          - not_null

Ejemplo: not_null y unique

yaml
columns:
  - name: customer_id
    tests:
      - not_null
      - unique

Esta prueba garantiza que customer_id está presente en todas las filas y es distinta. Se suele utilizar para imponer la suposición de que customer_id es una clave primaria de la tabla.

Ejemplo: valores_aceptados

columns:
  - name: customer_type
    tests:
      - accepted_values:
          values: ['new', 'returning', 'vip']

Esto comprueba que el campo customer_type sólo contiene una de las tres cadenas permitidas: new, returning, o vip. Esta prueba se utiliza a menudo para campos categóricos que deben ajustarse a un conjunto conocido de valores, como enums o estados.

Ejemplo: relaciones

columns:
  - name: customer_id
    tests:
      - relationships:
          to: ref('customers')
          field: id

De este modo se aplica una restricción de integridad referencial al comprobar que cada customer_id del modelo actual existe como id en la tabla customers. Imita una restricción de clave foránea en SQL, pero en la capa de análisis.

2. Pruebas personalizadas (singulares)

Cuando las pruebas incorporadas sean insuficientes para tu caso de uso, por ejemplo, si quieres validar una lógica empresarial compleja, puedes escribir pruebas personalizadas utilizando SQL. Se conocen como pruebas singulares.

Cómo crear una prueba personalizada

1. Crea un archivo .sql dentro del directorio tests/ de tu proyecto dbt.

2. Escribe una consulta SQL que devuelva las filas que no superan la prueba.

Ejemplo: No hay fechas futuras en orders

En la carpeta de pruebas, crea un archivo llamado no_future_dates.sql.

SELECT *
FROM {{ ref('orders') }}
WHERE order_date > current_date

Esta prueba comprueba si algún registro de la tabla orders tiene un order_date en el futuro. Si se devuelven filas, la prueba falla, alertándote de datos no válidos que pueden estar causados por errores de zona horaria, errores ETL o entradas incorrectas del sistema fuente.

Ejemplo: Correos duplicados por región

-- Archivo: tests/duplicate_emails_per_region.sql

SELECT email, region, COUNT(*) as occurrences
FROM {{ ref('customers') }}
GROUP BY email, region
HAVING COUNT(*) > 1

Esta prueba garantiza que cada correo electrónico sea único dentro de una región determinada. Esto podría reflejar una norma empresarial según la cual la misma persona no puede registrarse dos veces en la misma región. Cualquier fila devuelta indica una violación de la calidad de los datos.

Cómo implementar pruebas en dbt

En esta sección se describen los pasos prácticos para implementar, configurar y ejecutar pruebas dbt en tu proyecto y en tus canalizaciones de despliegue.

Paso 1: Configurar dbt

Antes de empezar a escribir pruebas o modelos, necesitas tener dbt instalado y un nuevo proyecto inicializado.

Instrucciones paso a paso:

1. Crea la carpeta del proyecto:

Crea una carpeta en la ubicación que elijas.

2. Navega hasta la carpeta del proyecto:

cd dbt-test-project

3. Crea un entorno virtual Python:

python3 -m venv dbt-env

A continuación, activa el entorno una vez creado.

dbt-venv\Scripts\activate

4. Instalar dbt

pip dbt install

5. Crear carpeta .dbt

mkdir $home\.dbt

6. Inicializar dbt

dbt init

7. Crea el archivo profiles.yml

Crea un nuevo archivo en tu carpeta .dbt con el siguiente contenido:

austi:
  target: dev
  outputs:
    dev:
      type: sqlite
      threads: 1
      database: ./dbt_project.db
      schema: main
      schema_directory: ./schemas
      schemas_and_paths:
        main: ./dbt_project.db

Puedes sustituir "austi" por el nombre de tu perfil de usuario de tu ordenador Windows.

8. Crea el archivo dbt_project.yml

A continuación, tendrás que crear otro archivo de configuración en la carpeta .dbt con el siguiente contenido.

name: dbt_test_project
version: '1.0'
profile: austi

seeds:
  dbt_test_project:
    +quote_columns: false

Una vez más, sustituye "austi" por tu nombre de perfil de usuario.

9. Verifica que el proyecto funciona:

dbt debug

Una vez completada la configuración, estás listo para empezar a crear conjuntos de datos y construir modelos dbt.

Paso 2: Crear el conjunto de datos

Si trabajas sin acceso a un almacén de datos, puedes simular pruebas dbt localmente utilizando archivos CSV y la funcionalidad semilla de dbt.

Instrucciones paso a paso:

1. Crea archivos CSV: Colócalas dentro de una nueva carpeta /seeds de tu proyecto dbt.

Así es como debes nombrarlo:

seeds/customers.csv

customer_id,name,email,customer_type
1,Alice Smith,alice@example.com,new
2,Bob Jones,bob@example.com,returning
3,Carol Lee,carol@example.com,vip
4,David Wu,david@example.com,new

2. Crea otro archivo en el mismo directorio:

Utiliza esta convención de nomenclatura:

seeds/orders.csv

order_id,customer_id,order_date,order_total,order_status
1001,1,2023-12-01,150.00,shipped
1002,2,2023-12-03,200.00,delivered
1003,1,2023-12-05,175.00,cancelled
1004,3,2024-01-01,225.00,pending

3. Crea un archivo de configuración para identificar las semillas:

A continuación, tendrás que crear un archivo de configuración llamado dbt_project.yml.

Pega el siguiente contenido en el archivo config. 

name: dbt_test_project
version: '1.0'
profile: austi

seeds:
  dbt_test_project:
    +quote_columns: false

Cambia el campo profile para que coincida con el nombre de tu perfil de usuario en tu ordenador Windows.

4. Carga los datos de la semilla:

dbt seed

Este comando crea las tablas main.customers y main.orders a partir de los archivos CSV. Estas son las semillas necesarias para sustituir una base de datos.

cargar datos de semillas

Como puedes ver en la imagen anterior, se han encontrado dos semillas y se han cargado.

Paso 3: Ingerir en dbt

Ahora, crearemos modelos de ensayo para transformar y probar tus datos brutos.

Instrucciones paso a paso:

1. Crea modelos de puesta en escena:

Crea una nueva carpeta llamada modelos en la carpeta de tu proyecto. En esa carpeta, crea un archivo llamado stg_customers.sql.

Pega el siguiente código en el archivo:

SELECT
  *
FROM {{ ref('customers') }}

En otro archivo llamado stg_orders.sql, pega el siguiente código:

SELECT
  *
FROM {{ ref('orders') }}

2. Definir pruebas de esquema:

Crea un nuevo archivo en la siguiente ubicación

models/schema.yml

Pega lo siguiente en el archivo

version: 2

models:
  - name: stg_customers
    description: "Customer staging table"
    columns:
      - name: customer_id
        description: "Unique identifier for each customer"
        tests:
          - not_null:
              tags: [critical]
          - unique:
              tags: [critical]

      - name: email
        description: "Email address of the customer"
        tests:
          - not_null

  - name: stg_orders
    description: "Orders staging table"
    columns:
      - name: order_id
        description: "Unique identifier for each order"
        tests:
          - not_null:
              tags: [critical]
          - unique:
              tags: [critical]

      - name: customer_id
        description: "Foreign key to stg_customers"
        tests:
          - not_null:
              tags: [critical]

3. Ejecuta dbt para construir modelos de montaje:

dbt run --select stg_customers stg_orders

Estos modelos de puesta en escena actúan ahora como base para aplicar las pruebas dbt utilizando tus datos sembrados localmente.

Un ejemplo de salida sería:

modelos de montaje de edificios

Paso 4: Crear tu primera prueba

Ahora que tus datos están preparados, vamos a implementar tu primera prueba dbt utilizando el marco de pruebas genérico incorporado.

Instrucciones paso a paso:

1. Abre el archivo schema.yml donde está definido tu modelo de puesta en escena.

2. En la sección columns: de tu modelo, define una prueba como not_null o único.

Ejemplo:

models:

  - name: stg_customers

    columns:

      - name: customer_id

        tests:

          - not_null

          - unique
  1. Ejecuta la prueba utilizando la CLI:
dbt test --select stg_customers

Aquí tienes un resultado esperado:

comprobación de nulos y únicos

Paso 5: Desarrollo de pruebas personalizadas y singulares

Cuando tus necesidades vayan más allá de las pruebas incorporadas, puedes crear pruebas personalizadas utilizando SQL.

Instrucciones paso a paso:

1. Crea un nuevo archivo en la carpeta tests/, por ejemplo: tests/no_future_orders.sql

2. Añade lógica SQL que devuelva la fila que falla s:

SELECT *
FROM {{ ref('stg_orders') }}
WHERE order_date > current_date

3. Ejecuta la prueba:

dbt test --select no_future_orders

Esta prueba fallará si algún pedido tiene valores de fecha_pedido futura.

He aquí un resultado esperado:

prueba de no pedidos futuros

Paso 6: Ejecutar pruebas en pipelines CI/CD

Para garantizar una ejecución coherente de las pruebas, integra las pruebas dbt en tu proceso de desarrollo.

Instrucciones paso a paso:

1. Utiliza etiquetas para priorizar o aislar las pruebas:

Puedes modificar cualquier esquema del modelo para incluir las siguientes etiquetas en este formato:

columns:
  - name: customer_id
    tests:
      - not_null:
          tags: [critical]

2. Realiza pruebas selectivas localmente:

dbt test --select tag:critical

Si las pruebas se ejecutan correctamente, deberías esperar esta salida:

pruebas de etiquetas críticas

3. Configura tu flujo de trabajo CI para ejecutar pruebas dbt automáticamente. Puedes conectarlo a una plataforma CI como GitHub Actions. 

Buenas prácticas para las pruebas dbt

Implantar pruebas dbt con eficacia no consiste sólo en escribirlas; se trata de integrar las pruebas en el ciclo de vida y la cultura de desarrollo de tu equipo. Aquí tienes algunas buenas prácticas para guiarte:

1. Empieza con claves primarias

Aplica siempre las pruebas not_null y unique a las columnas de clave primaria de las tablas de dimensiones y hechos. Estas dos restricciones son la base de las uniones fiables y de la lógica de deduplicación en las consultas posteriores.

2. Validar claves externas con relaciones

Las claves foráneas son fundamentales para mantener la integridad referencial. Utiliza la prueba relationships para imitar las restricciones de clave foránea, especialmente en almacenes de datos que no las aplican de forma nativa.

3. Utiliza accepted_values para columnas categóricas

Controla la coherencia dimensional imponiendo valores específicos en columnas como status, region, o product_type. Esto reduce el riesgo de errores tipográficos o expansiones de enum no controladas.

4. Escribe pruebas personalizadas para la lógica empresarial

La lógica empresarial no siempre se asigna limpiamente a reglas genéricas. Algunos ejemplos de lógica para los que deberías escribir pruebas personalizadas son:

  • Las ventas deben ser no negativas
  • Las fechas de los pedidos no pueden ser futuras
  • Un usuario no puede tener varias suscripciones activas

5. Organiza las pruebas con claridad

Si tienes muchas pruebas establecidas, puede complicarse muy rápidamente. Debes tener en cuenta estas buenas prácticas para mantenerlos organizados:

  • Coloca las pruebas personalizadas en la carpeta tests/ y dales un nombre descriptivo.
  • Evita el SQL demasiado complejo en las pruebas: mantén la lógica centrada y legible.
  • Agrupa las pruebas por modelo o dominio siempre que sea posible.

6. Fracasa rápido e intégrate con CI/CD

Ejecuta dbt test como parte de tu canal CI. Esto garantiza que el código no pueda fusionarse a menos que se superen las restricciones de calidad de los datos. Integrar las pruebas en CI/CD refuerza la responsabilidad y la confianza en la canalización de datos.

7. Evitar el exceso de pruebas

Las pruebas excesivas o innecesarias (sobre todo en grandes volúmenes de datos) pueden ralentizar las implantaciones. Céntrate en pruebas que lo sean:

  • Para empresas críticas
  • Es probable que fracase debido a problemas previos
  • Útil para depurar cuando está roto

Evita probar los campos calculados a menos que formen parte de un SLA contractual.

Ejemplo avanzado: Detección de valores atípicos

Para un ejemplo de prueba avanzada, podemos realizar una prueba de detección de valores atípicos.

Crea un archivo SQL en tu carpeta de pruebas con el siguiente código:

SELECT *
FROM {{ ref('orders') }}
WHERE order_total > 100000

Se trata de una prueba básica de detección de valores atípicos. Si tu empresa suele ver pedidos inferiores a 10.000 $, puedes marcar los pedidos superiores a 100.000 $ para su revisión manual. Aunque no es una violación estricta de la calidad de los datos, puede ser valiosa para la detección del fraude o la supervisión operativa.

Consideraciones sobre el rendimiento

A medida que tu proyecto dbt se amplía y crece la cobertura de las pruebas, el rendimiento se vuelve cada vez más importante. En esta sección se describen técnicas y estrategias para mantener la eficacia de las pruebas y controlar los costes computacionales.

Técnicas de optimización de pruebas

Para las pruebas, prueba estas técnicas para optimizar el rendimiento:

  • Pruebas incrementales: Centra las pruebas sólo en los datos recién añadidos o modificados utilizando la estructura de modelo incremental de dbt. Esto reduce las exploraciones innecesarias sobre conjuntos de datos completos.
  • Paralelización de consultas: Utiliza la ejecución en paralelo integrada en dbt configurando el parámetro threads: en dbt_project.yml para ejecutar varias pruebas simultáneamente.
  • Ejecución selectiva de pruebas: Utiliza opciones como --select y --exclude para ejecutar sólo las pruebas relevantes, especialmente durante el desarrollo. Por ejemplo:
dbt test --select customers
dbt test --exclude tag:slow

Estrategias de gestión de costes

La aplicación de estrategias de gestión de costes garantiza que las pruebas dbt sigan siendo eficaces y rentables, especialmente en entornos en los que la facturación del cálculo está vinculada a la complejidad y frecuencia de las consultas.

Algunas estrategias son:

  • Ejecución de pruebas basada en etiquetas: Asigna etiquetas a las pruebas opcionales o que consumen muchos recursos para que puedan excluirse de las ejecuciones estándar a menos que se requieran explícitamente.
  • Caché de resultados: Utiliza las funciones específicas del almacén (por ejemplo, el almacenamiento en caché de resultados en BigQuery o Snowflake) para evitar el cálculo repetido siempre que sea posible. Organiza las pruebas para beneficiarte de los resultados en caché de las consultas ejecutadas anteriormente.
  • Dosificación programada de pruebas: Programa las suites de prueba más pesadas durante las horas de menor actividad o fuera de las ventanas de producción para minimizar el impacto en las cargas de trabajo del almacén.

Conclusión

Las pruebas dbt son una forma eficaz de garantizar la alta calidad de los datos, automatizar las comprobaciones de validación y detectar problemas en una fase temprana de tu proceso de transformación. Se pueden utilizar pruebas genéricas y personalizadas para crear flujos de datos sólidos y mantenibles.

Aprende más sobre dbt en nuestro Curso de introducción al dbt o nuestro tutorial de dbt.

dbt Pruebas FAQs

¿Qué es la prueba única en dbt?

En dbt (herramienta de construcción de datos), la prueba única garantiza que todos los valores de una columna especificada son distintos, lo que significa que no hay entradas duplicadas.

¿Cuáles son las cuatro pruebas genéricas que incluye dbt?

dbt incluye cuatro pruebas: not_null, unique, accepted_values, y relationships.

¿Cuáles son algunos tipos de pruebas dbt?

Los tipos de pruebas dbt incluyen pruebas genéricas incorporadas y pruebas singulares personalizadas.


Austin Chia's photo
Author
Austin Chia
LinkedIn

Soy Austin, bloguero y escritor técnico con años de experiencia como científico de datos y analista de datos en el sector sanitario. Empecé mi andadura tecnológica con una formación en biología, y ahora ayudo a otros a hacer la misma transición a través de mi blog tecnológico. Mi pasión por la tecnología me ha llevado a escribir para decenas de empresas de SaaS, inspirando a otros y compartiendo mis experiencias.

Temas

Los mejores cursos de DataCamp

Programa

dbt Fundamentals

0 min
Build reliable, scalable data pipelines with dbt Fundamentals, a hands-on track designed for data analysts, data engineers, analytics engineers.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Certificaciones Databricks en 2024: La guía completa

Descubre cómo obtener certificaciones Databricks, explora las ventajas profesionales y aprende a elegir la certificación adecuada para tus objetivos en 2024.
Gus Frazer's photo

Gus Frazer

11 min

blog

Contratos de datos desmitificados: Todo lo que necesitas saber

Lograr la escalabilidad en los sistemas de datos distribuidos y reducir los errores.
Mike Shakhomirov's photo

Mike Shakhomirov

11 min

blog

20 proyectos de análisis de datos para todos los niveles

Explora nuestra lista de proyectos de análisis de datos para principiantes, estudiantes de último curso y profesionales. La lista consta de proyectos guiados/no guiados y tutoriales con código fuente.
Abid Ali Awan's photo

Abid Ali Awan

13 min

blog

¿Qué es el análisis de datos? Una guía experta con ejemplos

Explora el mundo del análisis de datos con nuestra completa guía. Conoce su importancia, proceso, tipos, técnicas, herramientas y principales carreras en 2023
Matt Crabtree's photo

Matt Crabtree

10 min

blog

¿Qué es la gestión de datos? Guía práctica con ejemplos

Aprende los conceptos y teorías fundamentales de la gestión de datos, junto con algunos ejemplos prácticos. Utiliza estas habilidades en tu trabajo diario de ciencia de datos para generar datos limpios y útiles para tus modelos.
Tim Lu's photo

Tim Lu

12 min

Tutorial

Tutorial de DeepChecks: Automatizar las pruebas de aprendizaje automático

Aprende a realizar la validación de datos y modelos para garantizar un sólido rendimiento del aprendizaje automático utilizando nuestra guía paso a paso para automatizar las pruebas con DeepChecks.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Ver másVer más