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