c# - 单元/集成测试和恢复数据库

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

忙于 C# 中的自动化测试用例,我们需要在每次测试后恢复数据库快照。问题是,当运行多个测试时它会失败,因为“其他用户正在使用数据库时无法更改数据库状态。”

我们使用 SqlConnection.ClearAllPools();在恢复之前,但在第四次测试之后它不会再次恢复运行,而且似乎池停止清除。 (为什么是四个?见编辑 2)

我怎样才能使它更可靠?

编辑

也许我应该提供有关该系统的更多信息。这些是服务的 unit 集成测试。测试引用服务 dll(没有服务引用,我们直接访问服务方法)。因此,除了在每个测试 block 之后恢复数据库快照外,测试中没有 SQL。

这是一项服务,因此我们并不完全管理连接。我们有一个创建数据库对象的中心点,我们从中获取 DbCommands 来执行存储过程。

使用 sp_who2在 SQL Studio 中,我观察到以下情况:前四个测试 block (每个 block 由 ClearAllPools() 和快照还原分隔)有一个到数据库的 session ,但是从第五个测试 block 开始,有三个 session 反对。 (为什么?这可能是问题的线索。)(快照恢复会打开一个到主数据库的额外连接。)所有打开的连接都处于休眠状态,等待命令,即使是阻塞快照恢复连接的连接也是如此。

编辑 2

为什么是五个?我以为测试用例会随机执行,但我错了。我找到了罪魁祸首。多个连接打开,系统只使用最后一个,其他的挂起,直到您退出才会清除。

最佳答案

在恢复快照之前将数据库设置为单用户模式:

   ALTER DATABASE <mydb> SET SINGLE_USER WITH ROLLBACK IMMEDIATE

如果您不想终止打开的连接,您可以通过在没有回滚选项的情况下运行它来让命令等待

   ALTER DATABASE <mydb> SET SINGLE_USER

这是一个 hack,但很难让您的快照恢复始终如一地工作。 (一次被咬,两次害羞。)

关于c# - 单元/集成测试和恢复数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8489536/

相关文章:

c# - 将 BigInteger 二进制转换为 BigInteger 数字?

SQL获取日期列表以及之前和之后的天数而不重复

javascript - 如何在 Jest 中的同一测试套件中的测试之间清除模块模拟?

c++ - 如何使用 CMake 对库的私有(private)特性 (TDD) 进行单元测试

c# - Azure IoT Adge BLE 模块 - Linux 容器的 BLE 实现

c# - WCF 代理类......有时?

javascript - 使用 Angular2 上传文件

mysql - sql 有子句问题

mysql - 对于相同的值,它应该增加 1,不同的它应该被重置并给出结果

visual-studio - 有人愿意向刚接触单元测试的程序员解释 CHESS 吗?