我想在一个只使用SQL Server中的存储过程和函数实现的项目中实现Test First Development。
有一种方法可以简化存储过程和函数的单元测试的实现吗?如果没有,创建这些单元测试的最佳策略是什么?
答案 0 :(得分:5)
当然可以进行xUnit样式的SQL单元测试和TDD进行数据库开发 - 过去4年我一直这样做。有许多流行的基于T-SQL的测试框架,例如tsqlunit。红门也有这个领域的产品,我已经简要介绍过了。
当然,您可以选择使用其他语言编写测试,例如C#,并使用NUnit调用它们,但是这进入了集成领域而不是单元测试,更好地验证了您的背后的交互-end和你的SQL公共接口。
http://sourceforge.net/apps/trac/tsqlunit/
也许我可以大胆地指出你自己的免费(100%T-SQL)SQL Server单元测试框架 - SS-Unit的手册,因为它提供了如何即使您不打算使用单元测试,也可以编写单元测试: -
http://www.chrisoldwood.com/sql.htm
http://www.chrisoldwood.com/sql/ss-unit/manual/SS-Unit.html
几年前我还向ACCU介绍了如何对T-SQL代码进行单元测试,并且还提供了有关如何在之前或之后编写单元测试的一些示例的幻灯片。
http://www.chrisoldwood.com/articles.htm
以下是几年前在ACCU会议上根据我的数据库TDD演讲发表的一篇博文,其中围绕这种开发数据库API的方式整理了一些相关的帖子(遗憾的是)。
http://chrisoldwood.blogspot.co.uk/2012/05/my-accu-conference-session-database.html
(这似乎是一个相当无偿的肚脐凝视。这并不意味着,只是我有一些我认为相关的点点滴滴的链接。如果违反,我会高兴地删除答案SO规则)
答案 1 :(得分:1)
这是可行的。创建测试并在设置中创建db的新实例并为其提供一些数据,然后执行procs。验证您的假设,就像我得到了正确的数据一样。删除测试数据库,然后在下一次测试中再次完成。
答案 2 :(得分:1)
数据库中的单元测试实际上是一个很大的主题,有很多不同的方法可以做到。我最简单的方法是编写你自己的测试:
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
通过这种方式,您可以实现不同类型的数据测试: - 检查约束,外键约束测试,唯一性测试等......