用单元测试检测内存泄漏。

3

根据此文章的第八步,我编写了以下简单的单元测试来确保我的Test类不会导致内存泄漏:

private class TestClass
{

}
[TestMethod]
public void MemoryLeakTest()
{
   vat testObj = new TestClass();
   var weakRef = new WeakReference(testObj)

   testObj = null;
   GC.Collect();
   GC.WaitForPendingFinalizers();
   GC.Collect();
   Assert.IsFalse(weakRef.IsAlive);
}

在我的代码存储库的主分支中测试通过,但当我在另一个特性分支上运行测试时,测试失败了。因此我有两个问题:

  1. 这种方法可靠地检测我的类的内存泄漏吗?
  2. 什么条件会导致该测试在一个分支中通过,在另一个分支中失败?
1个回答

3
这个测试的用处很有限,只有在 Test 的构造函数会对全局变量做某种注册(比如将自己注册到全局事件或将 this 指针存储在静态成员中)的情况下才有可能有用。由于这种情况很少发生,所以对所有类都执行上述测试就有些过头了。此外,该测试没有覆盖 C# 中更典型的内存泄漏情况:建立数据结构(例如 List)后不进行清理。
这个测试可能会因为多种原因而失败:GC.Collect() 并不一定能够强制清理所有的垃圾,虽然应该可以,但并不能保证它总是能够实现。此外,由于 testObj 是一个局部变量,在调用 GC.Collect() 时它还没有超出作用域,所以根据代码优化的方式,变量可能尚未被认为是垃圾,这会导致测试失败。

从技术上讲,对象可能会在最后一次使用后被收集,无论范围内是否有变量,但这可能取决于调试/发布以及是否连接了调试器。不过,回答得很好。 - JonasH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接