【发布时间】:2010-11-03 08:09:53
【问题描述】:
是否有人知道 CppUnit 的扩展可用于在逐个测试的基础上做出有关内存泄漏的断言。
即CPPUNIT_ASSERT_NO_LEAKS()?
本质上,我希望能够在执行测试导致内存泄漏时使特定测试失败。
【问题讨论】:
标签: c++ unit-testing memory-leaks cppunit
是否有人知道 CppUnit 的扩展可用于在逐个测试的基础上做出有关内存泄漏的断言。
即CPPUNIT_ASSERT_NO_LEAKS()?
本质上,我希望能够在执行测试导致内存泄漏时使特定测试失败。
【问题讨论】:
标签: c++ unit-testing memory-leaks cppunit
我知道现在回答这个问题有点太晚了。但这是来自 Microsoft 的一个很棒的工具。我现在是 linux 用户,但我在 windows 中编写代码时使用过它(Visual C++ 和 Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028
【讨论】:
在我工作的地方,我们使用 purify 构建单元测试。然后我们的持续集成平台提取成功/失败的测试用例数量和泄漏字节数(+ lint 和覆盖结果),并将其显示在网页上。我强烈推荐这样做。
很抱歉没有提供您想要的解决方案。
【讨论】:
我知道它不是 CppUnit,但是 boost::test 可以做内存泄漏检测。
来自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 );
【讨论】:
如果您在 Linux 上运行,则可以使用 memcheck 运行测试。
手册的Client Requests 部分描述了几个有用的宏,其中一个被标记为对测试有用:
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。
【讨论】:
在 Windows 上,使用一些对调试堆的调用来让 CppUnit 使用 _CrtMemCheckpoint() 和 _CrtMemDifference() 处理此信息是一件非常简单的事情:
有缺点:
【讨论】:
使用valgrind 运行您的单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测出哪个导致了泄漏。
【讨论】:
CPPUNIT 默认不支持内存泄漏检查。
该项目现在已经重新开始了(已经停止了很长时间),这可能是CPPUNIT2的一个特性,您可以向作者提出(或写信)。
如果您正在寻找支持内存泄漏检测的单元测试框架,您可以尝试查看CppUTest。这是 Martin Fowler 和 Bob Martin 在一些 TDD 课程中使用的项目。挺好的。
【讨论】:
不知道,但您可以使用 Fluid Studios 内存管理器代码之类的东西,并通过一些调整将其挂钩。或者将其编译到您的测试应用程序中,然后有一个脚本为每个测试运行一次应用程序并整理内存跟踪结果。
【讨论】: