Antes de comenzar
En la consola de Google Cloud , ve a la página Dataform.
Selecciona o crea un repositorio.
Selecciona o crea un espacio de trabajo de desarrollo.
Roles obligatorios
Para obtener los permisos que necesitas para crear aserciones y pruebas unitarias, pídele a tu administrador que te otorgue los siguientes roles de IAM:
- Editor de Dataform (
roles/dataform.editor) en el espacio de trabajo -
Para sincronizar los metadatos de la aserción con Knowledge Catalog, debes tener el rol de Editor de Dataplex Catalog (
roles/dataplex.catalogEditor) en el proyecto o el grupo de entradas@bigquery.
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Datos de prueba con aserciones
Una aserción es una consulta de prueba de calidad de los datos que encuentra filas que incumplen una o más condiciones especificadas en la consulta. Si la consulta devuelve filas, la aserción falla. Dataform ejecuta aserciones cada vez que actualiza tu flujo de trabajo y te avisa si alguna falla.
Dataform crea automáticamente vistas en BigQuery que contienen los resultados de las consultas de aserción compiladas. Como se configuró en el archivo de configuración del flujo de trabajo, Dataform crea estas vistas en un esquema de aserciones en el que puedes inspeccionar los resultados de las aserciones.
Por ejemplo, para el esquema dataform_assertions predeterminado, Dataform crea una vista en BigQuery con el siguiente formato: dataform_assertions.assertion_name.
Puedes crear aserciones para todos los tipos de tablas de Dataform: tablas, tablas incrementales, vistas y vistas materializadas.
Puedes crear aserciones de las siguientes maneras:
Agrega aserciones integradas al bloque de configuración de una tabla.
Puedes agregar aserciones integradas al bloque
configde una tabla y especificar sus condiciones.Agrega aserciones manuales en un archivo .sqlx independiente.
Escribes manualmente aserciones personalizadas en un archivo SQLX separado para casos de uso avanzados o para conjuntos de datos que no creó Dataform.
Crea aserciones integradas
Puedes agregar aserciones integradas de Dataform al bloque config de una tabla. Dataform ejecuta estas aserciones después de la creación de la tabla. Después de que Dataform cree la tabla, puedes ver si la aserción pasó en la pestaña Registros de ejecución del flujo de trabajo de tu espacio de trabajo.
Puedes crear las siguientes aserciones en el bloque config de una tabla:
nonNullEsta condición afirma que las columnas especificadas no son nulas en todas las filas de la tabla. Esta condición se usa para las columnas que nunca pueden ser nulas.
En la siguiente muestra de código, se muestra una aserción
nonNullen el bloqueconfigde una tabla:
config {
type: "table",
assertions: {
nonNull: ["user_id", "customer_id", "email"]
}
}
SELECT ...
rowConditionsEsta condición afirma que todas las filas de la tabla siguen la lógica personalizada que defines. Cada condición de fila es una expresión SQL personalizada, y cada fila de la tabla se evalúa en función de cada condición de fila. La aserción falla si alguna fila de la tabla genera
false.En la siguiente muestra de código, se muestra una aserción
rowConditionspersonalizada en el bloqueconfigde una tabla incremental:
config {
type: "incremental",
assertions: {
rowConditions: [
'signup_date is null or signup_date > "2022-08-01"',
'email like "%@%.%"'
]
}
}
SELECT ...
uniqueKeyEsta condición afirma que, en una columna especificada, ninguna fila de la tabla tiene el mismo valor.
En el siguiente muestra de código, se muestra una aserción
uniqueKeyen el bloqueconfigde una vista:
config {
type: "view",
assertions: {
uniqueKey: ["user_id"]
}
}
SELECT ...
uniqueKeysEsta condición afirma que, en las columnas especificadas, ninguna fila de la tabla tiene el mismo valor. La aserción falla si hay más de una fila en la tabla con los mismos valores para todas las columnas especificadas.
En el siguiente muestra de código, se muestra una aserción
uniqueKeysen el bloqueconfigde una tabla:
config {
type: "table",
assertions: {
uniqueKeys: [["user_id"], ["signup_date", "customer_id"]]
}
}
SELECT ...
Agrega aserciones al bloque config
Para agregar aserciones al bloque de configuración de una tabla, sigue estos pasos:
- En tu lugar de trabajo de desarrollo, en el panel Archivos, selecciona un archivo SQLX de definición de tabla.
- En el bloque
configdel archivo de la tabla, ingresaassertions: {}. - Dentro de
assertions: {}, agrega tus aserciones. - Opcional: Haz clic en Formato.
En la siguiente muestra de código, se muestran las condiciones agregadas en el bloque config:
config {
type: "table",
assertions: {
uniqueKey: ["user_id"],
nonNull: ["user_id", "customer_id"],
rowConditions: [
'signup_date is null or signup_date > "2019-01-01"',
'email like "%@%.%"'
]
}
}
SELECT ...
Crea aserciones manuales con SQLX
Las aserciones manuales son consultas en SQL que escribes en un archivo SQLX dedicado. Una consulta en SQL de aserción manual debe devolver cero filas. Si la consulta devuelve filas cuando se ejecuta, la aserción falla.
Para agregar aserciones manuales en un archivo .sqlx nuevo, sigue estos pasos:
- En el panel Archivos, junto a
definitions/, haz clic en el menú
Más. - Haz clic en Crear archivo.
En el campo Agregar una ruta de archivo, ingresa el nombre del archivo seguido de
.sqlx. Por ejemplo,definitions/custom_assertion.sqlx.Los nombres de archivo solo pueden incluir números, letras, guiones y guiones bajos.
Haz clic en Crear archivo.
En el panel Archivos, haz clic en el archivo nuevo.
En el archivo, ingresa lo siguiente:
config { type: "assertion" }Debajo del bloque
config, escribe tu consulta en SQL o varias consultas.Opcional: Haz clic en Formato.
En el siguiente muestra de código, se muestra una aserción manual en un archivo SQLX que confirma que los campos A, B y c nunca son NULL en sometable:
config { type: "assertion" }
SELECT
*
FROM
${ref("sometable")}
WHERE
a IS NULL
OR b IS NULL
OR c IS NULL
Prueba la calidad de los datos con pruebas de unidades
Una prueba de unidades es una prueba de calidad de los datos, definida en un archivo .sqlx dedicado, que simula todas las dependencias de la acción del flujo de trabajo probado y proporciona los resultados esperados.
Puedes usar pruebas de unidades para probar las acciones de Dataform con entradas simuladas controladas y verificar si el código de acción controla correctamente los casos extremos, los valores nulos, las agregaciones, las expresiones regulares y la lógica condicional.
Las simulaciones para las dependencias de acciones, como las tablas predecesoras, las vistas o las declaraciones sin procesar a las que se hace referencia en la función ${ref()}, se definen en los bloques input. Cada bloque input hace referencia a una dependencia por su nombre y contiene una consulta en SQL que define las filas simuladas. Por lo general, esta consulta es una serie de instrucciones SELECT combinadas con UNION ALL.
Los resultados esperados son consultas en SQL que representan los resultados de ejecutar las entradas especificadas en la instrucción de SQL de la acción del flujo de trabajo.
Dataform ejecuta pruebas de unidades fila por fila y compara el resultado real de ejecutar la lógica de SQL de una acción del flujo de trabajo con datos simulados y un conjunto de resultados esperados.
Las pruebas de unidades se resuelven en los siguientes estados:
SUCCESS: La prueba se aprobó. Los resultados reales coinciden con los esperados.FAILURE: No se pudo realizar la prueba. Los resultados reales no coinciden con los esperados.
Limitaciones
Las pruebas de unidades de Dataform están disponibles con las siguientes limitaciones:
- Las pruebas de unidades están disponibles en la versión
3.0.56y posteriores de Dataform Core. - El tamaño máximo de los datos de entrada en una prueba unitaria es de 100 filas por entrada.
Crea pruebas de unidades
Almacena los archivos .sqlx para las pruebas de unidades en el directorio definitions/.
Para crear un archivo .sqlx de prueba unitaria nuevo en el directorio definitions/, sigue estos pasos:
En la consola de Google Cloud , ve a la página Dataform.
Selecciona un repositorio.
Selecciona un espacio de trabajo de desarrollo.
En el panel Archivos, junto a
definitions/, haz clic en el menú Más.Haz clic en Crear archivo.
En el panel Crear un archivo nuevo, haz lo siguiente:
En el campo Agregar una ruta de archivo, después de
definitions/, ingresa el nombre del archivo seguido de_test.sqlx. Por ejemplo,definitions/customer_spend_test.sqlxLos nombres de archivo solo pueden incluir números, letras, guiones y guiones bajos.
Haz clic en Crear archivo.
En el archivo de prueba, agrega el siguiente bloque
config:config { type: "test", dataset: "ACTION_NAME" }Reemplaza ACTION_NAME por el nombre de la acción que valida esta prueba.
Para simular la acción probada, agrega un bloque
inputpara cada dependencia de la acción y escribe una consulta en SQL que pruebe esa dependencia con el siguiente formato:input "DEPENDENCY_NAME" { SELECT ... SELECT ... }Reemplaza DEPENDENCY_NAME por el nombre de la dependencia de acción probada que simula esta entrada.
Debajo de los bloques
input, escribe consultas en SQL estándar que representen las filas de salida esperadas con el siguiente formato:-- Expected Output SELECT ... SELECT ...
Las consultas de salida esperadas solo deben devolver las filas y columnas que la acción probada debería producir con las entradas simuladas.
En el siguiente muestra de código, se muestra la acción del flujo de trabajo customer_spend.sqlx:
config {
type: "table",
name: "customer_spend"
}
SELECT
c.customer_id,
c.name,
SUM(o.amount) AS total_completed_amount
FROM
${ref("source_customers")} c
JOIN
${ref("source_orders")} o
ON c.customer_id = o.customer_id
WHERE
o.status = 'COMPLETED'
GROUP BY
1, 2
El siguiente muestra de código muestra la prueba de unidades customer_spend_test.sqlx que simula las dependencias de la acción customer_spend.sqlx y define los resultados esperados para las simulaciones:
config {
type: "test",
dataset: "customer_spend"
}
input "source_customers" {
SELECT 101 AS customer_id, 'Alice' AS name UNION ALL
SELECT 102 AS customer_id, 'Bob' AS name UNION ALL
SELECT 103 AS customer_id, 'Charlie' AS name
}
input "source_orders" {
-- Alice has one completed and one pending order
SELECT 1 AS order_id, 101 AS customer_id, 'COMPLETED' AS status, 100.0 AS amount UNION ALL
SELECT 2 AS order_id, 101 AS customer_id, 'PENDING' AS status, 50.0 AS amount UNION ALL
-- Bob has one completed order
SELECT 3 AS order_id, 102 AS customer_id, 'COMPLETED' AS status, 250.0 AS amount UNION ALL
-- Charlie has no orders
SELECT 4 AS order_id, 999 AS customer_id, 'COMPLETED' AS status, 10.0 AS amount
}
-- Expected Output
SELECT 101 AS customer_id, 'Alice' AS name, 100.0 AS total_completed_amount UNION ALL
SELECT 102 AS customer_id, 'Bob' AS name, 250.0 AS total_completed_amount
Ejecutar pruebas de unidades
Para ejecutar pruebas de unidades, sigue estos pasos:
Console
En la consola de Google Cloud , ve a la página Dataform.
Selecciona un repositorio.
Selecciona un espacio de trabajo de desarrollo.
Haz clic en Iniciar ejecución > Ejecutar acciones.
En el panel Ejecutar, en la sección Modo de ejecución, selecciona Pruebas de unidades.
Selecciona una de las siguientes opciones:
- Seleccionar pruebas de unidades: Ejecuta las pruebas de unidades que seleccionas de forma manual.
- Seleccionar pruebas de unidades etiquetadas: Ejecuta pruebas de unidades con una etiqueta seleccionada.
- All unit tests: Ejecuta todas las pruebas de unidades en el espacio de trabajo.
Opcional: En las secciones Opciones de ejecución, selecciona la casilla de verificación Ejecutar como trabajo interactivo con alta prioridad para ejecutar pruebas unitarias de inmediato y priorizar la velocidad de ejecución.
Si no seleccionas la casilla de verificación Ejecutar como trabajo interactivo con alta prioridad, Dataform ejecutará pruebas unitarias con recursos por lotes de forma predeterminada, lo que priorizará el ahorro en los costos de procesamiento.
Haz clic en Iniciar ejecución.
API
Para ejecutar pruebas de unidades de forma programática, crea una invocación de flujo de trabajo con el método WorkflowInvocations.create y establece los siguientes parámetros de ejecución de prueba de unidades en el objeto invocationConfig:
"executionMode": "UNIT_TESTS_ONLY"- Este parámetro, establecido en
"UNIT_TESTS_ONLY", activa la ejecución de las pruebas de unidades definidas en el repositorio. - Opcional:
"queryPriority": "INTERACTIVE" - Cuando este parámetro se establece en
"INTERACTIVE", Dataform ejecuta las consultas de inmediato. Si no se configura, Dataform ejecuta pruebas de unidades con la prioridad de consulta por lotes predeterminada. - Opcional:
"includedTargets": [] - Este parámetro te permite especificar pruebas de unidades para que Dataform ejecute solo estas pruebas.
- Opcional:
"includedTags": [] - Este parámetro te permite especificar etiquetas para que Dataform ejecute solo las pruebas de unidades etiquetadas con esas etiquetas.
En el siguiente muestra de código, se muestra el cuerpo de una invocación de flujo de trabajo que ejecuta todas las pruebas de unidades definidas en el repositorio my-repo con la prioridad de consulta por lotes predeterminada:
{
"compilationResult": "projects/my-project/locations/us/repositories/my-repo/compilationResults/my-compilation-id",
"invocationConfig": {
"executionMode": "UNIT_TESTS_ONLY"
}
}
En el siguiente muestra de código, se muestra el cuerpo de una invocación de flujo de trabajo que ejecuta solo la prueba unitaria my-test con la prioridad de consulta interactiva:
{
"compilationResult": "projects/my-project/locations/us/repositories/my-repo/compilationResults/my-compilation-id",
"invocationConfig": {
"executionMode": "UNIT_TESTS_ONLY",
"queryPriority": "INTERACTIVE",
"includedTargets": [
{
"database": "my-project",
"schema": "my-dataset",
"name": "my-test"
}
]
}
}
En el siguiente muestra de código, se muestra el cuerpo de una invocación de flujo de trabajo que ejecuta pruebas unitarias en el repositorio my-repo etiquetadas con test-tag-1 o test-tag-2:
{
"compilationResult": "projects/my-project/locations/us/repositories/my-repo/compilationResults/my-compilation-id",
"invocationConfig": {
"executionMode": "UNIT_TESTS_ONLY",
"queryPriority": "INTERACTIVE",
"includedTags": [
"test-tag-1",
"test-tag-2"
]
}
}
Inspecciona los resultados de las pruebas de unidades
Puedes inspeccionar las diferencias entre los guiones esperados y reales de una prueba unitaria en el Gráfico compilado o en Ejecuciones.
Gráfico compilado
Para ver las secuencias de comandos reales y esperadas de una prueba de unidades en el gráfico compilado de las acciones del flujo de trabajo, sigue estos pasos:
En la consola de Google Cloud , ve a la página Dataform.
Selecciona un repositorio.
Selecciona un espacio de trabajo de desarrollo.
Opcional: Para ver las pruebas de unidades vinculadas a las acciones que prueban, en lugar de verlas como nodos independientes del gráfico, establece el parámetro de configuración
includeTestsInCompiledGraphentrueen el archivoworkflow_settings.yaml:- Selecciona el archivo
workflow_settings.yaml. - Agrega el siguiente código:
includeTestsInCompiledGraph: true- Selecciona el archivo
Haz clic en Gráfico compilado.
En el gráfico compilado, selecciona una prueba unitaria y, luego, haz clic en Consulta.
Compara la secuencia de comandos de SQL real y la secuencia de comandos de SQL esperada.
Ejecuciones
En la consola de Google Cloud , ve a la página Dataform.
Selecciona un repositorio.
Selecciona un espacio de trabajo de desarrollo.
Haz clic en Ejecuciones y, luego, en Ver detalles junto a la prueba unitaria seleccionada.
Compara la consulta de resultados reales y la consulta de resultados esperados.
Prácticas recomendadas para las pruebas unitarias
- Mantén pequeños los conjuntos de datos de simulación
- Mantén los datos de entrada simulados en menos de 10 filas para una compilación más rápida y una depuración más sencilla.
- Cómo especificar un orden de fila explícito
- Siempre agrega una cláusula
ORDER BYa la consulta de acción y a la consulta de salida esperada para garantizar un orden determinístico de las filas durante la evaluación. - Convierte explícitamente las columnas en tus instrucciones simuladas
- Convertir de forma explícita las columnas en tus instrucciones simuladas (por ejemplo, con
CAST(100 AS INT64)) mantiene la rigidez del tipo y evita errores de compilación. - Incluye casos de prueba con valores
NULLo faltantes - Incluir casos de prueba con
NULLo valores faltantes en tus consultas simuladas de entrada garantiza que tus instruccionesCOALESCE, operaciones de cadenas y criterios de filtro controlen de forma segura los datos de producción incompletos o nulos.
En el siguiente muestra de código, se muestra un caso de prueba de NULL:
input "source_customers" {
SELECT 101 AS customer_id, 'Alice' AS name UNION ALL
SELECT 102 AS customer_id, NULL AS name -- Test null handling
}
¿Qué sigue?
- Para obtener más información sobre los tipos de aserciones, consulta la API de Dataform.
- Para obtener información sobre cómo definir aserciones con JavaScript, consulta Crea flujos de trabajo exclusivamente con JavaScript.
- Para obtener información sobre cómo ejecutar flujos de trabajo de forma manual, consulta Cómo activar ejecuciones de forma manual.