使用Valgrind运行单元测试是否过度?

37

几天前,我开始研究一个名为check的单元测试框架, 并打算在Linux下运行c代码上的测试。

现在,check和一些精心设计的代码和一些测试代码可以帮助我验证基本功能是否正确,我的意思是只需查看输入和响应变量,然后决定函数是否正确就可以了。

但是假设我想要测试一个具有大量malloc和free的动态内存结构,并且结果表明我可以将数据放入并再次得到正确的数据。 但这并不能证明我没有在过程中破坏某些内存,例如我忘记释放一半内存并且失去指针 (经典的memleak)。那段代码可能会通过大部分单元测试。

所以现在的问题是:是否明智将整个单元测试代码与Valgrind一起运行来检测任何malloc/free问题?(或者可能是编译类似Electric Fence的东西?)

感觉这是个好主意,但我不确定我在这里会有什么结果.....

谢谢 Johan


更新: 感谢Douglas和Jonathan,看起来这是个好主意,我应该继续使用它:-)

更新: Valgrind是一个有趣的工具,但是我在尝试这样做时发现的第一个memleaks是在测试框架中而不是我的代码中(非常有趣)。因此,给其他人的建议是,在翻开你自己的代码之前,请验证您使用的单元测试框架是否有泄漏。在我这种情况下,只需要一个空测试用例,因为此后除了单元测试框架外没有任何东西在运行。

2个回答

63
我们确实这样做-使用单元测试运行Valgrind比使用完整程序更容易。同时,任何内存错误都局限于单元测试正在测试的代码区域,这使得修复更容易。此外,检查您是否已经修复它也更容易-因为您正在运行单元测试,而不是针对完整程序运行更复杂的测试。如果您以自动化方式运行Valgrind,则可能需要使用--error-exitcode=<number> [默认值:0]。该选项指定了一个替代退出代码,以在Valgrind报告运行中出现任何错误时返回。当设置为默认值(零)时,Valgrind的返回值始终是正在模拟的进程的返回值。当设置为非零值时,如果Valgrind检测到任何错误,则返回该值。这对于将Valgrind用作自动化测试套件的一部分非常有用,因为它可以通过检查返回代码轻松检测Valgrind报告错误的测试用例。参考链接:http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

还有--xml=yes--xml-file=<file>,这使得自动化读取结果变得轻松。 - Jeff Taylor

10

正如Douglas Leeder所说,值得使用任何可以获得的诊断工具来运行单元测试,以确保它按照您的期望工作。这包括不滥用内存,因此使用valgrind是一个好主意。

您真正想要您的单元测试证明您的代码是有效的。

您不必一直在valgrind下运行它们-但应该尽可能轻松地这样做,并且应定期这样做(例如在进行大的更改后)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接