Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
dbt v1.8で追加された単体テストを触ってみた
Search
k_data_analyst
June 20, 2024
Programming
840
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
dbt v1.8で追加された単体テストを触ってみた
Tokyo dbt Meetup #9 の発表資料です。
k_data_analyst
June 20, 2024
More Decks by k_data_analyst
See All by k_data_analyst
開発者/利用者の両視点で"Lightdash愛"を語りたい
k_data_analyst
0
120
入社してからデータ分析基盤でやってきたことを 真面目にドヤる!!
k_data_analyst
0
64
⚡Lightdashを試してみた
k_data_analyst
1
1.5k
"あえて"データ整備人になるメリットを前向きに考えてみた
k_data_analyst
0
160
Other Decks in Programming
See All in Programming
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
690
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
540
テーブルをDELETEした
yuzneri
0
110
今さら聞けない .NET CLI
htkym
0
140
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
550
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
130
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
210
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
250
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
460
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
480
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
420
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
How STYLIGHT went responsive
nonsquared
100
6.2k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
350
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
260
Agile that works and the tools we love
rasmusluckow
331
22k
Become a Pro
speakerdeck
PRO
31
6k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
New Earth Scene 8
popppiees
3
2.4k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
Tell your own story through comics
letsgokoyo
1
1k
Optimizing for Happiness
mojombo
378
71k
Exploring anti-patterns in Rails
aemeredith
3
450
Transcript
Tokyo dbt Meetup #9 dbt v1.8で追加された単体テストを触ってみた ©STORES,Inc. All Rights Reserved.
自己紹介 名前 香村 貴之(こうむら たかゆき) 所属 STORES株式会社 テクノロジー部門 データ本部 職種
アナリティクスエンジニア
本日のゴール dbt の単体テストの振る舞いを理解した上で、 「こういうケースで使えそう」というイメージを 掴んでもらうこと
目次 dbt で利用できる3つのテスト機能の比較 実際に動かしてみた 自社で単体テストを導入するとしたら 01 02 03
• dbt v1.7までのテスト ◦ Generic Test ▪ dbt がはじめから用意してくれているテスト機能 ▪
unique や not null などを検証できる ▪ modelsディレクトリ配下の.ymlで定義する ◦ Singular Test ▪ SELECT文をもとに想定しないケースが発生しているかを検証するテスト機能 ▪ testsディレクトリ配下に.sqlを用意する • dbt v1.8で追加された単体テスト(Unit Test) ◦ モデル(SQL)のロジックに対する検証を行える ◦ Generic Test 同様、modelsディレクトリ配下の.ymlで定義する dbt で利用できる3つのテスト機能の比較 https://docs.getdbt.com/docs/build/unit-tests
• 実行環境 ◦ dbt-core:1.8.0 ◦ dbt-bigquery:1.8.1 実際に動かしてみた
実際に動かしてみた / 単一モデルに対する単体テスト sample.users id integer email string staging.users id
integer email string is_valid_email_address boolean
実際に動かしてみた / 単一モデルに対する単体テスト データソースとして渡すレコード 期待する結果
実際に動かしてみた / 単一モデルに対する単体テスト 期待する値 実際の値
実際に動かしてみた / 単一モデルに対する単体テスト sample.users id integer email string staging.users id
integer email string is_valid_email_address boolean
実際に動かしてみた / 単一モデルに対する単体テスト
実際に動かしてみた / 発行されるクエリ① input で指定した静的レコード モデルのクエリ
実際に動かしてみた / 発行されるクエリ② input で指定した静的レコード input で指定した静的レコードをもとに、 モデルのロジックを通した結果 expect で指定した静的レコード
input と expect の結果を 結合して出力
実際に動かしてみた / 複数モデルを参照するモデルに対する単体テスト sample.orders order_id integer sample.order_items order_id integer product_id
integer status string staging.orders order_id integer quantity integer shipped_quantity integer fulfilled boolean
実際に動かしてみた / 複数モデルを参照するモデルに対する単体テスト 参照するモデルごとに input を定義するだけ
実際に動かしてみた / incrementalモデルを参照するモデルに対する単体テスト events event_id integer event_date date https://docs.getdbt.com/docs/build/unit-tests#unit-test ing-incremental-models
実際に動かしてみた / incrementalモデルを参照するモデルに対する単体テスト マクロの振る舞いを 指定して実行することができる 正しくINSERT/MERGEできたかどうかは 検証できない。 が、検討はされている↓ https://github.com/dbt-labs/dbt-core /issues/8664
実際に動かしてみた / ephemeralモデルを参照するモデルに対する単体テスト 複数モデルの例で出したCTE部分を ephemeral モデルで切り出した
実際に動かしてみた / ephemeralモデルを参照するモデルに対する単体テスト 接続先のDWHからスキーマを読み込め ないため、 直接SELECT文を書いている https://docs.getdbt.com/docs/build/unit-tests#unit-testing -a-model-that-depend-on-ephemeral-models
• Q:input に対して expect のレコード数が不足している場合どうなる? • A:エラーになる。 実際に動かしてみた / Q&A
• Q:input に対して expect のレコード数が不足している場合どうなる? • A:エラーになる。 実際に動かしてみた / Q&A
期待に対してこのレコードが不足しているためエラー
• Q:rows の順序には意味がある? • A:特に意味はない。 実際に動かしてみた / Q&A 順序を入れ替えてもPASSする
input をデータソースとしたとき に得られる結果に、 expectのレコードが過不足なく含 まれていればPASSする • Q:rows にはスキーマの全カラムを指定する必要がある? • A:全カラムを指定する必要はない。
実際に動かしてみた / Q&A expect から email を削除
• Q:$ dbt buildを実行した場合の処理順序は? • A:先に単体テストが実行され、その後モデルがデプロイされる。 実際に動かしてみた / Q&A
1. GoogleAnalytics4 のデータをもとにしたリファラー判定処理 a. 複雑なロジックを組んでリファラーの判定を行っている b. 近々リファクタリングを検討している 2. 複数プロダクトの実績を加算している処理 a.
過去にカラムの選択ミスにより間違った数値を算出してしまった b. 変数のぬけもれや、カラムの選択ミスを検出したい 3. 正規表現を含むCASE式 a. GA4のページビューのデータを元に、カテゴライズしている b. 新しいパターンを加えた際に、判定処理順序の兼ね合いで今までとは異なる判定が されてしまった 自社で単体テストを導入するとしたら
本日のゴール dbt の単体テストの振る舞いを理解した上で、 「こういうケースで使えそう」というイメージを 掴んでもらうこと
None