【问题标题】:Is it overkill to run the unit test with Valgrind?用 Valgrind 运行单元测试是不是有点矫枉过正?
【发布时间】:2026-01-24 03:35:01
【问题描述】:

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

现在检查一下,一些设计良好的代码和一些测试代码可以帮助我验证 基本功能是正确的, 我的意思是很容易只看变量和响应 判断一个函数是否正确。

但是假设我想测试一个动态内存结构,其中包含大量的 malloc 和 free, 事实证明,我可以输入数据并再次取出正确的数据。 但这并不能证明我在这个过程中没有破坏一些记忆, 假设我忘记释放一半的内存并丢失了指针(经典的 memleak)。 该代码可能会通过大部分单元测试。

那么现在的问题是: 使用 Valgrind 运行整个单元测试代码并让他运行是个好主意吗? 检测任何 malloc/free 问题? (或者也许编译成 Electric Fence 之类的东西?)

感觉是个好主意,但我不确定自己在这里做什么.....

谢谢 约翰


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

更新: Valgrind 是一个有趣的工具,但是我发现的第一个 memleaks 这样做 在测试框架中,而不是我自己的代码(虽然很有趣)。 因此,对其余部分的提示是在颠倒您自己的代码之前验证您正在使用的单元测试框架没有泄漏。 我的案例只需要一个空的测试用例, 从那时起,只有单元测试框架正在运行。

【问题讨论】:

    标签: c linux unit-testing valgrind check-framework


    【解决方案1】:

    我们当然可以 - 对单元测试运行 valgrind 比使用完整程序要容易得多。

    此外,任何内存错误都被定位到单元测试正在测试的代码区域,这使得更容易修复。

    此外,检查您是否已修复它更容易 - 因为您正在运行单元测试,而不是针对完整程序的更复杂的测试。

    如果您以自动化方式运行 valgrind,您可能需要 --error-exitcode=<number> [default: 0]

    指定在 Valgrind 报告任何情况时返回的替代退出代码 运行中的错误。当设置为 默认值(零),返回值 Valgrind 将永远是 正在处理的进程的返回值 模拟的。当设置为非零时 值,而是返回该值, 如果 Valgrind 检测到任何错误。这 对于使用 Valgrind 作为一部分很有用 自动化测试套件,因为它 使检测测试用例变得容易 Valgrind 报告了哪些错误, 只需检查返回码。

    http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

    【讨论】:

    • 还有--xml=yes--xml-file=<file>,可以轻松自动读取结果。
    【解决方案2】:

    正如 Douglas Leeder 所说,使用任何您可以动手的诊断软件运行您的单元测试是非常值得的,这将确保它确实按您的预期工作。这包括不滥用内存,所以使用 valgrind 是个好主意。

    您真的希望您的单元测试能够证明您的代码有效。

    您不必一直在 valgrind 下运行它们 - 但这样做应该尽可能简单,并且您应该定期这样做(比如在进行重大更改之后)。

    【讨论】: