您如何对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框架没有区别吗?因此,该工具以与.Net框架相同的方式存在,但是您可以在C#中进行TDD
user87166

我也不会测试Framework方法。我认为他们已经在工作了。如果要测试ETL工具的配置,则无需在ETL工具中重新创建逻辑即可;只需使用该工具即可。
罗伯特·哈维

1
然后,使用您期望从ETL中获得的期望,提议的数据和提议的配置编写测试。如果愿意,可以对它们进行概念测试,但是该功能已经存在。 纯粹的“测试优先”开发适用于尚不存在的事物。无论您做什么,都不要重新发明ETL工具!
罗伯特·哈维

2
“由于基础数据的年龄发生了变化”-提供稳定的测试数据作为输入有何困难?如果涉及到时间相关的计算,请模拟参考计时器。
Doc Brown

Answers:


2

我过去所做的是使用验收测试驱动开发。ETL代码通常分布在不同的阶段/语言和技术中,并且紧密耦合。大多数ETL过程取决于管道中转换的顺序。

仅在ETL中使用单元测试的风险是它不会涵盖集成。转换的顺序与许多ETL中的实际转换是同等的。如果我将资源用于创建自动化测试套件,则请确保它也涵盖了序列。

对于每个独特的转换序列,我将专注于TDD,或者至少将这些测试包含在更大的测试套件中。如果组合太多,则可能必须选择要测试的序列。这个想法是验证将用于其上的数据集的ETL管道。以及确保您对所有代码都进行了测试覆盖。


0

ETL可以使用TDD进行,并且测试与大多数项目非常相似,即

编写失败的测试(红色)修复失败的代码(绿色)使代码有效且可维护(重构)

因此,对于ETL,可能是:

  • 编写脚本以加载1条记录
  • 失败(未定义数据源)
  • 定义来源[绿色]
  • 无需重构
  • 编写测试以加载1条记录,仅填写1个字段
  • 失败(没有为该字段编写代码)
  • 定义该字段的代码详细信息
  • 重构
  • 定义查找具有有效值的属性的失败测试[红色]
  • 等等

前8个步骤与TDD无关,因为它们不会留下任何测试。其余的不清楚。
布拉特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.