Skip to main content

Test SQL

In this guide, you'll learn how to add data quality and validation tests to your SQL Components using Jinja blocks to ensure data integrity in your pipelines.

Prerequisites

info

For a comprehensive overview of test types and when to use them, see our Tests concept guide.

Test format

SQL Components support native tests through Jinja with_test blocks. These tests validate data quality automatically during pipeline execution and can be added directly within your SQL files.

Add native tests to SQL Components by including with_test Jinja blocks after your SELECT statement:

SELECT
*
FROM
{{ ref("my_table", flow="my_flow") }}

{{ with_test("test_name", column="column_name", parameter="value") }}

Column-level tests

Column-level tests validate individual columns in your dataset. Include the column parameter to specify which column to test.

Basic validation tests

Check for null values and uniqueness:

SELECT
user_id,
email,
created_at
FROM
{{ ref("users", flow="user_management") }}

{{ with_test("not_null", column="user_id") }}
{{ with_test("unique", column="user_id") }}
{{ with_test("not_null", column="email") }}
{{ with_test("unique", column="email") }}

String validation tests

Validate string columns for empty values and patterns:

SELECT
feedback_id,
feedback_text,
rating
FROM
{{ ref("customer_feedback", flow="analytics") }}

{{ with_test("not_empty", column="feedback_text") }}
{{ with_test("not_null", column="feedback_text") }}

Component-level tests

Component-level tests validate the entire output of your Transform. Omit the column parameter for Component-level tests.

Count validation

Verify that your Transform produces exactly the expected number of records:

SELECT
*
FROM
{{ ref("processed_orders", flow="sales") }}
WHERE
status = 'completed'

{{ with_test("count_equal", count=75471) }}

Test Components

You can also create dedicated Test Components in SQL for custom validation logic:

test_combinations.sql
{% test combination_unique(component, column, columns) %}
{% set columns_str = columns | join(', ') %}
SELECT COUNT(*) as cnt, {{ columns_str }}
FROM {{ component }}
WHERE {{ columns | map('safe') | join(' IS NOT NULL OR ') }} IS NOT NULL
GROUP BY {{ columns_str }}
HAVING cnt > 1
{% endtest %}

This Test Component checks for uniqueness across a combination of columns.

Next steps