6

是否有人知道 CppUnit 的扩展,可用于在逐个测试的基础上做出有关内存泄漏的断言。

即 CPPUNIT_ASSERT_NO_LEAKS()?

本质上,当测试的执行导致内存泄漏时,我希望能够使特定测试失败。

4

8 回答 8

4

如果您在 Linux 上运行,则可以使用memcheck运行测试。

手册的客户端请求部分描述了几个有用的宏,其中一个被指出对测试很有用:

VALGRIND_COUNT_LEAKS: 用之前的泄漏检查发现的要泄漏、可疑、可达和抑制的内存字节数填充四个参数。同样,在调用VALGRIND_DO_LEAK_CHECK.

宏在memcheck.h(可能在/usr/include/valgrind)中定义,您想要的序列将类似于

unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
// maybe assert that they're zero!

// call test

unsigned long leaked, dubious, reachable, suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
// etc.

对每个测试重复这一点会很痛苦,因此您可以编写自己的宏,或者更好的是,编写专门的TestRunner

于 2009-06-16T13:44:53.113 回答
3

CPPUNIT 默认不支持内存泄漏检查。

该项目现已重新启动(已停止很长时间),这可能是 CPPUNIT2 的一个特性,您可以向作者提出(或写信)。

如果您正在寻找支持内存泄漏检测的单元测试框架,您可以尝试查看CppUTest。这是 Martin Fowler 和 Bob Martin 在一些 TDD 课程中使用的项目。这是相当不错的。

于 2009-06-16T14:06:04.227 回答
2

在 Windows 上,使用对调试堆的一些调用来让 CppUnit 使用_CrtMemCheckpoint()和处理此信息是一件非常简单的事情_CrtMemDifference()

有以下缺点:

  • 您必须在测试开始时手动放置一些东西才能获得检查点(也许有一种方法可以以某种方式将其集成到 CppUnit 中)
  • 它只是 Windows(在其他各种平台上可能有类似的东西)
  • 它仅适用于使用 Debug CRT 的构建
于 2009-06-16T14:30:04.880 回答
1

在我工作的地方,我们使用 purify 构建我们的单元测试。然后我们的持续集成平台提取成功/失败的测试用例数量和泄漏字节数(+ lint 和覆盖结果),并将其显示在网页上。我强烈建议这样做。

很抱歉没有提供您想要的解决方案。

于 2009-06-18T13:44:30.100 回答
1

我知道现在回答这个问题有点太晚了。但这是来自 Microsoft 的一个很棒的工具。我现在是 linux 用户,但我在 Windows(Visual C++ 和 Qt)中编写代码时使用过它 http://www.microsoft.com/en-us/download/details.aspx?id=20028

于 2012-07-09T02:43:45.760 回答
0

不知道,但是您可以使用 Fluid Studios Memory Manager 代码之类的东西,并通过一些调整将其挂钩。或者将其编译到您的测试应用程序中,然后有一个脚本为每个测试运行一次应用程序并整理内存跟踪结果。

于 2009-06-16T13:27:32.680 回答
0

I know it's not CppUnit, but boost::test can do memory leak detection.

From http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html:

void detect_memory_leaks( bool on_off );

void break_memory_alloc( long mem_alloc_order_num );

于 2009-06-16T23:57:58.790 回答
0

使用valgrind运行单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测出哪个导致了泄漏。

于 2009-06-16T14:15:49.463 回答