dbtのUnit testsの導入
オイシックス・ラ・大地株式会社 / 東條裕也
シニアマネージャー / データエンジニア / 従業員規模: 1,001〜5,000名
| ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
|---|---|---|
| 11名〜50名 | 2024年11月 | B to C |
| ツールの利用規模 | 11名〜50名 |
|---|---|
| ツールの利用開始時期 | 2024年11月 |
| 事業形態 | B to C |
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
- Oisixの食品宅配サービスにおける商品分類ロジックをdbtで実装しているが、そのロジックが複雑になり、不具合の発生リスクが高まっていた。
- 従来はData testsや本番データとの比較に頼っており、複雑なSQLロジックそのものの検証手段が不足していた。
どのような状態を目指していたか
- テストデータを用いて、本番リリース前にmodelのロジックが意図した通りに動作することを確認できる状態。
- 複雑なロジックでも検証漏れが発生せず、品質を担保できる開発フローを実現すること。
導入の成果
改善したかった課題はどれくらい解決されたか
- 修正modelに対して入力データと期待するデータを準備でき、本番リリース前にmodelのロジックが意図した通りに動作するかを確認できるようになった。
- 新商品データが揃っていない段階でも、テストデータで検証可能となり、リリース直前の検証ボトルネックが解消された。
どのような成果が得られたか
- テストデータにより、複雑なロジックの場合にも検証漏れなくチェックできるようになった。
- Data tests(データ品質検証)とUnit tests(SQLロジック検証)を使い分けることで、データ品質向上の選択肢が広がった。
導入時の苦労・悩み
dbtのUnit testsは比較的新しい機能であり、公式ドキュメントだけでは実運用に落とし込む際の判断材料が不足していたため、自プロジェクトに合わせた設計を試行錯誤で固めていく必要がありました。
具体的には、以下の3点に時間を要しました。
入力データの定義方法の確立:Unit testsでは、検証対象modelに与えるテスト用の入力データをどう用意するかが品質と保守性を左右します。シンプルに省略する方法、参照のみ定義する方法、dbtのref機能を活用する方法など複数のアプローチを試したものの、いずれも想定通りには動作せず、自プロジェクトのディレクトリ構成やソース定義との相性を踏まえたうえで、最終的に直接テーブルを指定する形式に落ち着きました。テストの再現性・可読性・実行コストのバランスを取る判断が難しかった点が苦労ポイントです。
テストファイルの配置設計:Unit testsはmodelの数だけ増えていくため、どこに配置するかで視認性や運用負荷が大きく変わります。既存のyamlに追記する案、各層ディレクトリ内に分散させる案、専用ディレクトリに集約する案などを比較し、開発時の見つけやすさ・本番運用時の影響範囲の把握しやすさを評価軸に、チームで合意できる配置ルールを決める必要がありました。
周辺エコシステムとの整合:Unit testsはdbt本体に組み込まれた新機能であるため、dbt_utilsなどの周辺macroや、graph.nodesといったdbt内部メタデータとの連携部分に未成熟な箇所があり、想定外のエラーや挙動に遭遇しました。回避策の検討やワークアラウンドの実装に追加の調査コストがかかった点も、導入時の悩みとなりました。
導入に向けた社内への説明
上長・チームへの説明
導入にあたっては、既存の検証体制では十分にカバーできていなかった領域と、導入のハードルが低いことを軸に説明を行いました。
これまでのデータテスト的な観点だけでは不足していた点:従来運用していたData testsは、NULLチェックやユニーク制約など「データそのものの品質」を担保する仕組みであり、SQLロジック自体の妥当性までは検証できないという限界がありました。特に、複雑な条件分岐やcase文を含むmodelでは、本番データに依存した検証になりがちで、想定ケースを網羅できず不具合の見落としリスクが残っていました。Unit testsを導入することで、テストデータを用いて「ロジックが意図通りに動作するか」を本番リリース前に検証できるようになり、Data testsとの役割分担によって品質保証の網を広げられる点を強調しました。
導入の費用や他のテストへの影響がない点:Unit testsはdbt-core v1.8.0以降に標準搭載されている機能のため、追加のライセンス費用や新規ツールの選定・契約は不要であり、コスト面のハードルがないことを説明しました。また、既存のData testsや本番データ比較などの検証手段に影響を与えるものではなく、これらと併用する形で段階的に導入できるため、現行の開発・運用フローを止めずに試せる点も合わせて伝え、導入の合意を得ました。
活用方法
よく使う機能
- Unit tests機能:YAML形式で
given(入力データ)とexpect(期待出力)を定義し、modelのSQLロジックを検証する。 - 毎週高頻度で発売される新商品を、商品名や商品属性などのデータを用いて分類する商品分類ロジックの検証に活用している。新しい分類が必要となりmodelを修正した際に、本番リリース前にロジックが意図通りに動作するかをテストデータで確認している。
ツールの良い点
- 複雑な文字列変換や判定、複雑な条件によるcase文など、ロジックが複雑なSQLの動作検証に適している。
- テストデータで必要なデータをすべて準備できるため、本番データの状態に依存せず検証できる。
- dbt標準機能(v1.8.0以降)のため、追加コストなしで導入可能。
ツールの課題点
- テストデータの定義方法についてref参照などのdbtらしい記述で簡潔に書けるなど、テストデータを準備しやすい改善を期待したい。
- dbt_utils.star macroの不具合により、Unit tests実行時にエラーが発生するケースがある。
ツールを検討されている方へ
- Unit testsは万能ではなく、Data testsや本番データ比較など、他の検証手段と組み合わせて使うことが重要。
- それぞれの検証手段ごとに適切な使い分けを行い、総合的にデータ品質を向上させていく姿勢が望ましい。
- 入力データ定義やファイル配置などの実装パターンは、自プロジェクトの構成に合わせて事前に検証・標準化しておくと、スムーズに導入できる。
今後の展望
- Unit testsと他の検証手段(Data tests、本番データ比較等)を組み合わせ、データ品質のさらなる向上につなげていく。
- dbt側の改善(macro対応など)にも追従しつつ、検証カバレッジを広げていく。
オイシックス・ラ・大地株式会社 / 東條裕也
シニアマネージャー / データエンジニア / 従業員規模: 1,001〜5,000名
よく見られているレビュー
オイシックス・ラ・大地株式会社 / 東條裕也
シニアマネージャー / データエンジニア / 従業員規模: 1,001〜5,000名
レビューしているツール
目次
- 導入の背景・解決したかった問題
- 活用方法


