数据库集成测试结构

时间:2012-04-19 19:07:57

标签: c# sql unit-testing integration-testing

求助,这是我的环境:

  • Visual Studio 2010和c#
  • 带有Sql Management studio的Sql Server 2008 R2
  • NUnit的

我正在创建许多与数据库交互的集成测试。每个测试必须具有处于非常特定状态的数据库。我不想用ORM插入数据或直接用Sql Management studio插入数据。

我想要的是一些结构与VMware快照相同的sql脚本。

例如:

- > [系统表的主脚本,如表映射到枚举的表] .sql

- - > [某些表格中的几行] .sql

- - - > [其他表中的其他几行] .sql

- - > [另一行测试的几行] .sql

- - - > [用于处理其他情况的其他几行] .sql

使用这种类型的结构,我将能够回滚到特定版本的快照,将数据库设置为特定状态,而不是在结构中创建另一个快照分支。

在每次测试之前,我清理数据库中的所有表,然后执行特定的sql脚本。

用数据库进行集成测试是一种好方法吗?

是否存在执行此类sql脚本结构的工具?

你是一份最佳实践清单吗?

如果我想做什么不是一个好主意,那么进行此类测试的最佳架构和方法是什么?

非常感谢。

2 个答案:

答案 0 :(得分:3)

你说你不想使用ORM,但我选择在我的回答中忽略它。对不起:)

如何填充

我更喜欢使用与用户相同的操作将数据插入数据库。也就是说,如果我需要在数据库中订购产品,我使用管理界面创建产品,让用户使用公共界面创建帐户并让该用户下订单。

不必通过单击实际UI中的按钮来完成,但最好使用UI的底层抽象。

优点:

  • 数据库将具有与为真实执行时相同的状态,而不是您认为
  • 的状态
  • 如果您需要进行更改,例如对于架构,您只需要更改生产代码
  • 测试涵盖了更多功能
  • 仅使用此特定用例所需的数据填充数据库
  • 测试更容易阅读(读取插入脚本并不容易)

缺点:

  • 慢一点
  • 如果您需要很多数据(这种情况很少见),效果不佳

我只需要一次大量的测试数据。为此,我创建了自己的声明性域特定语言,我可以在我的测试中的(verbatim)字符串中指定必要的数据。然后我编写了一个解析数据并将其插入数据库的工具。

清理数据库

有几种方法可以清理数据库:重新创建数据库;删除所有数据;在事务中执行测试并进行回滚...但我最喜欢的不是清理数据库。对于每个测试,我都会创建一个新用户和一个新产品(使用上面的示例)。我不必清理数据库,但测试不会互相干扰。另外,如果需要检查,我会在测试后得到数据。

希望它有点帮助,即使它不是你问题的答案。

答案 1 :(得分:1)

我们使用FitNessedbFit进行此类数据库测试,我们也使用SQL 2008 R2。我不确定VMWare快照的结构是什么样的,但FinNesse允许您构建一组分层的测试(具有类似结构和语法的wiki)。

我个人观点的主要好处是:

  • dbFit将在事务中运行,并在每次测试结束时自动回滚。
  • 分层结构使您可以添加可应用于多个测试的设置和拆卸脚本。
  • 您可以创建一系列单独的测试,按顺序执行所有测试。
  • 与我们的持续集成服务器TeamCity集成(在某种程度上)。