severity, error_if, warn_if
severity, error_if, warn_if
테스트는 실패 건수를 반환해요. 대부분 테스트 쿼리가 반환한 행 수이지만, custom calculation일 수도 있어요. 일반적으로 실패 건수가 0이 아니면 테스트는 오류(error)를 냅니다. 테스트 쿼리는 "원하지 않는" 행(중복 레코드, null 값 등)을 모두 반환하도록 설계되어서 이렇게 동작하는 게 자연스러워요.
이 테스트가 오류 대신 경고(warning)를 반환하게 하거나, 반환된 실패 건수에 따라 테스트 상태를 다르게 만들 수도 있어요. 중복 레코드 1건은 경고지만, 10건은 오류로 취급하고 싶을 때가 그런 경우예요.
출처: 문서
본문
관련 설정은 다음 세 가지예요.
severity:error또는warn(기본값:error)error_if: 조건식 (기본값:!=0)warn_if: 조건식 (기본값:!=0)
조건식은 정수형 실패 건수를 기준으로 SQL 문법이 지원하는 비교 로직이면 뭐든 쓸 수 있어요. > 5, = 0, between 5 and 10 같은 식이죠.
이 값들이 실제로 어떻게 동작하는지 볼게요.
-
severity: error면 dbt는 먼저error_if조건을 확인해요. 오류 조건이 충족되면 테스트는 오류를 반환하고, 충족되지 않으면warn_if조건(기본값!=0)을 확인해요. warn 조건이 지정되지 않았거나 충족되면 테스트는 경고를, 충족되지 않으면 통과(pass)해요. -
severity: warn이면 dbt는error_if조건을 건너뛰고 바로warn_if조건으로 가요. warn 조건이 충족되면 경고를, 아니면 통과해요.
기본적으로 severity: warn 테스트는 항상 경고만 반환하고 오류를 내지 않아요. 하지만 다음과 같이 경고를 오류로 승격할 수도 있어요.
--warn-error: 모든 dbt 경고(테스트 경고, Jinja 경고, deprecation 등)를 오류로 승격해요.--warn-error-options: 특정 유형의 경고만 오류로 승격해요.
자세한 내용은 Warnings를 참고하세요.
기본 제공 generic 테스트 인스턴스 구성
models/.yml
models:
- name: large_table
columns:
- name: slightly_unreliable_column
data_tests:
- unique:
config:
severity: error
error_if: ">1000"
warn_if: ">10"
Singular 테스트 구성
tests/.sql
{{ config(error_if = '>50') }}
select ...
Custom generic 테스트 기본값 설정
테스트 블록(definition) 안에서 config를 설정하면 커스텀 generic 테스트의 모든 인스턴스 기본값이 돼요.
macros/.sql
{% test <testname>(model, column_name) %}
{{ config(severity = 'warn') }}
select ...
{% endtest %}
패키지/프로젝트의 모든 테스트 기본값 설정
dbt_project.yml
data_tests:
+severity: warn # all tests
<package_name>:
+warn_if: >10 # tests in <package_name>
예상 실패 단언하기
error_if로 "예상된 실패"를 단언할 수도 있어요. generic 테스트가 알려진 나쁜 픽스처 데이터를 걸러내는지 검증하는 패키지 통합 테스트에서 특히 유용해요.
models/always_bad.yml
models:
- name: always_bad
data_tests:
- dbt_utils.expression_is_true:
arguments:
expression: "amount > 0"
config:
error_if: "<1"
warn_if: "<0"
이 예시에서 테스트는 실패 행을 하나 이상 반환할 때만 통과해요. 테스트가 0행을 반환하면, 0이 error_if: '<1'을 충족시키므로 dbt는 오류를 냅니다.
이 패턴에서 경고 동작을 배제하려면 warn_if: '<0'을 설정하세요. warn_if를 덮어쓰지 않으면 기본 경고 조건(!=0)이 여전히 적용될 수 있어요.
더 알아보기 (Learn more)
- Warnings — 경고를 오류로 승격하는 전역 설정.
- fail_calc — 실패 건수를 계산하는 방식 커스터마이즈.
- Data test configurations — 데이터 테스트 설정 개요.