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행을 반환하면, 0error_if: '<1'을 충족시키므로 dbt는 오류를 냅니다.

이 패턴에서 경고 동작을 배제하려면 warn_if: '<0'을 설정하세요. warn_if를 덮어쓰지 않으면 기본 경고 조건(!=0)이 여전히 적용될 수 있어요.

더 알아보기 (Learn more)