首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tSQLt测试工具2017: Server数据工具2017与tSQLt

tSQLt测试工具2017: Server数据工具2017与tSQLt
EN

Stack Overflow用户
提问于 2017-12-17 22:21:05
回答 3查看 5.3K关注 0票数 12

我有一个新的项目,需要SQL Server单元测试,以及使用VSTS的CI/CD。

以下是所需的功能

  • 对存储过程进行SQL server单元测试,为每个测试设置初始目标表,并清理
  • sql中的单元测试
  • 带VSTS和Git的CI/CD
  • 设置简单易用

我研究了2017年的SSDT,这似乎不错。但是它似乎缺乏一个特性,在测试前的步骤中,公共设置脚本可以很容易地在每个测试之间共享。它可能缺乏其他应该可供日常使用的功能。但我可能错了。

哪种工具更适合2017年的一般sql server单元测试?

用于的Server数据工具

TSQLT

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-18 07:28:35

没有更多用于SQL开发的单元测试解决方案的原因之一是,正确的单元测试在数据库中本来就比较困难,所以人们不会这么做。这是因为数据库维护状态和引用完整性。假设为一个存储过程(order_detail_update_status)编写了一个单元测试,该存储过程更新了order_detail表上的状态标志。order_detail表依赖于order_header表和product表,order_header则具有customeremployee的外键,而产品表可能依赖于product_categoryproduct_typesupplier。也就是说,至少有七个表(可能更多)需要填充有效数据才能编写一个测试,除了一个表之外,所有这些表都与被测试的代码无关。

因此,您应该在单元测试解决方案中寻找的正是这样一种能力--用最少的设置测试离散的代码单元。因此,理想情况下,您可以在order_detail中设置所需的测试数据,而忽略其余的表--我知道只有一个测试框架允许您这样做。

此外,单元测试应该有最小的失败原因,在上面的示例中,order_detail_update_status只更新order_detail表上的一行。如果向customer表添加了一个新的null列,测试集没有处理该列,那么您就会遇到这样一个场景,即我们的测试可能因为完全无关的原因而失败。这使得测试变得非常脆弱,并且在紧迫的交付截止日期的压力下,开发人员将很快放弃编写和维护测试。

一套单元测试应该可以按任何顺序运行,没有相互依赖关系,一个好的测试框架应该支持这一点,以及对模拟对象的设置、拆卸和支持(这可能是同一个框架的一部分)。在上面的场景中,如果您不想花费大量时间修复没有“好”原因而失败的测试,那么模拟order_detail表来测试只涉及order_detail表的模块是最重要的特性之一。

因此,就您的需求和上述要点而言,我知道只有一个框架可以做到这一切-- tSQLt。这是基于现实世界的经验-我们有超过6,000个tSQLt单元测试在我的上一个项目。它包括以下几个方面:

  • 单元测试存储过程、功能和视图
  • 模拟表、视图和函数
  • 模拟(或间谍)存储过程--用于隔离、重放或预定义的结果。
  • 套间设置
  • 自动拆卸(因为每个测试都在自己的翻译中运行)
  • 单元测试是完全隔离的,可以以任何顺序执行。

它在CI/CD中与VSTS一起工作得很好,而且由于所有单元测试都是用tests编写的,所以它非常容易使用。

在Visual中使用tSQLt的最佳方法是使用复合项目,其中应用程序数据库对象和模块在一个项目中维护,而tSQLt框架和所有单元测试是第二个项目的一部分。有一个很好的方法可以让您开始使用这个这里

几年前,我写了一篇关于tSQLt对简简单单的好处的更详细的文章,这可能也有帮助。

票数 29
EN

Stack Overflow用户

发布于 2019-05-08 15:14:22

请注意,微软正在推广懒人,参见通道9: DevOps管道中的Server数据库单元测试。我们发现它在Azure SQL安装程序中运行得相当好。对于Azure上的tSQLt,我记得有关启用CLR和可信任选项的一些问题,但也看到它仍然有效,例如:

票数 5
EN

Stack Overflow用户

发布于 2017-12-19 08:10:37

你可以重复使用脚本,你可以做很多事情。快速回答你的问题就是使用tSQLt。到目前为止,没有比tSQLt更强大、更灵活、更易于使用的Server单元测试框架了。开始使用就这样了。在SSDT中安装是非常容易和快速的。@datacentricity给您写了足够多关于该框架的文章,如果您想知道更多,请阅读他提供的文章。

我只想添加一些东西,让你的生活变得更容易一些,如果你要朝着tSQLt的方向走:

  • 对所有交叉数据库或链接对象使用同义词;
  • 使用SSMS中的标准脚本创建所有tSQLt对象,然后将对象导入SSDT
  • 为tSQLt对象创建单独的项目,并将其标记为“与您愿意测试的数据库相同的数据库”
  • 在tSQLt项目中创建预脚本并从其中运行原始数据库项目的预脚本。
  • 在tSQLt项目中创建post,并从那里运行原始数据库项目的post。
  • 在tSQLt后记脚本中作为最后一条语句编写"EXEC tSQLt.RunAll“。
  • 在tSQLt项目和设置中创建发布脚本,确保它将部署“扩展属性”
  • 确保所有测试类(模式)都具有扩展属性语句。

也许还有其他的细微差别,但只要从一些东西开始,我很肯定你很快就会爱上tSQLt的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47860037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档