TSQL单元测试工具2017:SQL Server数据工具2017 vs TSQLT



我有一个需要SQL Server单元测试的新项目,并且具有VSTS的CI/CD。

以下是所需的功能

  • SQL Server单元测试针对存储过程,每个测试的初始目标表设置并清理

  • SQL中的单元测试

  • ci/cd带VST和git

  • 易于设置,易于使用

我研究了SSDT 2017,这看起来不错。但是看来缺乏一个功能,可以在预测试步骤中轻松共享常见的设置脚本。它可能缺少应用于日常使用的其他功能。但是我可能错了。

哪种工具更适合2017年的常规SQL Server单元测试?

SQL Server数据工具用于Visual Studio

tsqlt

没有更多单位测试解决方案用于SQL开发的原因之一是因为适当的单位测试本质上更难数据库,因此人们不这样做。这是因为数据库保持状态和参考完整性。想象一下为存储过程(order_detail_update_status)编写单元测试,该过程更新order_detail表上的状态标志。Order_detail表具有对order_headerproduct表的依赖性,Order_header依次具有customeremployee的外键,而产品表可能取决于product_categoryproduct_typesupplier。那至少需要七个表(可能更多),需要用有效数据填充仅需编写一个测试,而其中一个表除了其中一个与正在测试的代码无关。

因此,您应该在单元测试解决方案中寻找的内容正是 - 最少设置的代码离散单元的能力。因此,理想情况下,您将能够在order_detail中设置所需的测试数据并忽略其余表格 - 我知道只有一个允许您执行此操作的测试框架。

此外,单位测试应最小的理由失败,在上面的示例中,order_detail_update_status仅在order_detail表上更新一行。如果将新的非零列添加到客户表中,该表未由测试设置处理,则您的测试可能会出于完全无关的原因而失败。这使得测试非常脆弱,并且在紧密交付期限的压力下,开发人员将迅速放弃写作和维护测试。

应按任何顺序运行一套单元测试,没有相互依存关系,良好的测试框架应在设置,拆卸和支持模拟对象的情况下支持此套件(它们可能是同一对象的一部分,也可能不是一部分框架)。在上述情况下,如果您不想花大量的时间修复未能失败的测试,则可以模拟order_detail表来测试仅触摸Order_detail表的模块的能力,这是最重要的功能之一。"原因。

因此,就您的要求而言,上述要点,我只有一个框架可以实现所有这些作用-TSQLT。这是基于现实世界的经验 - 我们上一个项目进行了6,000多个TSQLT单元测试。它包括以下芬特:

  • 单元测试存储过程,功能和视图
  • 模拟表,视图和功能
  • 模拟(或间谍)存储的过程 - 要么用于隔离,重播或预定的结果
  • 套房设置
  • 自动撕裂(每个测试都在其自身的翻译中进行)
  • 单位测试是完全隔离的,可以按任何顺序执行

它与CI/CD中的VST效果很好,并且由于所有单元测试均以T-SQL编写,因此很容易使用。

在Visual Studio中使用TSQLT的最佳方法是使用复合项目 - 在一个项目中,将应用程序数据库对象和模块保持在一个项目中,而TSQLT框架和所有单元测试都是第二个项目的一部分。有一个很好的当然可以让您从这里开始。

我写了一篇更详细的文章,内容是几年前TSQLT对简单讲话的好处促进懒惰者,例如频道9:DevOps管道中的SQL Server数据库单元测试。我们发现它可以在Azure SQL设置中运行良好。对于Azure SQL上的TSQLT,我记得有关启用CLR和值得信赖的选项的一些问题,但也认为它仍然应该起作用,例如这里:

  • 尼古拉·托马森(Nikolai Thomassen):使用azure devops用TSQLT测试Azure SQL单元
  • SQLSHACK:使用TSQLT框架的SQL单元测试

您可以重复使用脚本,您可以做很多事情。快速回答您的问题只是使用 tsqlt 。到目前为止,没有其他单元测试框架可以使SQL Server如此强大/灵活且易于使用。只是开始使用,仅此而已。在 ssdt 中设置非常容易且快速。 @datacentricity 给您足够关于该框架的文章,如果您想了解更多,然后阅读他提供的文章。

,如果您会去 tsqlt 方向:

,我只会添加几件事,使您的生活变得更加轻松
  • 使用同义词用于所有交叉数据库链接对象;
  • 使用 ssms 中的标准脚本创建所有 tsqlt 对象,然后将对象导入到 ssdt
  • tsqlt 对象创建单独的项目,并将其标记为" 相同的数据库",您愿意测试
  • tsqlt 项目中创建pre-script,并运行 pre-script 从那里
  • tsqlt 项目中创建post-cript
  • tsqlt post-script 中,作为最后的语句写" exec tsqlt.runall "
  • tsqlt 项目中创建发布脚本,在设置中,请确保它将部署" 扩展属性" " "
  • 确保所有测试类(架构)都有扩展的属性语句

可能还有其他一些细微差别,但要从某些东西开始,我很确定您很快就会开始爱上 tsqlt

最新更新