Configurar Tests para Validar Integridad de Datos

Video
25 min~4 min lectura

Reproductor de video

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:

  1. Todos los pedidos tengan un ID unico
  2. El monto total sea positivo
  3. 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 unique son 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: warn para 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

  1. Se configurar tests built-in (unique, not_null, relationships) en archivos YAML
  2. Puedo crear tests personalizados usando archivos SQL en la carpeta tests/
  3. Entiendo como interpretar los resultados de dbt test en dbt Cloud
  4. Se configurar la severidad de tests (error vs warn) para controlar el flujo de CI/CD
  5. Puedo agregar descripciones a tests para documentar las reglas de negocio
  6. Se optimizar tests para rendimiento en datasets grandes
  7. 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:

  1. Crea un nuevo modelo SQL llamado customers_enhanced en 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') }}
  2. En el archivo models/schema.yml, agrega una seccion para el modelo customers_enhanced y define tests para las siguientes reglas:
    • customer_id debe ser unico y no nulo
    • email debe contener el caracter '@' (usa un test personalizado)
    • date_of_birth debe ser una fecha valida y no futura
    • country debe ser uno de los valores permitidos: 'US', 'MX', 'CA'
  3. Crea un test personalizado en tests/valid_email.sql que verifique que la columna email contenga '@'.
  4. Ejecuta dbt test --model customers_enhanced en dbt Cloud y verifica que todos los tests pasen.
  5. Si algun test falla, revisa los datos de origen en stg_customers y corrige las inconsistencias.
Pistas
  • Usa el test accepted_values para 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.