SQL Server中存储过程的单元测试

SQL Server中存储过程的单元测试,sql,sql-server,unit-testing,stored-procedures,test-first,Sql,Sql Server,Unit Testing,Stored Procedures,Test First,我想在一个项目中实现测试优先开发,该项目将仅使用SQL Server中的存储过程和函数来实现 有没有一种方法可以简化存储过程和函数的单元测试的实现?如果没有,那么创建这些单元测试的最佳策略是什么?这是可行的。创建测试,并在设置中创建一个新的db实例,为其提供一些数据,然后执行该过程。验证你的假设,就像我得到了正确的数据一样。删除测试数据库,然后在下一次测试中再次执行所有操作。当然可以执行xUnit风格的SQL单元测试和用于数据库开发的TDD—过去4年我一直在这样做。有许多流行的基于T-SQL的测

我想在一个项目中实现测试优先开发,该项目将仅使用SQL Server中的存储过程和函数来实现


有没有一种方法可以简化存储过程和函数的单元测试的实现?如果没有,那么创建这些单元测试的最佳策略是什么?

这是可行的。创建测试,并在设置中创建一个新的db实例,为其提供一些数据,然后执行该过程。验证你的假设,就像我得到了正确的数据一样。删除测试数据库,然后在下一次测试中再次执行所有操作。

当然可以执行xUnit风格的SQL单元测试和用于数据库开发的TDD—过去4年我一直在这样做。有许多流行的基于T-SQL的测试框架,例如tsqlunit。红门在这方面也有一个产品,我已经简要介绍过

当然,您可以选择用另一种语言编写测试,如C#,并使用NUnit调用它们,但这正进入集成领域,而不是单元测试,并且更适合验证后端和SQL公共接口之间的交互

也许我可以大胆地向您介绍我自己的免费(100%T-SQL)SQL Server单元测试框架(SS unit)的手册,因为它提供了一些关于如何编写单元测试的想法,即使您不打算使用它:-

几年前,我还向ACCU做了一个关于如何对T-SQL代码进行单元测试的演示,幻灯片中还提供了一些关于如何在测试之前或之后编写单元测试的示例

这是一篇博客文章,内容围绕我几年前在ACCU会议上的数据库TDD演讲,它整理了一些关于开发数据库API的相关文章(遗憾的是,都是我写的)


(这似乎是一个相当无缘无故的关注。这不是故意的,只是我有一些我认为相关的零碎的链接。如果它违反了SO规则,我会很高兴地删除答案)

数据库中的单元测试实际上是一个大话题,有很多不同的方法可以做到这一点。我认为最简单的方法是编写自己的测试,如下所示:

BEGIN TRY
<statement to test>
THROW 50000,'No error raised',16;
END TRY
BEGIN CATCH
if ERROR_MESSAGE() not like '%<constraint being violated>%'
THROW 50000,'<Description of Operation> Failed',16;
END CATCH
开始尝试
掷50000,“无错误”,16;
结束尝试
开始捕捉
如果错误消息()与“%”不同
扔5万个“失败”,16个;
端接
通过这种方式,您可以实施不同类型的数据测试:
-检查约束、外键约束测试、唯一性测试等…

您的帖子对我非常有用,谢谢。我开始探索您的单元测试框架,目前看来非常符合我的意图。我只是在安装脚本中发现了一个可能的问题。文件CreateSchemas.sql不创建“测试”架构。如果有更好的地方发布这个问题,请让我知道。最后一个建议是,您应该将代码放在像github这样的开源存储库中,它将更易于访问,并且您可以为自愿参与的人员提供进一步的改进。这是一个好的单元测试吗?如果您正在测试一个存储过程,这将检查它是否存在以及它是否运行,但不会检查它是否做了正确的事情(即:它的行为是其他地方依赖的)。