dbtのpre-hookとpost-hookで加工処理のUT/ITセットアップを効率化してみた

# はじめに
dbtを利用し始めて日の浅い筆者ですが、SELECT文さえ扱えれば誰でも簡単にデータを加工することができ、さらにモデル同士の関係性をグラフィカルに出力することができる手軽さに魅力を感じ、日々勉強をしております。
そんな中、dbtで設計したモデルのUT/IT実施時に詰まったところとその解決にpre-hookとpost-hookを使った方法を検討したため、ご紹介します。

# pre-hookとpost-hookを使ってUT/ITのセットアップを効率化
### pre-hook/post-hookとは
dbtには、general configという様々なオブジェクトレベルで設定することができるパラメータがあり、その中の1つがpre-hook/post-hookです。モデル単位、シード単位、スナップショットの単位で設定することができ、それぞれの処理を実行する前（pre-hook）あるいは実行した後（post-hook）に、指定したSQLを実行することができます。
```yml
models:
  <resource-path>:
    +pre-hook: SQL-statement | [SQL-statement]
    +post-hook: SQL-statement | [SQL-statement]
```

https://docs.getdbt.com/reference/resource-configs/pre-hook-post-hook

### dbtでのUT/IT試験
下図のようにソースデータ（tpch.orders,tpch.lineitem）からデータマート（fct_orders）を作るケースでアプリ観点のUT/ITについて考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452189/dca86a0d-ece9-ad51-3f1d-dd8844b08b96.png)
UTやITではそれぞれの加工処理が正しいロジックになっていることを確認するため、期待値比較テストを実施すると思います。その期待値比較ではテストデータのセットアップから加工処理の実行および期待値との比較を行うため、工数を抑えて実施するには極力手間を省く工夫が必要になります。
しかし、dbtでは同じテーブル名を作る定義は実装できないため、テストデータを定義したシードでインプットテーブルに挿入することや、ソーステーブルを構築するモデルにテストデータを取り込むSQLを定義して実行するなどの方法を取ることはできません。
dbtと接続しているDB製品に直接ログインしてデータのセットアップをすることは可能ですが、dbtのテストのために別のサービスにログインする必要があるのは非常に面倒ですよね。
そこで、我々はpre-hookとpost-hookを使うことで、dbtだけで効率的にセットアップを行うことができるようにしました。

### pre-hook/post-hookによるテストセットアップ
我々が実装したセットアップ機能は下記の4stepを1つのテストセットアップ用モデルで定義することにより実現します。Model定義の例とセットアップのイメージは下記のとおりです。
```sql
{{ config(
    --① 試験対象の加工処理がインプットとしているテーブルのレコードを削除
    pre_hook="truncate {{ref('stg_tpch_orders')}};", 
    
    post_hook=[
            --③ 試験対象の加工処理がインプットとしているテーブルに②のデータを挿入
            "insert into {{ref('stg_tpch_orders')}} select * from {{this}};", 
            --④ ②で構築したテーブルを削除
            "drop view {{this}};"
        ]
)}}
--② テストデータをテストセットアップ用モデルに挿入
select 1, 2, 'A', 1.1, '2024-12-20', 'B', 'C', 0, 'ABC' from dual
union all
select 2, 3, 'B', 2.2, '2024-12-21', 'C', 'D', 1, 'BCD' from dual
```


① 試験対象の加工処理がインプットとしているテーブルのレコードを削除（pre-hook）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452189/4adb9bc4-ee0c-a36f-9246-6fb4c63f732d.png)

② テストデータをテストセットアップ用モデルに挿入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452189/ef088efe-2fa2-c9e2-0556-9a06419b1dcb.png)

③ 試験対象の加工処理がインプットとしているテーブルに②のデータを挿入（post-hook）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452189/a3ed0039-804e-fa81-9620-1382d563a949.png)

④ ②で構築したテーブルを削除（post-hook）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3452189/32e6b82d-faac-7a79-0874-ba8f2bad3aff.png)

1つのモデルファイルに上記の4ステップを詰め込むことで、加工処理1つ1つに対して1つのセットアップ用モデルファイルを用意するだけでセットアップができるようになり、テスト準備に利用した中間テーブルなどのごみ掃除もすることができます。
また、今回モデルのSQLでは、SelectとUnion allを使って

ITの場合も同様にDAGの1つ目のテーブルをセットアップすることで簡単に試験準備を整えることができるため、UTからITまで統一的な仕組み試験環境を作ることができます。


# Appendix
### pre-hook/post-hookのその他の使い道
pre-hookとpost-hookは、接続しているDB製品で利用できるSQLであれば発行することができるため、かなり自由度高く利用することができます。
例えば、Snowflakeであればdbtが利用しているセッション単位でパラメータを変更する「alter session」コマンドが利用できるため、dbtでの利用時のみウェアハウスのタイムアウト時間を設定することで、予期せぬコスト消費を防止することができます。


### dbt unit tests
dbtではunit testsという単体テスト用の機能が存在しています。
unit testsはその名のとおり、モデルの単体テスト単位で設定するものであるため、ソースデータから複数の加工処理を経て更新された最終のターゲットテーブルの期待値比較するようなITレベルには向かないため、今回のような手法を検討しました。
unit testsは現在進行形で改良が重ねられている機能であるため、今後の動向を追っていきたいと思っています。

# おわりに
今回はpre-hook,post-hookを使ったUT/ITの効率化手法についてご紹介しました。
ご紹介した使い方以外にもさまざまな使い方ができますし、dbtにはその他にも様々なGeneral Configが存在しているため、ぜひ皆さんも利用してみてください。

# 筆者紹介
筆者はこれまでSnowflakeオンリーでデータパイプラインを構築するなどの経験をしてきて、さまざま苦労してきました。その経験もありデータパイプラインの構築を楽にできるdbtにかねてから魅力を感じており、日々勉強をしています。
今後もdbtでの開発を楽にできるようなTIPSを考えて発信していこうと思います。


# 仲間募集
NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)
2. データサイエンス領域（データサイエンティスト／データアナリスト）
3.お客様のAI活用の成功を推進するAIサクセスマネージャー
4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》

# ソリューション紹介

<details>～データ資産を分析活用するための環境をオールインワンで提供するソリューション～

https://enterprise-aiiot.nttdata.com/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。<summary>Trusted Data Foundationについて</summary></details>

<details>～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～

https://enterprise-aiiot.nttdata.com/service/tdf/tdf_am
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。<summary>TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary></details>


<details>NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。 NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。 Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://enterprise-aiiot.nttdata.com/service/snowflake<summary>NTTデータとSnowflakeについて</summary></details>

<details>データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。

https://enterprise-aiiot.nttdata.com/service/informatica<summary>NTTデータとInformaticaについて</summary></details>

<details>NTTデータは、お客様企業のデジタル変⾰・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活⽤戦略の⽴案から、AI技術の活⽤も含めたアナリティクス、分析基盤構築・運⽤、分析業務のアウトソースまで、ワンストップの⽀援を提供いたします。
https://enterprise-aiiot.nttdata.com/service/databricks<summary>NTTデータとDatabricksについて</summary></details>

<details>ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。
これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。

https://enterprise-aiiot.nttdata.com/service/tableau<summary>NTTデータとTableauについて</summary></details>


<details>Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。 Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。
導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。
NTTデータとAlteryxについて

https://enterprise-aiiot.nttdata.com/service/alteryx<summary>NTTデータとAlteryxについて</summary></details>

<details>DataRobotは、包括的なAIライフサイクルプラットフォームです。 NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://enterprise-aiiot.nttdata.com/service/datarobot
<summary>NTTデータとDataRobotについて</summary></details>