Skip to content

Incluindo testes no seu modelo

Laura Amaral edited this page May 8, 2024 · 11 revisions

Protocolo de inclusão de testes

  1. Incluir as colunas no teste de chave única
  2. Incluir testes específicos. Liste o que você sabe sobre a base e busque testes que avaliam se o que você sabe se verifica.

Exemplos: determinada coluna não pode assumir valores negativos, outra coluna tem como valores válidos apenas 2 categorias)

  1. Se a base for grande incluir as configurações para que o teste rode apenas nas linhas mais recentes
  2. Rode os testes localmente
  3. Caso encontre problemas avalie: o problema aconteceu por um erro de processamento nos dados ou as suposições que você tinha sobre a base estavam incorretas?
  4. Se for um erro de processamento, volte e arrume
  5. Se for um erro nas suposições, considere utilizar os testes customizados (descritos abaixo) para adequar os testes a base. Sempre que usar testes customizados documentar as exceções nos metadados da tabela, pois o usuário final é o mais interessado em entender essas particularidades

Testes a serem adicionados no schema.yaml

Conexão com diretórios

models:
  - name: orders
    columns:
      - name: id_municipio
        tests:
          - relationships:
              to: ref('br_bd_diretorios_brasil__municipio')
              field: id_municipio

Chaves únicas

models:
  - name: orders
    tests:
      - dbt_utils.unique_combination_of_columns:
          combination_of_columns:
            - country_code
            - order_id

Testes customizados

Não nulidade das colunas

models:
  - name: dataset_id__table_id
    description: 
    tests:
      - not_null_proportion_multiple_columns:
          at_least: 0.95

Conexão com diretórios customizada

Permite explicitar valores que vão ser ignorados no momento de realizar o teste de relação e a proporção de valores sem correspondência que será tolerada.

models:
  - name: dataset_id__table_id
    description: Table description
    tests:
      - custom_relationships:
        to: ref('br_bd_diretorios_mundo__sistema_harmonizado')
        field: id_sh4
        ignore_values: ["5410"] # O valor 5410 será ignorado
        proportion_allowed_failures: 0 

Atenção: caso utilize esse teste é essencial documentar nos metadados da tabela quais exceções foram aplicadas e porque elas são aceitáveis. De preferencia adicionar essas informações na descrição da tabela para que o usuário seja informado dessas exceções

Chave única customizada

Permite inserir uma proporção de chaves únicas que repetidas que pode ser tolerada. Usar com parcimônia! Pode mascarar repetição de linhas.

models:
  - name: dataset_id__table_id
    description: Table description
    tests:
      - custom_unique_combinations_of_columns:
          combination_of_columns:
            - column_1
            - column_2
          proportion_allowed_failures: 0.05

Atenção: caso utilize esse teste é essencial documentar nos metadados da tabela quais exceções foram aplicadas e porque elas são aceitáveis. De preferencia adicionar essas informações na descrição da tabela para que o usuário seja informado dessas exceções

Dicionários

  • O objetivo deste teste é verificar se todos os valores que estão presentes em colunas de tabelas com dicionário também estão nos dicionários.
  • O teste é aplicado a nível da tabela
  • Este teste não considera cobertural temporal dos dicionários
models:
  - name: dataset_id__table_id
    description: Table description
     tests:
      - custom_dictionaries:
         columns_covered_by_dictionary: [id_pais, id_via, id_urf] #colunas que precisam ser testadas
         dictionary_model: ref('br_me_comex_stat__dicionario') #dicionário que deve ser usado no teste
         config:
            where: __most_recent_year_month__

Testes Incrementais

Para tabelas muito grandes é importante que o teste rode apenas nas linhas novas que serão incluidas. Para isso usaremos o config where e uma das keywords __most_recent_year_month__ | __most_recent_date__ | __most_recent_year__

where

O where é inserido a nível do teste e permite inserir lógica SQL para filtrar os dados.

models:
  - name: dataset_id__table_id
    description: Table description
    tests:
      - custom_unique_combinations_of_columns:
          combination_of_columns:
            - column_1
            - column_2
          proportion_allowed_failures: 0.05
          config:
                where: "date_column = '2024-01-01'"

where + keyword

A macro custom_get_where_subquery detecta a presença de uma das keywords acima e executa uma consulta para determinar os valores mais recentes de ano e mês, data ou ano de uma tabela. Em seguida, substitui a keyword declarada pelos valores mais recentes encontrados, o que garante que o teste seja executado apenas nas linhas mais recentes da tabela.

__most_recent_year_month__ : a macro faz um query usando as colunas ano e mes para identificar a data mais recente; __most_recent_date__ : a macro faz um query usando a coluna data para identificar a data mais recente; __most_recent_year__ : a macro faz um query usando a coluna ano para identificar o ano;

ex.

models:
  - name: dataset_id__table_id
    description: Table description
    tests:
      - custom_unique_combinations_of_columns:
          combination_of_columns:
            - column_1
          proportion_allowed_failures: 0.05
          config:
            where: __most_recent_year_month__

Ver implementação em br_bcb_estban