检测内存泄漏的单元测试
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分支运行测试时,测试失败。所以我有两个问题:
- 这种检测我的 classes 内存泄漏的方法可靠吗?
- 什么情况会导致这个测试在一个分支通过而在另一个分支失败?
此测试能发挥作用的可能性很小。所有这些都涉及 Test
的构造函数对全局变量进行某种注册(在全局事件中注册自身或将 this
指针存储在静态成员中)。因为这是很少有人做的事情,所以对所有 类 进行上述测试是过度的。此外,该测试不涵盖 C# 中内存泄漏的更典型案例:构建数据结构(例如列表)并且从不清理它。
此测试可能因多种原因而失败:GC.Collect()
不一定强制清除 所有 垃圾。它应该,但不能保证它总是会发生。另外,由于 testObj
是一个局部变量,当你调用 GC.Collect()
时它还没有超出范围,所以根据代码的优化方式,该变量还不能被认为是垃圾,这使得测试失败。
根据 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分支运行测试时,测试失败。所以我有两个问题:
- 这种检测我的 classes 内存泄漏的方法可靠吗?
- 什么情况会导致这个测试在一个分支通过而在另一个分支失败?
此测试能发挥作用的可能性很小。所有这些都涉及 Test
的构造函数对全局变量进行某种注册(在全局事件中注册自身或将 this
指针存储在静态成员中)。因为这是很少有人做的事情,所以对所有 类 进行上述测试是过度的。此外,该测试不涵盖 C# 中内存泄漏的更典型案例:构建数据结构(例如列表)并且从不清理它。
此测试可能因多种原因而失败:GC.Collect()
不一定强制清除 所有 垃圾。它应该,但不能保证它总是会发生。另外,由于 testObj
是一个局部变量,当你调用 GC.Collect()
时它还没有超出范围,所以根据代码的优化方式,该变量还不能被认为是垃圾,这使得测试失败。