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
850
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
130
入社してからデータ分析基盤でやってきたことを 真面目にドヤる!!
k_data_analyst
0
68
⚡Lightdashを試してみた
k_data_analyst
1
1.5k
"あえて"データ整備人になるメリットを前向きに考えてみた
k_data_analyst
0
160
Other Decks in Programming
See All in Programming
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
390
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
500
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
620
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
160
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
290
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
330
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
220
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
440
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.8k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
590
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
510
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Speed Design
sergeychernyshev
33
2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Language of Interfaces
destraynor
162
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Amusing Abliteration
ianozsvald
1
260
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
The SEO Collaboration Effect
kristinabergwall1
1
530
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
エンジニアに許された特別な時間の終わり
watany
108
250k
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