忙于 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/