我发现存在一些资源泄漏。由于微妙的错误导致与SQL服务器的连接未被释放,因此我用尽了连接并且测试失败。据我所知,这几乎与内存泄漏完全相同;连接从连接池中分配并且永远不会被释放,就像内存可以分配然后不被释放一样。
然而,这给我留下了一个令人困惑的问题?运行我的测试一次和作为一组运行之间有什么区别?如果单独运行测试时测试通过,然后一起运行时测试失败,那么必须在测试运行之间发生某种清理,只有在单独运行测试时才会发生。
我猜测这可能与.NET垃圾回收器在测试之间执行或不执行的操作有关。在一个情况下,连接在测试之间被释放;在另一种情况下,它们没有。
我该如何解释这个问题?
更新:对于那些询问代码细节的人,它非常简单。我在我的Setup方法中声明了一个新的TransactionScope对象,并在我的Teardown方法中处理它。然而,问题测试是一个数据驱动测试,其中包含100个测试用例;在测试下的代码使用SqlHelper类从select语句中填充了一个SqlDataReader对象,然后没有调用close方法关闭SqlDataReader。因为我使用SqlHelper类来获取SqlDataReader,所以我期望连接由它处理。并非如此!
但是为了澄清,我不是在问我的具体情况。我想知道的是:通常情况下,如何在测试之间释放资源?我想象这将是垃圾回收的某种应用。我想知道垃圾回收器是否仍在清理上一个测试时运行下一个测试(竞态条件?)
更新:我了解到关于单元测试的垃圾回收的信息。出于自己的好奇心,我取出了因
SqlDataReader
对象未关闭而失败的单元测试。我尝试在每个测试的结尾添加System.GC.Collect()
。这成功地释放了连接,但会导致约50%的性能损失。
Dispose
或Close
的调用? - Gabe