データ ウェアハウスを BigQuery に移行するなら、Dataform による BigQuery UDF の単体テストを実施しましょう
Google Cloud Japan Team
※この投稿は米国時間 2021 年 10 月 8 日に、Google Cloud blog に投稿されたものの抄訳です。
BigQuery への移行時には、BigQuery ネイティブ関数の充実したライブラリを利用して分析ワークロードを強化できます。既存の関数は、独自のユーザー定義関数(UDF)で拡張することも可能です。人間誰しもミスをするものなので、単体テストを作成して UDF が正しく動作するかを検証することをおすすめします。Dataform のコマンドライン ツールはこのニーズを満たし、すべての UDF の単体テストをプログラムで実行できるようにします。
2020 年に Google Cloud が買収した Dataform は、BigQuery で SQL クエリの実行をオーケストレートするための便利な CLI ツールを提供しています。Google Cloud の Professional Services Organization は、BigQuery UDF の単体テストを実行するためのテンプレート コードと、Dataform CLI の使用方法の例をオープンソース化しました。これらのテストの実行に、費用は一切かかりません。Dataform CLI ツールと BigQuery を使用した UDF 単体テストは、以下の理由から無償で提供されています。
オープンソースの Dataform CLI ツールは、BigQuery API とのみ通信する無料のスタンドアロン ツールです。
BigQuery では、UDF の作成、置き換え、呼び出しに対して費用が発生しません。
テストデータは、Dataform CLI が実行する SQL クエリの静的な値として提供されます。そのため、テーブルデータはスキャンされず、クエリごとに処理されるバイト数はゼロです。
次のセクションでは、UDF 単体テストの例を実行する方法と、独自の単体テストを作成する方法について説明します。
UDF 単体テストの例を実行する
このテスト フレームワークの動作を確認する最良の方法は、実際にご自身で試していただくことです。オープンソース サンプルには、bigquery-utils リポジトリ内のコミュニティ提供の UDF に対し、いくつかの単体テストを実行する方法が示されています。以下のシンプルな 4 つの手順を行います。
1. 次のいずれかの方法で、bigquery-utils リポジトリのクローンを作成します。
こちらをクリックして、Google Cloud Shell にリポジトリのクローンを自動的に作成します(推奨)。詳細なチュートリアルが Cloud Shell の右側に自動で起動します。また、次のコマンドを使用して、手動でチュートリアルを起動することも可能です。cloudshell launch-tutorial tutorial.md
次のコマンドを実行して、リポジトリのクローンを手動で作成し、正しいディレクトリに移動します。
git clone https://github.com/GoogleCloudPlatform/bigquery-utils.git
cd bigquery-utils/dataform/examples/dataform_udf_unit_test
2. Dataform CLI ツールをインストールします。npm i -g @dataform/cli && dataform install
3. 次のコマンドを実行して、Dataform 認証情報ファイル「.df-credentials.json」を生成します。dataform init-creds bigquery
以下を選択するように求められます。
データセットのロケーション(「米国」を選択)
認証方法(アプリケーションのデフォルト認証情報を選択)。
Cloud Shell で実行していない場合は、gcloud で次のコマンドを実行して環境を認証してください。gcloud auth application-default login請求先プロジェクト ID(クエリを実行するプロジェクトを選択)。
4. 次のコマンドを使って単体テストを実行します。dataform test
詳しい説明
今回の例では、test_cases.js というファイルがあり、このファイルにテスト対象 UDF の単体テスト入力と想定出力が含まれています。以下は、url_parse UDF の test_cases.js からの抜粋です。url_parse UDF は、URL および抽出する URL の一部(ホストやパスなど)を入力として受け取り、URL のパスから指定した部分を返します。
提供されているコード スニペットの冒頭で、unit_test_utils.js ファイルが generate_udf_test 関数を公開していることがわかります。この関数は、入力と想定出力を、単体テストで実行される適切な SELECT SQL ステートメントに変換します。dataform test コマンドを実行すると、これらの SELECT SQL ステートメントが BigQuery で実行されます。次に、Dataform は SELECT SQL ステートメントの結果が一致しているかをチェックすることで、想定通りの出力が得られたかを検証します。
内部的な動作を確認するには、BigQuery コンソールに移動し、[クエリ履歴] タブをクリックします。ここでは、Dataform が BigQuery で実行する generate_udf_test 関数によって作成された SQL クエリを確認できます。以下の抜粋は、生成された SELECT クエリと、test_cases.js で提供された入力がテスト対象の UDF に引数として渡される様子を示しています。
次に、指定した想定出力が以下の SELECT SQL ステートメントにコンパイルされます。これは、Dataform により、前の SQL ステートメントの udf_output との比較に使用されます。
dataform test コマンドを実行すると、Dataform は BigQuery を呼び出してこれらの SELECT SQL ステートメントを実行し、SQL クエリの実際の出力が想定出力と等しいかどうかをチェックします。
上の図は、Dataform CLI が test_cases.js の入力と想定出力を使用し、BigQuery SQL クエリを構築して実行する様子を示しています。次に、Dataform は、これらのクエリの実際の出力が想定出力と一致しているかどうかを検証します。
独自の UDF 単体テスト
独自の Dataform プロジェクト ディレクトリ構造を作成し、独自のテストケースを含む test_cases.js ファイルを追加することで、独自の UDF 単体テストを簡単に作成できます。
以下の 5 つの手順で、この手法を試すことができます。
1. dataform_udf_unit_test ディレクトリで以下の 2 つの環境変数に独自の値を設定し、次のコマンドを実行して Dataform プロジェクト ディレクトリ構造を作成します。
2. includes/unit_test_utils.js ファイルを独自の includes/ ディレクトリにコピーし、新しいディレクトリに移動してから認証情報ファイル(.df-credentials.json)を作成します。
3. 新しく test_cases.js ファイルを作成します。
4. テストする UDF 用に generate_udf_test() 関数の呼び出しを追加します。generate_udf_test() 関数は、次の 2 つの位置引数を取ります。
1 つ目の引数は、テストする UDF の名前を表す文字列です。UDF の完全修飾名(例: bqutil.fn.url_parse)または UDF 名のみ(例: url_parse)を使用できます。UDF 名のみを指定した場合、関数は dataform.json ファイルの defaultDatabase 値と defaultSchema 値を使用します。
- 2 つ目の引数は JavaScript オブジェクトの配列で、各オブジェクトはテストケースの UDF 位置入力と想定出力を保持します。
注: 入力としてさまざまなデータ型を UDF が受け入れる場合、入力のデータ型ごとにテストケースをグループ化し、そのグループごとに generate_udf_test ケースの呼び出しを個別に作成する必要があります。この実装の例については、test_cases.js の json_typeof UDF をご覧ください。
5. 単体テストを実行し、UDF が期待通りに動作するかどうかを確認します。dataform test
オープンソース サンプルの実行方法と、CLI ツールを使用して独自の単体テストを作成および構築する方法が理解できたことと思います。これで、テスト戦略を CI / CD パイプラインに組み込んで、BigQuery で UDF をデプロイおよびテストする準備が整いました。
謝辞
このブログ投稿とテスト フレームワークの構築のため、継続的にフィードバックと助言をくれた Dan Lee と Ben Birt に感謝します。
- 戦略的クラウド エンジニア Michaella Schaszberger
- 戦略的クラウド エンジニア Daniel De Leo