[CT-3195] [spike+] unit testing versioned models #8799
Closed
Description
Is this your first time submitting a feature request?
- I have read the expectations for open source contributors
- I have searched the existing issues, and I could not find an existing issue for this feature
- I am requesting a straightforward extension of existing dbt functionality, rather than a Big Idea better suited to a discussion
Describe the feature
- If a unit test is added to a model, with no supplied version, the unit test will run on all versions of said model
unit-tests:
- name: test_is_valid_email_address # this is the unique name of the test
model: my_model # name of the model I'm unit testing
given: # optional: list of inputs to provide as fixtures
- input: ref('users')
rows:
- {user_id: 1, email: cool@example.com, email_top_level_domain: example.com}
- {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com}
- {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com}
- {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com}
- input: ref('top_level_domains')
rows:
- {tld: example.com}
- {tld: gmail.com}
expect: # required: the expected output given the inputs above
- {user_id: 1, is_valid_email_address: true}
- {user_id: 2, is_valid_email_address: false}
- {user_id: 3, is_valid_email_address: false}
- {user_id: 4, is_valid_email_address: false}
So if I have version 1, 2, and 3 of my_model
, my test_is_valid_email_address
unit test will run on all 3 versions.
- To to only unit test a specific version (or versions) of a model, you can include the desired version(s) in the model config
unit-tests:
- name: test_is_valid_email_address # this is the unique name of the test
model: my_model # name of the model I'm unit testing
versions:
include:
- 2
given: # optional: list of inputs to provide as fixtures
- input: ref('users')
rows:
- {user_id: 1, email: cool@example.com, email_top_level_domain: example.com}
- {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com}
- {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com}
- {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com}
- input: ref('top_level_domains')
rows:
- {tld: example.com}
- {tld: gmail.com}
expect: # required: the expected output given the inputs above
- {user_id: 1, is_valid_email_address: true}
- {user_id: 2, is_valid_email_address: false}
- {user_id: 3, is_valid_email_address: false}
- {user_id: 4, is_valid_email_address: false}
So if I have version 1, 2, and 3 of my_model, my test_is_valid_email_address unit test will run on ONLY version 2.
- To to unit test all versions except a specific version (or versions) of a model, you can exclude the relevant version(s) in the model config
unit-tests:
- name: test_is_valid_email_address # this is the unique name of the test
model: my_model # name of the model I'm unit testing
versions:
exclude:
- 1
given: # optional: list of inputs to provide as fixtures
- input: ref('users')
rows:
- {user_id: 1, email: cool@example.com, email_top_level_domain: example.com}
- {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com}
- {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com}
- {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com}
- input: ref('top_level_domains')
rows:
- {tld: example.com}
- {tld: gmail.com}
expect: # required: the expected output given the inputs above
- {user_id: 1, is_valid_email_address: true}
- {user_id: 2, is_valid_email_address: false}
- {user_id: 3, is_valid_email_address: false}
- {user_id: 4, is_valid_email_address: false}
So if I have version 1, 2, and 3 of my_model, my test_is_valid_email_address unit test will run on ONLY version 2 and 3.
(similar to include & exclude for warn_error_options)
- If you want to unit test a model that references a pinned version of model, you should specify that in the ref of your
input:
unit-tests:
- name: test_is_valid_email_address # this is the unique name of the test
model: my_model # name of the model I'm unit testing
given: # optional: list of inputs to provide as fixtures
- input: ref('users', v=1)
rows:
- {user_id: 1, email: cool@example.com, email_top_level_domain: example.com}
- {user_id: 2, email: cool@unknown.com, email_top_level_domain: unknown.com}
- {user_id: 3, email: badgmail.com, email_top_level_domain: gmail.com}
- {user_id: 4, email: missingdot@gmailcom, email_top_level_domain: gmail.com}
- input: ref('top_level_domains')
rows:
- {tld: example.com}
- {tld: gmail.com}
expect: # required: the expected output given the inputs above
- {user_id: 1, is_valid_email_address: true}
- {user_id: 2, is_valid_email_address: false}
- {user_id: 3, is_valid_email_address: false}
- {user_id: 4, is_valid_email_address: false}
Describe alternatives you've considered
No response
Who will this benefit?
No response
Are you interested in contributing this feature?
No response