2

为了帮助,这是我的环境:

  • Visual Studio 2010 和 c#
  • 带有 Sql 管理工作室的 Sql Server 2008 R2
  • 单元

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

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

例如:

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

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

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

-- --> [其他测试的几行].sql

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

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

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

这是与数据库进行集成测试的好方法吗?

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

你有最佳实践清单吗?

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

非常感谢。

4

2 回答 2

3

您说您不想使用 ORM,但我选择在回答中忽略这一点。对不起 :)

如何填充

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

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

好处:

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

缺点:

  • 它更慢
  • 如果您需要大量数据(这种情况很少见),则效果不佳

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

清理数据库

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

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

于 2012-04-20T20:52:35.660 回答
1

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

从我自己的角度来看,主要的好处是:

  • dbFit 将在事务中隐式运行并在每次测试结束时自动回滚。
  • 层次结构使您能够添加可应用于多个测试的设置和拆卸脚本。
  • 您可以创建一组按顺序执行所有测试的单独测试。
  • 与我们的持续集成服务器 TeamCity 集成(在某种程度上)。
于 2012-04-19T19:30:44.933 回答