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
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
820
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
120
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
1
10k
#kanrk08 / 公開版 PicoRubyとマイコンでの自作トレーニング計測装置を用いたワークアウトの理想と現実
bash0c7
1
770
Is Xcode slowly dying out in 2025?
uetyo
1
270
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
5
1.1k
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
570
RailsGirls IZUMO スポンサーLT
16bitidol
0
180
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
160
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
640
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
250
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
120
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Scaling GitHub
holman
460
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Navigating Team Friction
lara
187
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
Designing for Performance
lara
610
69k
Typedesign – Prime Four
hannesfritz
42
2.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
950
Six Lessons from altMBA
skipperchong
28
3.9k
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