如何对远程存储过程进行单元测试

时间:2009-09-15 02:23:52

标签: c# sql-server unit-testing stored-procedures

我正面临着对数据访问层进行单元测试,所有数据访问层都通过存储过程调用数据库。 我打算创建一个用于单元测试的干净数据库,但是我发现大多数存储过程都会远程调用其他数据库,我不知道如何对这种存储过程进行单元测试,我应该创建所有相关的数据库吗?或任何其他解决方案?

3 个答案:

答案 0 :(得分:2)

通常,您可以越多地将数据访问层从应用程序的其余部分抽象出来,就越能对其进行单元测试。正如杰登在另一个回答中写道的那样,动态模拟等测试双打是一个很好的解决方案。

但是,正如我理解您的问题,您明确希望对数据访问层进行单元测试,这也没关系。在这种情况下,动态模拟不会对你有所帮助,因为你将测试应用程序中的最低层 - 没有什么可以嘲笑的。有些人坚持认为这不是单元测试而是集成测试,但我认为重要的部分是测试是否自动化,而不是我们是什么叫它。

在任何情况下,一旦开始测试数据访问层,您或多或少都必须按原样处理它。如果它使用远程存储过程,那么您也必须处理它。为了使设置更简单,您可能希望将“远程”数据库放在与“本地”数据库相同的框中。

单元测试主要是行为测试,所以没关系。应该有其他类型的测试(集成测试系统测试),它们使用与许多分布式机器等的现实设置来验证安全性,网络等是如何工作的意图,但这不应该是单元测试的主要焦点。

答案 1 :(得分:1)

看看对象嘲笑。

Rhino mocks是一个解决方案,你可以开始查看它here

模拟将允许您模拟数据库中的数据访问,而无需实际设置“测试”数据库。设置模拟有一些工作,但它可以保持测试的一致性。

答案 2 :(得分:1)

您可以考虑构建引用另一个数据库的数据库,以便通过视图访问所有远程表。我通常遵循以下命名惯例:

vw_[DATABASENAME]_[TABLENAME]

视图仅包含:

select * from server.dbo.tablename

所有存储过程都通过视图访问远程表,而不是直接访问远程数据库调用中的Person表,工作人员将是:

create view vw_STAFF_Person
as

select * from Staff.dbo.Person

go

create procedure stp_Select_Staff
as

select * from vw_Staff_Person

go

而不是

create procedure stp_Select_Staff
as

select * from Staff.dbo.Person

go

这样做的理由是,当您想要测试数据库时,您可能希望将所有远程数据库重新链接到“测试”远程数据库。当访问远程数据的唯一对象是简单视图而不是通常更多且复杂的存储过程时,这通常更容易实现。

我通常有一个工作设置,可以将视图重新编写到'测试'数据库,因此它会自动完成。

除此之外,我还经常设置一个作业,将生产数据库备份恢复到“测试”环境,以便可以对包含实时数据副本的系统进行部署之前的测试。同样,只需重新链接视图,而不是所有存储过程对远程系统的引用,这个过程变得更加容易。

为了更容易地对安全性进行测试,我还总是将数据库安全性设置在数据库roles的级别,而不是特定用户,因为我发现roles在生产中更具可移植性,测试和users之间的开发环境。

希望其中一些提示有所帮助。

相关问题