ETLおよびレポートプロジェクトにTDDメソッドを使用してユニットテストを行うにはどうすればよいですか?


12

ETLプロジェクトは、SSIS、PowerCenterなどのETL(抽出-変換-ロード)ツールを使用して作成されたプロジェクトです。

これらには通常、外部ソースからのデータの読み取り、ステージングデータベースへのデータの読み込み、特定の変換の実行、最終データベースへの読み込みが含まれます。

簡単な例は、SSISを使用して、SSISを使用して学校の先生が提供するExcelファイルを読み取り、データベースにロードすることです。次に、ストアドプロシージャまたは複数のSSISパッケージを作成して各生徒の成績を計算し、そのデータをデータマート\ウェアハウスにロードします

次に、マートの上にストアドプロシージャを構築して、レポートツール(SSRS \ Excel \ etc)が視覚化を生成するために使用する出力を生成します。

このシナリオでTDDと適切な単体テストを実行する方法を理解しようとしています。ETLのテストは、主にステージングテーブルにロードされたデータがソースからのデータの正しいサブセットであることを確認することに関するものです。そのため、テストを実装すると、ETLのミニバージョンが実装されます。レポートSPの出力はテーブル自体のデータに依存するため、スクラブされたテストデータを含むデータベースを作成したとしても、メンテナンスの悪夢がなければ安定した出力データのセットを持つことはできません。

例:

スプリント1:学生テーブルには名前、年齢、成績が含まれます

このテーブルのテストデータを作成し、それに基づいて単体テストを作成します

スプリント2:性別フィールドがテーブルに追加されます。

学生フィールドのデータを更新して性別属性を設定すると、データが変更されたため、テストケースは無効になります。しなければ、性別の列を必要とするテストケースを作成できません


テストするツールが既に存在する場合、TDDではありません。普通のテストを書くだけです。
ロバートハーヴェイ

@RobertHarvey実際には、C#コードを記述するとき、ETLツールは.Net Frameworkと違いはありませんか?したがって、ツールは.Netフレームワークと同じ方法で存在しますが、C#でTDDを実行できます
-user87166

Frameworkメソッドもテストしません。すでに動作していると思います。ETLツールの構成をテストする場合、ETLツールでロジックを再作成する必要はありません。ツールを使用するだけです。
ロバートハーヴェイ

1
次に、ETL、提案されたデータ、および提案された構成から取得することが期待される期待を使用して、テストを記述します。必要に応じて概念テストを行いますが、機能は既に存在します。 純粋な「テストファースト」開発は、まだ存在しないもののためのものです。何をするにしても、ETLツールを再発明しない
ロバートハーヴェイ

2
「基本データの年齢が変更されたため」- 安定したテストデータを入力として提供するのが難しいのは何ですか?時間に依存する計算が含まれる場合は、参照タイマーをモックアウトします。
Doc Brown

回答:


2

私が過去に行ったことは、Acceptance Test Driven Developmentを使用することです。ETLコードは、多くの場合、さまざまな段階/言語および技術に分散され、密結合されています。ほとんどのETLプロセスは、パイプライン内の変換のシーケンスに依存しています。

ETLでのみユニットテストを使用する場合のリスクは、統合をカバーしないことです。変換の順序付けは、多くのETLの実際の変換と同じ部分です。自動化されたテストスイートの作成にリソースを費やしている場合は、シーケンスもカバーしていることを確認します。

独自の変換シーケンスごとにTDDに焦点を当てるか、少なくともこれらのテストをより大きなテストスイートに含めます。組み合わせが多すぎる場合は、テストするシーケンスを選択する必要があります。アイデアは、ETLパイプラインが使用されるデータセットのETLパイプラインを検証することです。すべてのコードでテストカバレッジがあることを確認します。


0

ETLはTDDで実行でき、ほとんどのプロジェクトとほぼ同様にテストできます。

失敗するテスト(赤)を書く失敗を修正する(緑)コードのパフォーマンスと保守性を高める(リファクタリング)

したがって、ETLの場合は次のようになります。

  • 1レコードをロードするスクリプトを作成します
  • 失敗(データソースが定義されていない)
  • ソースの定義[緑]
  • リファクタリング不要
  • 1つのフィールドのみを埋めて1つのレコードをロードするテストを作成します
  • 失敗(そのフィールドにコードは書かれていません)
  • そのフィールドのコード詳細を定義する
  • リファクタリング
  • 有効な値を持つ属性を検索する失敗したテストを定義する[赤]

最初の8つのステップは、テストを残さないため、TDDとは関係ありません。残りは明確ではありません。
ブラット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.