就在几天前,我开始研究一个名为check的单元测试框架,我打算在Linux下运行c代码测试.
现在检查一些设计良好的代码和一些测试代码可以帮助我验证基本功能是否正确,我的意思是很容易看到变量和响应然后决定一个函数是否正确.
但是,假设我想测试一个动态内存结构,其中包含很多关于malloc和free的内容结构,事实证明我可以将数据放入并再次获取正确的数据.但这并不能证明我在这个过程中没有打破一些记忆,让我说我忘了释放一半的记忆并丢失指针(一个经典的memleak).该代码可能会通过大部分单元测试.
所以现在问题是:用Valgrind运行整个单元测试代码并让他检测出任何malloc/free问题是一个好主意吗?(或者可能像电围栏一样编译?)
感觉这是一个好主意,但我不确定我是怎么进入这里的......
谢谢约翰
更新:感谢道格拉斯和乔纳森,看起来这是一个好主意,我应该继续:-)
更新: Valgrind是一个有趣的工具,但我发现这样做的第一个memleaks是在测试框架而不是我自己的代码(虽然非常有趣).因此,在将自己的代码颠倒之前,向其余部分提示将验证您使用的单元测试框架是否没有泄漏.在我的案例中只需要一个空的测试用例,因为那时只有单元测试框架正在运行.
我们当然这样做 - 对单元测试运行valgrind比完整程序运行要容易得多.
此外,任何内存错误都被本地化到单元测试正在测试的代码区域,这使得它更容易修复.
另外检查你已经修复它更容易 - 因为你正在运行单元测试而不是对你的整个程序进行更复杂的测试.
如果你以自动方式运行valgrind,你可能想要 --error-exitcode=
如果Valgrind在运行中报告任何错误,则指定要返回的备用退出代码.设置为默认值(零)时,Valgrind的返回值将始终是正在模拟的过程的返回值.设置为非零值时,如果Valgrind检测到任何错误,则返回该值.这对于将Valgrind用作自动化测试套件的一部分非常有用,因为只需检查返回代码,就可以轻松检测Valgrind报告错误的测试用例.
http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts
正如Douglas Leeder所说,使用任何可以放下手的诊断软件进行单元测试是值得的,这样可以确保它真正按预期工作.这包括不滥用内存,所以使用valgrind是个好主意.
您真的希望您的单元测试证明您的代码有效.
你不必一直在valgrind下运行它们 - 但它应该尽可能地这样做,你应该定期这样做(比如说经过大的修改).