TSQL 单元测试工具 2017:SQL 服务器数据工具 2017 对比 tSQLt
TSQL Unit Test tools 2017: SQL Server Data Tools 2017 vs tSQLt
我有一个新项目需要 SQL 服务器单元测试,CI/CD 使用 VSTS。
以下是需要的功能
SQL 针对存储过程的服务器单元测试,为每个测试设置初始目标表并清理
sql
中的单元测试
CI/CD 与 VSTS 和 Git
设置简单,使用方便
我查看了 SSDT 2017,看起来不错。但它似乎缺少可以在预测试步骤中的每个测试之间轻松共享通用设置脚本的功能。它可能缺少日常使用的其他功能。但我可能错了。
哪种工具更适合 2017 年的一般 sql 服务器单元测试?
SQL 开发中没有更多的单元测试解决方案的原因之一是,正确的单元测试在数据库中本来就更难,所以人们不这样做。这是因为数据库维护状态和参照完整性。想象一下,为更新 order_detail
table 上的状态标志的存储过程 (order_detail_update_status
) 编写单元测试。 order_detail table 依赖于 order_header
和 product
table,order_header 又具有指向 customer
的外键和 employee
而乘积 table 可能取决于 product_category
、product_type
和 supplier
。至少有七个 table(可能更多)需要用有效数据填充才能编写一个测试,而除了其中一个 table 之外,其他所有 table 都与被测代码无关。
因此,您应该在单元测试解决方案中寻找的正是 - 以最少的设置测试离散代码单元的能力。因此,理想情况下,您可以只在 order_detail
中设置所需的测试数据,而忽略 table 的其余部分——我知道只有一个测试框架允许您这样做。
此外,单元测试应该有最少的失败原因,在上面的示例中,order_detail_update_status
仅更新 order_detail table 上的一行。如果一个新的非空列被添加到客户 table,这不是由测试设置处理的,那么我们的测试可能会因为完全不相关的原因而失败。这使得测试非常脆弱,并且在紧迫的交付期限压力下,开发人员将很快放弃编写和维护测试。
一套单元测试应该可以按任何顺序运行,没有相互依赖关系,一个好的测试框架应该支持这一点以及设置、拆除和支持模拟对象(可能是也可能不是同一个框架)。在上面的场景中,模拟 order_detail
table 来测试只触及 order_detail table 的模块的能力是最重要的功能之一,如果你不这样做的话想花费大量时间修复无故失败的测试 "good"。
因此,就您的要求和上述几点而言,据我所知,只有一个框架可以完成所有这些工作 - tSQLt。这是基于现实世界的经验——我们对我的上一个项目进行了超过 6,000 tSQLt 单元测试。它包括以下功能:
- 单元测试存储过程、函数和视图
- Mock tables、视图和函数
- 模拟(或间谍)存储过程 - 用于隔离,
重播或预定义的结果
- 套件设置
- 自动拆卸(因为每个测试都以自己的翻译运行)
- 单元测试完全隔离,可以按任何顺序执行
它在 CI/CD 中与 VSTS 配合得很好,并且由于所有单元测试都是用 T-SQL 编写的,因此非常易于使用。
在 Visual Studio 中使用 tSQLt 的最佳方式是使用复合项目——应用程序数据库对象和模块在一个项目中维护,而 tSQL t 框架和所有单元测试都是第二个项目的一部分。有一篇很好的文章可以帮助您开始此 here。
几年前我写了一篇关于 tSQLt 对 Simple-Talk 的好处的更详细的文章,这可能也会有所帮助
你可以重复使用脚本,你可以做很多事情。快速回答您的问题只需使用 tSQLt。 SQL Server 的其他单元测试框架没有比 tSQLt 更 powerful/flexible 和易于使用的。刚开始使用就是这样。在 SSDT 中设置非常简单快捷。 @datacentricity 写了很多关于该框架的文章,如果您想了解更多,请阅读他提供的文章。
我会添加一些东西让你的生活更轻松,如果你去 tSQLt 方向:
- 对所有跨数据库或链接对象;
使用同义词
- 使用 SSMS 中的标准脚本创建所有 tSQLt 对象,然后将对象导入 SSDT
- 为 tSQLt 对象创建单独的项目并将其标记为与您的数据库“相同的数据库”愿意测试
- 在tSQLt项目中创建前置脚本和运行的前置脚本您的 原始 数据库项目来自那里
- 在 tSQLt 项目中创建 post-脚本,并且 运行 post- 原始数据库项目的脚本
- 在 tSQLt post-script 作为最后一条语句写入 "EXEC tSQLt.RunAll"
- 在 tSQLt 项目中创建发布脚本,并在设置中确保它将部署“扩展属性 “
- 确保所有测试 类(模式)都有扩展属性语句
可能还有其他一些细微差别,但只要从某件事开始,我很确定您很快就会开始喜欢 tSQLt。
请注意,Microsoft 正在推广 slacker, see e.g. Channel 9: SQL Server Database Unit Testing in your DevOps pipeline。我们发现它在 Azure SQL 设置中运行良好。对于 Azure SQL 上的 tSQLt,我记得一些关于启用 CLR 和 TRUSTWORTHY 选项的问题,但也看到它应该仍然有效,例如这里:
我有一个新项目需要 SQL 服务器单元测试,CI/CD 使用 VSTS。
以下是需要的功能
SQL 针对存储过程的服务器单元测试,为每个测试设置初始目标表并清理
sql
中的单元测试
CI/CD 与 VSTS 和 Git
设置简单,使用方便
我查看了 SSDT 2017,看起来不错。但它似乎缺少可以在预测试步骤中的每个测试之间轻松共享通用设置脚本的功能。它可能缺少日常使用的其他功能。但我可能错了。
哪种工具更适合 2017 年的一般 sql 服务器单元测试?
SQL 开发中没有更多的单元测试解决方案的原因之一是,正确的单元测试在数据库中本来就更难,所以人们不这样做。这是因为数据库维护状态和参照完整性。想象一下,为更新 order_detail
table 上的状态标志的存储过程 (order_detail_update_status
) 编写单元测试。 order_detail table 依赖于 order_header
和 product
table,order_header 又具有指向 customer
的外键和 employee
而乘积 table 可能取决于 product_category
、product_type
和 supplier
。至少有七个 table(可能更多)需要用有效数据填充才能编写一个测试,而除了其中一个 table 之外,其他所有 table 都与被测代码无关。
因此,您应该在单元测试解决方案中寻找的正是 - 以最少的设置测试离散代码单元的能力。因此,理想情况下,您可以只在 order_detail
中设置所需的测试数据,而忽略 table 的其余部分——我知道只有一个测试框架允许您这样做。
此外,单元测试应该有最少的失败原因,在上面的示例中,order_detail_update_status
仅更新 order_detail table 上的一行。如果一个新的非空列被添加到客户 table,这不是由测试设置处理的,那么我们的测试可能会因为完全不相关的原因而失败。这使得测试非常脆弱,并且在紧迫的交付期限压力下,开发人员将很快放弃编写和维护测试。
一套单元测试应该可以按任何顺序运行,没有相互依赖关系,一个好的测试框架应该支持这一点以及设置、拆除和支持模拟对象(可能是也可能不是同一个框架)。在上面的场景中,模拟 order_detail
table 来测试只触及 order_detail table 的模块的能力是最重要的功能之一,如果你不这样做的话想花费大量时间修复无故失败的测试 "good"。
因此,就您的要求和上述几点而言,据我所知,只有一个框架可以完成所有这些工作 - tSQLt。这是基于现实世界的经验——我们对我的上一个项目进行了超过 6,000 tSQLt 单元测试。它包括以下功能:
- 单元测试存储过程、函数和视图
- Mock tables、视图和函数
- 模拟(或间谍)存储过程 - 用于隔离, 重播或预定义的结果
- 套件设置
- 自动拆卸(因为每个测试都以自己的翻译运行)
- 单元测试完全隔离,可以按任何顺序执行
它在 CI/CD 中与 VSTS 配合得很好,并且由于所有单元测试都是用 T-SQL 编写的,因此非常易于使用。
在 Visual Studio 中使用 tSQLt 的最佳方式是使用复合项目——应用程序数据库对象和模块在一个项目中维护,而 tSQL t 框架和所有单元测试都是第二个项目的一部分。有一篇很好的文章可以帮助您开始此 here。
几年前我写了一篇关于 tSQLt 对 Simple-Talk 的好处的更详细的文章,这可能也会有所帮助
你可以重复使用脚本,你可以做很多事情。快速回答您的问题只需使用 tSQLt。 SQL Server 的其他单元测试框架没有比 tSQLt 更 powerful/flexible 和易于使用的。刚开始使用就是这样。在 SSDT 中设置非常简单快捷。 @datacentricity 写了很多关于该框架的文章,如果您想了解更多,请阅读他提供的文章。
我会添加一些东西让你的生活更轻松,如果你去 tSQLt 方向:
- 对所有跨数据库或链接对象; 使用同义词
- 使用 SSMS 中的标准脚本创建所有 tSQLt 对象,然后将对象导入 SSDT
- 为 tSQLt 对象创建单独的项目并将其标记为与您的数据库“相同的数据库”愿意测试
- 在tSQLt项目中创建前置脚本和运行的前置脚本您的 原始 数据库项目来自那里
- 在 tSQLt 项目中创建 post-脚本,并且 运行 post- 原始数据库项目的脚本
- 在 tSQLt post-script 作为最后一条语句写入 "EXEC tSQLt.RunAll"
- 在 tSQLt 项目中创建发布脚本,并在设置中确保它将部署“扩展属性 “
- 确保所有测试 类(模式)都有扩展属性语句
可能还有其他一些细微差别,但只要从某件事开始,我很确定您很快就会开始喜欢 tSQLt。
请注意,Microsoft 正在推广 slacker, see e.g. Channel 9: SQL Server Database Unit Testing in your DevOps pipeline。我们发现它在 Azure SQL 设置中运行良好。对于 Azure SQL 上的 tSQLt,我记得一些关于启用 CLR 和 TRUSTWORTHY 选项的问题,但也看到它应该仍然有效,例如这里: