Saltar al contenido

Lección 6 de 20 · Lectura y práctica

Tipos de Tests en dbt: Genericos y Singulares

Concepto claveEn dbt, los tests son validaciones que aseguran la calidad de tus datos transformados. Piensa en ellos como inspectores de control de calidad en una fábrica: revisan cada producto (tus tablas y columnas) antes de.

Del concepto a la práctica

Taller de esta lección

Un test genérico expresa una propiedad reutilizable de una columna; uno singular expresa una regla concreta mediante una consulta que devuelve las filas inválidas. La diferencia se aprecia mejor con el estado de un pedido y su importe.

Ejemplo resuelto

Para status, accepted_values puede permitir paid y cancelled. Para amount, un test singular puede seleccionar filas donde amount < 0. Con datos O1 paid 20, O2 cancelled 0 y O3 paid -4, solo O3 infringe la regla de importe.

Pruébalo

  1. Escribe las propiedades generales de order_id y status.

  2. Define el dominio según el contrato del negocio; puede incluir valores válidos aún no observados en la muestra.

  3. Crea una consulta singular que seleccione importes negativos.

  4. Ejecuta ambos tipos y guarda las filas devueltas por el fallo.

Comprueba tu resultado

Error frecuente: escribir el test singular para seleccionar las filas válidas. Corrígelo invirtiendo la condición: un test debe devolver cero filas al pasar.

Ejercicio: añade O4 pending 12 y decide si pasa cada regla. Resultado esperado: O4 falla el dominio si solo permitiste paid y cancelled; O3 falla el importe. No inventes un fallo de unicidad si todos los IDs siguen siendo distintos.

Para dbt 1.10.5 o posterior, la configuración de columna usa argumentos anidados:

yaml
models:
  - name: fct_orders
    columns:
      - name: status
        data_tests:
          - accepted_values:
              arguments:
                values: ["paid", "cancelled"]

El test singular de importe puede ser select * from {{ ref("fct_orders") }} where amount < 0. La regla de esta práctica se refiere al importe original de venta; si tu negocio almacena devoluciones como importes negativos, documenta otra regla en vez de rechazarlas automáticamente.

Flujo de datos: dos formatos de la misma fecha se normalizan y un vacío queda marcado antes de comprobar tipos, duplicados y unidades.
CursaloMapa de práctica
Antes del gráfico, revisa los datos

Antes de analizar, comprueba los tipos, valores vacíos, duplicados y unidades. Decide cómo tratar cada problema según el contexto y conserva la trazabilidad del cambio. Un gráfico solo es útil si los datos de entrada son coherentes.

Ver la infografía en tamaño completo ↗
Fuentes para profundizar

Concepto clave

En dbt, los tests son validaciones que aseguran la calidad de tus datos transformados. Piensa en ellos como inspectores de control de calidad en una fábrica: revisan cada producto (tus tablas y columnas) antes de enviarlos a producción. Existen dos tipos principales: tests genéricos y tests singulares.

Los tests genéricos son plantillas reutilizables que dbt proporciona para verificar propiedades comunes, como que una columna no tenga valores nulos o que sea única. Son como herramientas estandarizadas: rápidas de aplicar y consistentes. Por otro lado, los tests singulares son validaciones personalizadas que tú escribes para reglas de negocio específicas, como asegurar que el total de ventas sea positivo o que una fecha esté en un rango válido. Son como inspecciones a medida para casos especiales.

La analogía del mundo real: imagina que eres un chef preparando un menú. Los tests genéricos verifican ingredientes básicos (ej., "la sal no está vencida"), mientras que los singulares chequean recetas complejas (ej., "la salsa tiene el equilibrio correcto de sabores"). En dbt Cloud, combinar ambos tipos te permite automatizar la calidad de datos, reduciendo errores en tus análisis.

Cómo funciona en la práctica

Veamos un ejemplo paso a paso para un modelo de ventas. Supón que tienes una tabla stg_orders con columnas como order_id, customer_id, amount, y order_date. Primero, aplicas tests genéricos en el archivo schema.yml para validar propiedades básicas:

  1. Verifica que order_id sea único y no nulo.
  2. Asegura que amount sea positivo (usando un test genérico de positividad).
  3. Confirma que customer_id no tenga valores nulos.

Luego, creas un test singular para una regla de negocio: "el monto total por pedido no debe exceder $10,000". Esto se escribe en un archivo SQL separado y se referencia en schema.yml. Al ejecutar dbt test en dbt Cloud, ambos tipos de tests se corren automáticamente, mostrando fallas si los datos no cumplen las reglas. Esto te alerta temprano sobre problemas, antes de que afecten los reportes.

Código en acción

Aquí tienes un ejemplo funcional. Primero, el archivo models/schema.yml con tests genéricos:

version: 2

models:
  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique
          - not_null
      - name: amount
        tests:
          - accepted_values:
              values: ['positive']
      - name: customer_id
        tests:
          - not_null
      - name: order_date
        tests:
          - relationships:
              to: ref('dim_date')
              field: date_key

Ahora, un test singular en tests/amount_limit.sql:

-- Test singular: verifica que el monto por pedido no exceda $10,000
SELECT 
    order_id,
    amount
FROM 
    {{ ref('stg_orders') }}
WHERE 
    amount > 10000

Para integrarlo, añade en schema.yml:

models:
  - name: stg_orders
    tests:
      - amount_limit

Al ejecutar dbt test, si algún pedido tiene amount > 10000, el test fallará, mostrando esos registros. Esto te permite corregir datos erróneos antes de usarlos en dashboards.

Errores comunes

  • Usar tests singulares para validaciones genéricas: Por ejemplo, escribir un test SQL personalizado para verificar valores no nulos, en lugar de usar not_null. Esto aumenta mantenimiento. Solución: Aprovecha los tests genéricos de dbt siempre que sea posible.
  • No probar en entorno de staging: Ejecutar tests solo en producción puede causar interrupciones. Solución: Configura dbt Cloud para correr tests en un entorno de staging primero, usando dbt test --target staging.
  • Ignorar el rendimiento de tests: Tests complejos en tablas grandes pueden ralentizar las ejecuciones. Solución: Optimiza consultas SQL en tests singulares y usa filtros donde aplique.
  • Falta de documentación en tests: Tests sin explicación clara dificultan el debugging. Solución: Añade comentarios en código YAML o SQL describiendo el propósito de cada test.
  • No actualizar tests tras cambios en modelos: Si refactorizas una tabla, los tests pueden quedar obsoletos. Solución: Revisa y ajusta tests como parte de tu flujo de desarrollo en dbt Cloud.

Checklist de dominio

  1. Puedo diferenciar entre tests genéricos (ej., unique, not_null) y singulares (SQL personalizado).
  2. Sé configurar tests genéricos en schema.yml para columnas de un modelo.
  3. Puedo crear un test singular en un archivo .sql y referenciarlo en YAML.
  4. Entiendo cómo ejecutar tests en dbt Cloud usando el comando dbt test o la interfaz web.
  5. Puedo interpretar resultados de tests fallidos para identificar problemas en los datos.
  6. Sé optimizar tests para no impactar el rendimiento en ejecuciones grandes.
  7. Puedo documentar tests con comentarios para facilitar mantenimiento.

Implementa tests en un modelo de productos

En este ejercicio, aplicarás tests genéricos y singulares a un modelo de productos para asegurar calidad de datos. Sigue estos pasos:

  1. Prepara el entorno: En tu proyecto dbt Cloud, crea o usa un modelo existente llamado stg_products con columnas: product_id (entero), product_name (texto), price (decimal), category (texto), y created_at (timestamp).
  2. Añade tests genéricos: En el archivo models/schema.yml, configura tests para:
    • product_id: debe ser único y no nulo.
    • price: debe ser positivo.
    • category: debe tener solo valores de una lista predefinida (ej., 'Electrónica', 'Ropa', 'Hogar').
  3. Crea un test singular: Escribe un test en tests/price_threshold.sql que verifique que ningún producto tenga precio mayor a $5000. Referencia este test en schema.yml.
  4. Ejecuta y valida: Corre dbt test en dbt Cloud. Si hay fallos, revisa los datos y ajusta los tests o el modelo según sea necesario.
  5. Documenta: Añade comentarios en el código YAML y SQL explicando el propósito de cada test.
Pistas
  • Usa el test genérico 'accepted_values' para validar la categoría con una lista de valores.
  • En el test singular, la consulta SQL debe seleccionar registros que violen la regla (precio > 5000).
  • Recuerda que los tests singulares se referencian en 'tests:' a nivel de modelo en schema.yml.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Modelado de Datos en dbt Cloud: Tests, Documentación y Práctica

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.