Dbt kullanarak SQL Birim Testi

Dec 16 2022
Veri bilimi ve mühendisliği üzerinde yıllarca çalıştıktan sonra, veri kalitesi neredeyse her projede görünen ve iş başarısını azaltan asılı bir hayalettir. SQL, Data'nın fiili dilidir.

Veri bilimi ve mühendisliği üzerinde yıllarca çalıştıktan sonra, veri kalitesi neredeyse her projede görünen ve iş başarısını azaltan asılı bir hayalettir.

SQL, Data'nın fiili dilidir. Veri kalitesini iyileştirmenin bir yolu, birim testi ve veri testi ile SQL kod tabanını geliştirmektir. Bu makale çoğunlukla Bayan Gao'nun gönderisinden esinlenmiştir .

Bu yazıda dbt ile SQL üzerinde birim testinin temel mantığı basit bir veri seti ile anlatılacaktır.

Temel fikir

SQL'de birim testi yürütmenin temel fikri, Python kodunda birim testi yapmakla tamamen aynıdır:

  1. kontrol edilebilir bir D girişiyle alay et
  2. test edilebilir modül/işlev/algoritma var , buna A deyin
  3. girdi olarak D'yi kullanarak beklenen sonucu hesaplayın, O_should'u alın
  4. beklenen sonucu (O_should) A'dan gelen gerçek çıktıyla (O_is) karşılaştırın

Bazen tam bir eşleşme olması gerekmez, yani ondalık noktadan sonra yalnızca 2 haneye kadar eşleştirme.

Bir örnek

Yukarıdaki fikri açıklamak için saf bir örnek oluşturalım. Aşağıdaki dbt proje klasör yapısına ihtiyacımız var

-- dbt_project.yml

-- data/
------ iris.csv
------ selected_iris_expected.csv

-- models/
------ iris/
---------- selected_iris.sql
---------- schema.yml

# example: dbt_project.yml

# take things under data/ as seeds
data-paths: ["data"]

# configure seed, all going into unittesting schema
seeds:
    schema: unittesting

-- selected_iris.sql
{{ config(
        materialized='table',
        schema='unittesting',
        tags=['iris']
    )
}}

-- count the number of special iris id (above average in all aspects)
-- not a very meaningful logic, just for exemplare purpose
SELECT
distinct count(distinct id)
FROM "public"."iris";
where sepallengthcm > 5.9 and sepalwidthcm > 3.1 and petallengthcm > 3.8 and petalwidthcm > 1.2
-- selected_iris_expected.csv
count
150

# schema.yml 

version: 2

# table model selected_iris should be equal to iris
models:
  - name: selected_iris

    tests:
      - dbt_utils.equality:
          compare_model: ref('selected_iris_expected')
          tags: ['unit_testing']

1. Adım: test verilerini veritabanına yükleyin

# here we use
# iris.csv will be loaded into unittesting.iris table
# selected_iris_expected.csv will be loaded into unittesting.selected_iris_expected table
dbt seed
# build selected_iris model into unittesting.selected_iris
dbt run

iddia a==b

2. Adım: karşılaştırın

# here we use
# all tests within folder model/iris/ with be executed
# of course, we can restrict to only unittesting using tags
dbt test --model iris

Teknik özellikler

Birim testi SQL basit görünüyor değil mi? ama gerçekte her şey daha karmaşık olabilir:

  • testleri projelere göre ayırmak ve organize etmek için muhtemelen daha karmaşık bir klasör yapısına (iç içe geçmiş alt klasörler kullanarak) ihtiyacınız vardır.
  • mevcut dev/prod ortamına dayalı olarak birim testini açmanız/kapatmanız gerekebilir
  • alay edilmesi zor olan büyük bir girdi tablonuz olabilir
  • beklenen sonucu önceden hesaplamanın zor olduğu karmaşık bir modeliniz olabilir (model test edilemez)
  • Beklenen sonuç, kayan sayı hassasiyeti vb. nedeniyle gerçek çıktıyla %100 eşleşmeyebilir (neredeyse aynı olsalar bile).
  • veya bu projede zaman bütçeniz olmayabilir, bu alışılmadık bir durum değildir, insanlar 2022'de sql birim testini çok yapmaz, SQL ifadeleri yazıldıktan sonra doğru kabul edilir

Bir İpucu: SQL İfadelerini Modülerleştirin

Yukarıda listelenen tüm zorluklara rağmen, SQL ve Python gibi diğer daha genel programlama dilleri söz konusu olduğunda birim testinde yardımcı olan bir şey var.

Bu Modülerleştirmedir. İyi bir modülerleştirilmiş model/işlev/algoritma, sql için bile test edilebilirliği ve okunabilirliği garanti eder.

Bunu sql ve dbt ile gerçekleştirmenin birçok yolu vardır:

  • dbt makrosu (https://docs.getdbt.com/docs/build/jinja-macros)
  • ifadesi ile (https://learnsql.com/blog/what-is-with-clause-sql/)

Çözüm

SQL, verilerin ana dilidir, bu makalede, dbt ile SQL birim testi yapmanın bir yolunu gösterdik.

Benzer şekilde, veri entegrasyon testi veya rasgoQ L kullanarak sql oluşturulmasını python gibi daha güçlü bir dile devretmek gibi başka hileler de yapabiliriz.