Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Creating Custom Singular Tests in dbt
📖 Scenario: You are working on a data project using dbt to ensure your data quality. You want to create a custom singular test to check that no user has a negative age in your users table.
🎯 Goal: Build a custom singular test in dbt that checks for any negative values in the age column of the users table.
📋 What You'll Learn
Create a SQL file for the custom singular test with the exact name no_negative_age.sql.
Define a SQL query that selects rows where age < 0 from the users table.
Add a test configuration variable called model_name with the value users.
Use the model_name variable inside the SQL query to refer to the table dynamically.
Print the final SQL query string to verify the test logic.
💡 Why This Matters
🌍 Real World
Data teams use custom singular tests in dbt to ensure data quality by writing specific checks tailored to their data models.
💼 Career
Knowing how to write custom tests in dbt is valuable for data analysts and engineers to maintain trustworthy data pipelines.
Progress0 / 4 steps
1
Create the custom singular test SQL file
Create a file named no_negative_age.sql and write a SQL query that selects all rows from the users table where the age column is less than 0. Use the exact table name users in the query.
dbt
Hint
Write a simple SQL SELECT statement filtering age < 0 from users.
2
Add a configuration variable for the model name
Add a variable called model_name and set it to the string users. This variable will be used to refer to the table dynamically in the test.
dbt
Hint
Define a Python variable model_name with value 'users'.
3
Use the variable inside the SQL query
Modify the SQL query to use the model_name variable instead of the hardcoded table name. Use an f-string to insert model_name into the query string.
dbt
Hint
Use an f-string to build the query with model_name inside curly braces.
4
Print the final SQL query
Print the variable query to display the final SQL query string that will be used in the custom singular test.
dbt
Hint
Use print(query) to show the SQL query string.
Practice
(1/5)
1. What is the main purpose of a custom singular test in dbt?
easy
A. To automatically generate documentation for your models
B. To write your own SQL query that checks data quality and returns rows only if there are issues
C. To schedule dbt runs at specific times
D. To create new tables from existing data
Solution
Step 1: Understand the role of custom singular tests
Custom singular tests are SQL queries that check data quality by returning rows only when problems exist.
Step 2: Compare options with this definition
Only To write your own SQL query that checks data quality and returns rows only if there are issues describes writing a SQL query that returns rows if there are data issues, matching the purpose of custom singular tests.
Final Answer:
To write your own SQL query that checks data quality and returns rows only if there are issues -> Option B
Quick Check:
Custom singular test = SQL check returning problem rows [OK]
Hint: Custom singular tests return rows only when data has problems [OK]
Common Mistakes:
Confusing tests with documentation generation
Thinking tests create tables
Assuming tests schedule runs
2. Which of the following is the correct way to define a custom singular test in your schema.yml file?
easy
A. tests:
- my_custom_test.sql
B. tests:
- my_custom_test:
sql: my_custom_test.sql
C. tests:
- name: my_custom_test
test: my_custom_test
D. tests:
- my_custom_test
Solution
Step 1: Recall the schema.yml syntax for custom singular tests
Custom singular tests are referenced by their filename (without .sql) in the tests list of schema.yml.
Step 2: Match options to this syntax
tests:
- my_custom_test correctly references the test file tests/my_custom_test.sql. Other options use incorrect structure, extra keys, or include .sql.
Final Answer:
tests:
- my_custom_test -> Option D
Quick Check:
schema.yml test syntax = - test_filename_without_sql [OK]
Hint: Reference tests by name (no .sql) in tests: list [OK]
Common Mistakes:
Using 'name' or 'test' keys
Including .sql extension
Using map/dict structure
3. Given the following custom singular test SQL in tests/check_positive_values.sql:
SELECT * FROM {{ ref('orders') }} WHERE amount <= 0
What will be the output if all amounts in the orders table are positive?
medium
A. An empty result with zero rows
B. A table with all rows where amount is less than or equal to zero
C. An error because of invalid SQL syntax
D. A count of rows with amount less than or equal to zero
Solution
Step 1: Understand the test SQL logic
The test selects rows where amount is less than or equal to zero.
Step 2: Analyze the data condition
If all amounts are positive, no rows satisfy the condition, so the query returns zero rows.
Final Answer:
An empty result with zero rows -> Option A
Quick Check:
All positive amounts means zero rows returned [OK]
Hint: No matching rows means test passes with empty output [OK]
Common Mistakes:
Expecting a count instead of rows
Thinking it returns all rows
Assuming SQL syntax error
4. You wrote a custom singular test SQL file but when running dbt test, it fails with a syntax error. Which of the following is the most likely cause?
medium
A. The model referenced in {{ ref() }} does not exist
B. The test SQL returns zero rows
C. The SQL file is missing the required SELECT statement
D. The test is not listed in schema.yml
Solution
Step 1: Identify causes of SQL syntax errors
Syntax errors happen when SQL is malformed, such as missing SELECT statements.
Step 2: Evaluate options for syntax error causes
The SQL file is missing the required SELECT statement directly relates to SQL syntax. Other options cause runtime or configuration errors, not syntax errors.
Final Answer:
The SQL file is missing the required SELECT statement -> Option C
Quick Check:
Syntax error = malformed SQL like missing SELECT [OK]
Hint: Syntax errors usually mean SQL is incomplete or malformed [OK]
Common Mistakes:
Confusing missing test listing with syntax error
Assuming zero rows cause syntax errors
Ignoring missing model references
5. You want to create a custom singular test that checks if any user has a NULL email in the users table. Which SQL query should you write in your test file?
hard
A. SELECT * FROM {{ ref('users') }} WHERE email IS NULL
B. SELECT COUNT(*) FROM {{ ref('users') }} WHERE email IS NULL
C. SELECT email FROM {{ ref('users') }} WHERE email IS NOT NULL
D. SELECT * FROM {{ ref('users') }} WHERE email = ''
Solution
Step 1: Understand the test goal
The test should return rows where email is NULL to detect missing emails.
Step 2: Choose the SQL that returns rows with NULL emails
SELECT * FROM {{ ref('users') }} WHERE email IS NULL returns rows only when there are NULL emails (0 rows = pass). COUNT(*) always returns one row, failing even with zero NULLs. IS NOT NULL selects good rows (opposite). = '' checks empty strings, not NULLs.
Final Answer:
SELECT * FROM {{ ref('users') }} WHERE email IS NULL -> Option A
Quick Check:
Return rows with NULL email = SELECT * FROM {{ ref('users') }} WHERE email IS NULL [OK]
Hint: Use SELECT * WHERE column IS NULL to find missing values [OK]