数据库集成测试结构
本文关键字:结构 集成测试 数据库 | 更新日期: 2023-09-27 18:31:36
为了提供帮助,这是我的环境:
- Visual Studio 2010 和 c# Sql
- Server 2008 R2 with Sql Management Studio
- 尼特
我正在创建许多将与数据库交互的集成测试。每个测试都必须有一个处于非常特定状态的数据库。我不想使用 ORM 或直接使用 Sql 管理工作室插入数据。
我想要的是几个结构与VMware快照相同的sql脚本。
例如:
--> [主脚本,其中包含系统表,例如映射到枚举的表].sql
-- --> [某些表格中的几行].sql
-- -- --> [其他表中的其他几行].sql
-- --> [另一次测试的几行].sql
-- -- --> [其他几行用于处理其他情况].sql
使用这种类型的结构,我将能够回滚到特定版本的快照,以将数据库设置为特定状态,然后在结构中创建快照的另一个分支。
在每次测试之前,我都会清理数据库中的所有表,然后执行特定的 sql 脚本。
这是使用数据库进行集成测试的好方法吗?
是否存在执行此类 sql 脚本结构的工具?
您是否列出了最佳实践列表?
如果我不知道我想做什么,那么进行此类测试的最佳架构和方法是什么?
谢谢。
你说你不想使用 ORM,但我选择在我的答案中忽略它。对不起:)
如何填充
我更喜欢使用与用户相同的操作将数据插入数据库。也就是说,如果我需要数据库中的产品订单,我使用管理界面创建产品,让用户使用公共界面创建一个帐户并让该用户下订单。
这不必通过单击实际 UI 中的按钮来完成,但最好使用 UI 的基础抽象。
好处:
- 数据库将具有与实际执行时相同的状态,而不是您认为它将具有的状态
- 如果您需要进行更改,例如对模式进行更改,则只需更改生产代码
- 测试涵盖了更多功能
- 数据库仅填充此特定用例所需的数据
- 测试更容易阅读(插入脚本不容易阅读)
缺点:
- 它更慢
- 如果您需要大量数据(这种情况很少见),则效果不佳
我只需要大量数据进行测试一次。为此,我创建了自己的声明性域特定语言,使用它可以在测试中的(逐字)字符串中指定必要的数据。然后我编写了一个工具来解析数据并将其插入数据库。
清理数据库
有几种方法可以清理数据库:重新创建数据库;删除所有数据;在事务中执行测试并进行回滚...不过,我最喜欢的不是清理数据库。对于每个测试,我都会创建一个新用户和一个新产品(使用上面的例子)。我不必清理数据库,测试仍然不会相互干扰。此外,如果我需要检查数据,我将在测试后提供数据。
希望它有所帮助,即使它不是您问题的答案。
我们使用 FitNesse 和 dbFit 进行此类数据库测试,我们也使用 SQL 2008 R2。我不确定VMWare快照的结构是什么样子的,但FinNesse允许您构建一组分层测试(具有类似wiki的结构和语法)。
从我自己的角度来看,主要好处是:
- dbFit 将在事务中隐式运行,并在每次测试结束时自动回滚。
- 分层结构使您能够添加可应用于多个测试的安装和拆卸脚本。
- 您可以创建一套按顺序执行所有测试的单独测试。
- (在某种程度上)与我们的持续集成服务器 TeamCity 集成。