我想在一个项目中实现测试优先开发,该项目仅使用 SQL Server 中的存储过程和函数来实现。
有没有办法简化存储过程和函数的单元测试的实现?如果不是,那么创建这些单元测试的最佳策略是什么?
我想在一个项目中实现测试优先开发,该项目仅使用 SQL Server 中的存储过程和函数来实现。
有没有办法简化存储过程和函数的单元测试的实现?如果不是,那么创建这些单元测试的最佳策略是什么?
为数据库开发做 xUnit 风格的 SQL 单元测试和 TDD 当然是可能的——在过去的 4 年里我一直在这样做。有许多流行的基于 T-SQL 的测试框架,例如 tsqlunit。Red Gate 在这方面也有一个产品,我简要介绍过。
然后当然你可以选择用另一种语言编写测试,例如 C#,并使用 NUnit 来调用它们,但这是进入集成领域而不是单元测试,并且更适合验证后端和您的 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 规则,我会很乐意删除答案)
这是可行的。创建测试并在设置中创建一个新的 db 实例并为其提供一些数据,然后执行 procs。验证你的假设,就像我得到了正确的数据一样。删除测试数据库,然后在下一个测试中再次执行所有操作。
数据库中的单元测试实际上是一个很大的话题,并且有很多不同的方法可以做到这一点。我最简单的方法是编写你自己的测试,如下所示:
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
通过这种方式,您可以实现不同类型的数据测试: - CHECK 约束、外键约束测试、唯一性测试等等......