gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:25:32 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com