检测内存泄漏的单元测试

Unit test to detect Memory leaks

根据 this post 的第 8 步,我编写了以下简单的单元测试以确保我的 Test class 不会导致内存泄漏:

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);
}

在我的代码库的master分支测试通过,但是在另一个feature分支运行测试时,测试失败。所以我有两个问题:

  1. 这种检测我的 classes 内存泄漏的方法可靠吗?
  2. 什么情况会导致这个测试在一个分支通过而在另一个分支失败?

此测试能发挥作用的可能性很小。所有这些都涉及 Test 的构造函数对全局变量进行某种注册(在全局事件中注册自身或将 this 指针存储在静态成员中)。因为这是很少有人做的事情,所以对所有 类 进行上述测试是过度的。此外,该测试不涵盖 C# 中内存泄漏的更典型案例:构建数据结构(例如列表)并且从不清理它。

此测试可能因多种原因而失败:GC.Collect() 不一定强制清除 所有 垃圾。它应该,但不能保证它总是会发生。另外,由于 testObj 是一个局部变量,当你调用 GC.Collect() 时它还没有超出范围,所以根据代码的优化方式,该变量还不能被认为是垃圾,这使得测试失败。