.net - 在数据库上运行测试的策略

标签 .net sql-server testing mstest

我已经开始处理一个包含 1800 多个功能/集成测试的现有项目。这些已使用 MSTest 进行编码。

其中许多直接连接到 SQL Server 数据库。数据库由代码生成器生成,其中包括创建数据库的代码生成器。生成数据库既慢又麻烦。

这表现为以下问题:

  • 测试清理数据库,这意味着我们必须维护一个单独的数据库用于测试,另一个用于使用应用程序。现在的程序是在运行测试和运行应用程序之间切换时更改数据库。
  • 每个分支都需要有自己的数据库,因为每个数据库中的数据库模型可能不同(这意味着每个分支 2 个数据库,步骤 1)
  • 它很慢
  • 必须安装 SQL Server 和数据库才能运行测试

我希望现有测试不依赖于此类安装,尽可能运行得更快,并且不必通过代码生成器维护数据库、处理连接字符串等。

我正努力尽快实现这一目标,因为重写测试不在预算内我已经引入模拟来帮助新测试减少对数据库的依赖,我现在的问题是现有测试。

我的第一个想法是更改我们的基本单元测试类以连接到 SQLite 数据库,该数据库将由已经生成主数据库而不是 SQL Server 数据库的代码生成器创建。然后可以在每次运行之间删除 SQLite 并将其重新复制到测试文件夹。这会很快,不需要有 2 个 SQL Server 数据库,事实上,如果只是运行测试,则不需要安装 SQL Server。

我的问题是生成的代码使用了很多 SQLite 中没有的概念; T-SQL、SQL Server 特定语法、模式、存储过程和嵌入式 clr 程序集。

然后我尝试了 SQL Server CE 4,它有许多与 SQLite 相同的限制。

除了重写代码以与 SQLite(或 CE)兼容、重写现有测试或我们维护 2 个 seperatedb 的系统之外,是否还有其他可用的替代方案?

编辑:将单元测试更改为功能测试,澄清了一些事情。把一些东西加粗。 我同意这些测试不是适当的单元测试。我同意在这里 mock 会很好。我正在尝试做的是尝试修复我面临的困惑局面。

最佳答案

您可以在每次测试前创建数据库快照,然后在测试后恢复数据库。创建和恢复快照比备份/恢复或完全重建数据库更简单

 CREATE DATABASE myDb_snapshot ON
    ( NAME = myDb_snapshot, FILENAME = 'C:\MSSQL\Data\myDb_snapshot.ss' )
 AS SNAPSHOT OF myDb;

在测试执行后恢复:

 RESTORE DATABASE myDb FROM DATABASE_SNAPSHOT = myDb_snapshot

因此,在每次测试后,您都可以恢复快照,让您的数据库为下一次测试做好准备。

作为额外说明:在模拟数据层上运行单元测试不能替代在“真实数据库”上运行测试。许多“链式”效应在您的数据库外部是不可见的。 (触发器/默认/权限/资源可用性)。 为了更快地测试用例并生成更多可插入代码,请模拟您的数据层。但最终您将不得不在“真实”数据库上运行您的测试用例。

关于.net - 在数据库上运行测试的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5732960/

相关文章:

.net - 为什么要用asp :HyperLink

.net - 需要带有 <supportedRuntime/> 的 .NET 4.0 完整配置文件

.net - TRADACOMS 发票帮助(EDI 发票)

sql - 为什么选择嵌套循环会导致 "self join"的执行时间过长

c# - c# 中的 DateTime 和 SQL Server 中的 DateTime 之间有什么区别吗?

javascript - 使用 enzyme full mount 找到的组件实例等于 null

grails - 如何在 Grails Controller 中模拟/ stub 调用消息标签库

.net - 编辑.NET程序集并重新编译

sql - SQL 中每一天的 MAX - MIN

html - 你用什么来测试你网站上的手持css?