Manifest Checks: Tests#
Note
The below checks require manifest.json to be present.
Functions:
| Name | Description |
|---|---|
check_test_has_meta_keys |
The |
check_test_has_tags |
Data tests must have the specified tags. |
check_test_has_where_config |
Data tests must have a |
check_test_has_meta_keys
#
The meta config for data tests must have the specified keys.
Rationale
The meta field on data tests is a flexible store for operational metadata such as ownership, severity context, or ticket references. Enforcing required keys ensures that every test carries the information needed to triage failures quickly — for example, knowing which team owns a failing test or what SLA it is tied to — without relying on tribal knowledge or documentation that falls out of sync.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
keys
|
NestedDict
|
A list (that may contain sub-lists) of required keys. |
required |
Receives at execution time:
| Name | Type | Description |
|---|---|---|
test |
TestNode
|
The TestNode object to check. |
Other Parameters (passed via config file):
| Name | Type | Description |
|---|---|---|
description |
str | None
|
Description of what the check does and why it is implemented. |
exclude |
str | list[str] | None
|
Regex pattern(s) to match the test path. Test paths that match any pattern will not be checked. |
include |
str | list[str] | None
|
Regex pattern(s) to match the test path. Only test paths that match any pattern will be checked. |
severity |
Literal['error', 'warn'] | None
|
Severity level of the check. Default: |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_tests.py
check_test_has_tags
#
Data tests must have the specified tags.
Rationale
Tags allow teams to organise tests into logical groups (e.g. critical, nightly, schema-only) and run subsets selectively with dbt test --select tag:critical. Without enforced tagging, it becomes difficult to prioritise test failures, run fast CI checks, or set up tiered alerting based on test severity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
criteria
|
Literal['any', 'all', 'one'] | None
|
Whether the test must have any, all, or exactly one of the specified tags. Default: |
'all'
|
tags
|
list[str]
|
List of tags to check for. |
required |
Receives at execution time:
| Name | Type | Description |
|---|---|---|
test |
TestNode
|
The TestNode object to check. |
Other Parameters (passed via config file):
| Name | Type | Description |
|---|---|---|
description |
str | None
|
Description of what the check does and why it is implemented. |
exclude |
str | list[str] | None
|
Regex pattern(s) to match the test path. Test paths that match any pattern will not be checked. |
include |
str | list[str] | None
|
Regex pattern(s) to match the test path. Only test paths that match any pattern will be checked. |
severity |
Literal['error', 'warn'] | None
|
Severity level of the check. Default: |
Example(s):
Source code in src/dbt_bouncer/checks/manifest/check_tests.py
check_test_has_where_config
#
Data tests must have a where config set.
By default this check only verifies that a where config is present (i.e.
not None or empty). Supplying regexp_pattern additionally enforces that
the where expression matches the given regex — useful for mandating that a
specific macro or partition filter is used.
Rationale
A where config limits a data test to a subset of rows, most commonly a recent time window driven by a partition column. Without one, tests scan the full table on every run, which is slow and expensive on large warehouses, and it is easy to forget to add the filter. Enforcing a where config — and optionally that it uses an approved macro — keeps test costs bounded and consistent across a project without relying on manual review.
Warning
The where config is read from the manifest as the raw Jinja source, not the compiled SQL. For example, a value of {{ partition_filter() }} >= 7 is matched exactly as written — dbt-bouncer does not render it, so the environment-specific compiled output (e.g. a 7-day window versus a 1970 epoch window) is never evaluated. Write regexp_pattern against the Jinja expression, not the rendered result.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
regexp_pattern
|
str | None
|
If provided, the |
None
|
Receives at execution time:
| Name | Type | Description |
|---|---|---|
test |
TestNode
|
The TestNode object to check. |
Other Parameters (passed via config file):
| Name | Type | Description |
|---|---|---|
description |
str | None
|
Description of what the check does and why it is implemented. |
exclude |
str | list[str] | None
|
Regex pattern(s) to match the test path. Test paths that match any pattern will not be checked. |
include |
str | list[str] | None
|
Regex pattern(s) to match the test path. Only test paths that match any pattern will be checked. |
severity |
Literal['error', 'warn'] | None
|
Severity level of the check. Default: |
Example(s):
manifest_checks:
# The `where` config must reference the `partition_filter` macro.
- name: check_test_has_where_config
regexp_pattern: .*partition_filter.*