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
2
730
dbt v1.8で追加された単体テストを触ってみた
Tokyo dbt Meetup #9 の発表資料です。
k_data_analyst
June 20, 2024
Tweet
Share
More Decks by k_data_analyst
See All by k_data_analyst
⚡Lightdashを試してみた
k_data_analyst
1
1.3k
"あえて"データ整備人になるメリットを前向きに考えてみた
k_data_analyst
0
140
Other Decks in Programming
See All in Programming
AIともっと楽するE2Eテスト
myohei
7
2.8k
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
160
型で語るカタ
irof
0
200
ふつうの技術スタックでアート作品を作ってみる
akira888
1
910
Node-RED を(HTTP で)つなげる MCP サーバーを作ってみた
highu
0
120
AIと”コードの評価関数”を共有する / Share the "code evaluation function" with AI
euglena1215
1
170
GitHub Copilot and GitHub Codespaces Hands-on
ymd65536
2
150
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
140
10 Costly Database Performance Mistakes (And How To Fix Them)
andyatkinson
0
450
状態遷移図を書こう / Sequence Chart vs State Diagram
orgachem
PRO
1
130
Claude Code + Container Use と Cursor で作る ローカル並列開発環境のススメ / ccc local dev
kaelaela
11
6.2k
What's new in AppKit on macOS 26
1024jp
0
120
Featured
See All Featured
Bash Introduction
62gerente
613
210k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
The World Runs on Bad Software
bkeepers
PRO
69
11k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Building an army of robots
kneath
306
45k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Into the Great Unknown - MozCon
thekraken
40
1.9k
How to train your dragon (web standard)
notwaldorf
96
6.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
It's Worth the Effort
3n
185
28k
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