Concepto clave
Configurar tests para validar la integridad de datos en dbt es como instalar alarmas en un almacen de productos. Imagina que trabajas en una bodega: tienes reglas como "ningun estante debe estar vacio" o "todos los productos deben tener codigo de barras". Los tests en dbt son esas alarmas que suenan cuando tus datos violan las reglas de negocio que defines.
En el contexto de dbt Cloud, los tests son validaciones automaticas que ejecutas contra tus modelos de datos transformados. No solo verifican que el codigo SQL funciona, sino que los datos resultantes cumplen con expectativas especificas. Esto es crucial para un Analytics Engineer, ya que evita que errores de datos se propaguen a dashboards y reportes que usan los equipos de negocio.
Como funciona en la practica
Vamos a seguir un ejemplo paso a paso. Supongamos que tienes un modelo llamado orders_cleaned que transforma datos de pedidos. Quieres asegurarte de que:
- Todos los pedidos tengan un ID unico
- El monto total sea positivo
- La fecha del pedido no sea futura
Primero, defines estos tests en un archivo YAML asociado a tu modelo. Luego, cuando ejecutas dbt test en dbt Cloud, el sistema ejecuta consultas SQL que verifican cada condicion. Si algun test falla, recibes un reporte detallado indicando que filas violan la regla, permitiendote investigar y corregir rapidamente.
Codigo en accion
Aqui tienes un ejemplo real de como configurar tests para un modelo de pedidos. Primero, el modelo SQL (models/orders_cleaned.sql):
-- Modelo que limpia y transforma datos de pedidos
WITH raw_orders AS (
SELECT
order_id,
customer_id,
order_date,
total_amount,
status
FROM {{ source('ecommerce', 'raw_orders') }}
)
SELECT
order_id,
customer_id,
CAST(order_date AS DATE) AS order_date,
total_amount,
status
FROM raw_orders
WHERE status = 'completed'
Ahora, el archivo de configuracion de tests (models/schema.yml):
version: 2
models:
- name: orders_cleaned
description: "Pedidos completados limpios para analisis"
columns:
- name: order_id
description: "Identificador unico del pedido"
tests:
- unique
- not_null
- name: total_amount
description: "Monto total del pedido"
tests:
- accepted_values:
values: ['> 0']
- name: order_date
description: "Fecha en que se realizo el pedido"
tests:
- relationships:
to: ref('date_dim')
field: date_key
Errores comunes
- Testear columnas que no existen: Definir tests en YAML para columnas que no estan en el modelo SQL causa errores de compilacion. Siempre verifica que los nombres coincidan.
- Usar tests genericos cuando necesitas customizados Los tests built-in como
uniqueson utiles, pero para reglas complejas (ej: "el monto debe ser positivo") necesitas tests personalizados con SQL. - Ignorar el rendimiento: Tests en tablas grandes pueden ser lentos. Usa configuraciones como
severity: warnpara no bloquear despliegues, o agrega filtros WHERE para limitar los datos testeados. - No documentar los tests: Sin descripciones en YAML, otros ingenieros no entendera que regla de negocio valida cada test. Incluye siempre
description.
Checklist de dominio
- Se configurar tests built-in (unique, not_null, relationships) en archivos YAML
- Puedo crear tests personalizados usando archivos SQL en la carpeta
tests/ - Entiendo como interpretar los resultados de
dbt testen dbt Cloud - Se configurar la severidad de tests (error vs warn) para controlar el flujo de CI/CD
- Puedo agregar descripciones a tests para documentar las reglas de negocio
- Se optimizar tests para rendimiento en datasets grandes
- Puedo integrar tests en un pipeline de despliegue automatizado
Implementar Tests para un Modelo de Clientes
En este ejercicio, vas a configurar tests para validar la integridad de datos en un modelo de clientes. Sigue estos pasos:
- Crea un nuevo modelo SQL llamado
customers_enhanceden tu proyecto dbt Cloud con este codigo:SELECT customer_id, first_name, last_name, email, CAST(date_of_birth AS DATE) AS date_of_birth, country FROM {{ ref('stg_customers') }} - En el archivo
models/schema.yml, agrega una seccion para el modelocustomers_enhancedy define tests para las siguientes reglas:customer_iddebe ser unico y no nuloemaildebe contener el caracter '@' (usa un test personalizado)date_of_birthdebe ser una fecha valida y no futuracountrydebe ser uno de los valores permitidos: 'US', 'MX', 'CA'
- Crea un test personalizado en
tests/valid_email.sqlque verifique que la columna email contenga '@'. - Ejecuta
dbt test --model customers_enhanceden dbt Cloud y verifica que todos los tests pasen. - Si algun test falla, revisa los datos de origen en
stg_customersy corrige las inconsistencias.
- Usa el test
accepted_valuespara validar los paises permitidos. - Para el test personalizado de email, puedes usar una expresion SQL como
email LIKE '%@%'. - Recuerda que los tests personalizados deben devolver 0 filas cuando pasan; si devuelven filas, esas son las que fallan el test.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.