0

假设:我们针对 SQL Server 2005 使用 .NET 编码

我只是想知道大多数人如何将状态合并到影响他们数据库的单元测试中?我知道何时何地使用模拟,但是当你想超越它并实际进行一些数据库测试时......你使用什么策略来设置和拆除你的数据库?你每次测试都这样做吗?或在数据库中设置某个场景并针对该“世界状态”运行多个测试。任何建议都会有所帮助。谢谢。

4

6 回答 6

4

我针对空数据库运行大部分测试用例,这意味着只存在数据库模式,但没有数据。实际数据由测试用例或设置和拆卸根据需要创建和删除。这比准备好数据库需要更长的时间,但更能抵抗数据库架构更改。

于 2009-01-29T18:50:52.733 回答
2

以下是我在 NUnit 中所做的...在标有 [Setup] 属性的方法中启动数据库事务。根据需要设置数据库状态。NUnit 然后针对该状态运行测试。在一个标有 [TearDown] 属性的方法中回滚数据库事务。您永远不会以这种方式更改数据库的状态。

于 2009-01-29T18:49:48.820 回答
2

首先,我所有的数据库 DDL“脚本”都是用 C# 类编写的。我使用 Migrator.NET 来执行此操作:我有几个类,其中每个类都包含一些升级或降级数据库的逻辑。

我有一个名为“projectname_test”的数据库,我用它来运行我的单元测试,以应对需要访问数据库的需求。我的 Migrator.NET 类正在升级这个数据库。该数据库由 CI 进程 (CC.NET) 升级。

访问该数据库的单元测试将在运行后删除该数据库中的所有内容。而且,当我想彻底玩它时,我可以简单地删除我的测试数据库;它将由 CC.NET 进程重建。:)

于 2009-01-29T18:55:04.067 回答
1

如果您使用 NHibernate 作为 ORM,则可以轻松地将真正的 SQL Server 数据库(app.config 中的几行)与内存中的SQLite数据库交换,该数据库可以在每次测试时轻松重新创建。这样,将执行单元测试的集成/构建服务器不再需要访问 SQL Server。

于 2009-03-01T17:49:28.787 回答
1

看看这个问题和答案 如何使用 NUnit 测试与数据库相关的代码?

于 2009-03-01T17:43:23.140 回答
0

在大多数产品中,无论是大型托管网站还是带有数据库的收缩包装产品,您通常都有两个想要进行单元测试的场景(我理解有些人可能会超越简单的单元测试)

  1. 全新安装路径- 当您从头开始创建数据库时
    • 使用 MsBuild 和 SQLCMD 自动创建数据库,传入参数
    • 将 PowerShell 用于任何服务器级管理的东西
  2. 升级路径- 当您升级现有客户的数据库时
    • 将已清理的 Real World DB 的备份还原为您的基线
    • 如果必须在升级后应用升级
    • 再次使用 PowerShell、MsBuild、SQLCMD 来编排线束

对我来说,即使在进行单元测试时,我也喜欢使用“真实世界”数据进行测试,尤其是真实世界的数据量,以便尽早发现接近实施阶段的问题。所以总的来说,我什至不做模拟测试,而是去寻找一个更好的单元测试工具,它可以按需重建和运行。基本上是持续集成方法,或部分 CI(矛盾修饰法)方法。

请注意,如果您采用持续集成方法,即使在实施和开发过程中,您也要牢记的是可交付成果/发布到生产中的部署自动化。基本上从一开始就牢记“结束”,因为如果您的新功能不容易部署,那么它就毫无价值。当今天的大数据水平可扩展性通常意味着您将客户分隔在不同的数据库中并且必须以可预测的方式在其中几个数据库上重复运行部署脚本时,尤其如此。

有多少次开发人员声明他们“完成”了,但是您甚至不知道如何开始对其进行功能测试,因为它不能部署到开发人员环境以外的任何地方。

因此,您正在创建的单元测试工具不仅可以真正测试您的代码,还可以测试部署脚本。一般来说,为了实现这一点,我使用 Jenkins、MsBuild、PowerShell。如果涉及浏览器,我会使用 VirtualBox 为 VM 启动不同的浏览器。

于 2014-01-30T05:35:50.053 回答