是否有人知道CppUnit的扩展可用于通过测试基础对内存泄漏进行测试断言。
即。 CPPUNIT_ASSERT_NO_LEAKS()?
基本上,我希望能够在测试执行导致泄漏内存时失败特定测试。
答案 0 :(得分:4)
如果您在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。
答案 1 :(得分:3)
默认情况下,CPPUNIT没有内存泄漏检查支持。
该项目现已重新审核(已停止很长时间),这可能是CPPUNIT2的一个功能,您可以向作者提议(或写作)。
如果您正在寻找具有内存泄漏检测支持的单元测试框架,您可以尝试查看CppUTest。这是Martin Fowler和Bob Martin在一些TDD课程中使用的项目。非常好。
答案 2 :(得分:2)
在Windows上,使用_CrtMemCheckpoint()
和_CrtMemDifference()
来使用调试堆的一些调用来让CppUnit对这些信息采取行动是非常简单的事情:
有缺点:
答案 3 :(得分:1)
在我工作的地方,我们使用purify构建单元测试。然后,我们的持续集成平台同时提取成功/失败的测试用例数量和泄漏字节数(+ lint和覆盖率结果),并在网页上显示。我强烈建议这样做。
很抱歉没有提供您想要的解决方案。
答案 4 :(得分:1)
我知道回答这个问题有点太晚了。但这是微软的一个很棒的工具。我现在是一个linux用户,但是当我在windows中编写代码时,我已经使用了它(Visual C ++和Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028
答案 5 :(得分:0)
不知道这一点,但你可以使用像Fluid Studios内存管理器代码这样的东西,并通过一些调整来解决这个问题。要么将其编译到测试应用程序中,然后让脚本为每个测试运行一次应用程序并整理内存跟踪结果。
答案 6 :(得分:0)
使用valgrind运行单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,以便您可以检测哪一个导致泄漏。
答案 7 :(得分:0)
我知道它不是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 );