36

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

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

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

所以现在的问题是:用 ie Valgrind 运行整个单元测试代码并让他检测任何 malloc/free 问题是个好主意吗?(或者也许编译成电子围栏之类的东西?)

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

谢谢约翰


更新:感谢道格拉斯和乔纳森,这似乎是个好主意,我应该继续这样做:-)

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

4

2 回答 2

60

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

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

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

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

如果 Valgrind 在运行中报告任何错误,则指定要返回的替代退出代码。当设置为默认值(零)时,Valgrind 的返回值将始终是被模拟过程的返回值。当设置为非零值时,如果 Valgrind 检测到任何错误,则返回该值。这对于将 Valgrind 用作自动化测试套件的一部分很有用,因为它可以很容易地检测 Valgrind 报告错误的测试用例,只需检查返回码。

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

于 2009-01-19T21:42:52.453 回答
10

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

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

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

于 2009-01-19T22:02:02.883 回答