代码之家  ›  专栏  ›  技术社区  ›  Craig P. Motlin

自动查找泄漏内存的JUnit测试的方法

  •  1
  • Craig P. Motlin  · 技术社区  · 17 年前

    我们问题的根源是单身。但是单例是很难破解的,与此同时,我们有很多单元测试使用单例,而不小心在tearDown()方法中完全清除它们。我认为检测此类测试的一个好方法是查找内存泄漏。如果在tearDown()和System之后使用了内存。gc()比测试开始时更大,要么测试泄漏,要么类加载器加载了更多类。有没有办法自动检测出这类问题?

    6 回复  |  直到 14 年前
        1
  •  2
  •   Carl Manaster    17 年前

    您能否在TestCase和您的单个测试类之间引入一个子类来进行清理?那么子类只负责调用super。只有那些有自己的撕裂的人。

        2
  •  1
  •   Jared    17 年前

    我完全同意其他人的观点,即监视内存使用情况并不是跟踪这个系统的可行方法。gc()的行为不会像您预期的那样,或者不够精确,无法实现您的目标。

    你需要一个工具,让你检查参考图,并显示分配调用堆栈。

    我用过Borland和 JProfiler 来自ej technologies,两者都取得了成功(谷歌的快速搜索显示,它现在可能已经死了。)

    还有使用 JVMTI 为了更好地监控这个特定问题。

    编辑 :Wierd,但当我回顾这个答案时,我接到了Embarcadero的电话,他显然已经购买了OptimizeIt,进行了一些更新,现在正在以这个名字进行营销 J Optimizer .

        3
  •  0
  •   Carl Manaster    17 年前

    只是想一想:如果有两个空测试紧跟在一起运行,那么第二个测试在teardown()之后不应该使用不同的内存。如果是这样的话,您(可能)的setup()/teardown()系统中有漏洞。

        4
  •  0
  •   matt b    17 年前

    我认为这不是一个好办法。 System.gc() 不能保证像你认为的那样完全清理任何未使用的物体。

    如果您的根本问题是单元测试最终使用全局数据(单例),而没有正确清理它们,那么您应该解决根本问题:这些单元测试。找到所有没有使用的测试应该不会太难 tearDown() ,或查找使用特定单例的所有测试。

        5
  •  0
  •   Yishai    17 年前

    为了更彻底地解决这个问题,我建议您使用一个单例初始值设定项来记住它初始化的内容,并使用一个撕裂方法来撕裂它初始化的所有内容,而不是检测它。这样的话,测试只能通过这个类进行初始化,并且只需要在teardown中做一件事。

    我还认为Carl Manaster的建议很好,但是如果您使用的是JUnit4,那么您可以有一个在超类中运行的teardown方法,而不必记住调用super。除非您使用JUnit3 GUI,否则JUnit4应该是一个替代品。唯一的一件事是利用它的新特性,你必须迁移整个测试,你不能让两者都生活在同一个类中。因此,与这些单例交互的测试必须一次迁移一个完整的测试类。

        6
  •  0
  •   monksy    9 年前

    你可以用 Eclipse Memory Analyzer 自动分析每次测试后进行的堆转储,或者在所有测试后可能更好。MAT可以相当自动地发现内存泄漏。