C代码单元测试

957

我这个夏天参与开发了一款使用C语言编写的嵌入式系统。这是一项由我们公司接手的现有项目。我已经习惯了使用JUnit在Java中编写单元测试,但对于需要重构的现有代码以及添加到系统中的新代码,我不知道编写单元测试的最佳方法。

是否存在任何项目可以使像JUnit一样轻松地为C语言编写的代码进行单元测试?特别是针对嵌入式开发(交叉编译到arm-linux平台)的任何见解都将非常感激。


13
请访问 https://cmocka.org/。 - Mawg says reinstate Monica
3
@zmo — 软件推荐 是一个用于获取软件推荐的 Stack Exchange 网站。我没有使用过该网站,因此无法确定其效果如何。在发布问题之前,请先查看他们的发布规则。 - Jonathan Leffler
31个回答

3

2

API Sanity Checker 是一个用于 C/C++ 库的测试框架:

它是一个自动生成基本单元测试的工具,能够通过分析头文件中的声明为参数生成合理的(在大多数情况下)输入数据,并为 API 中的每个函数组成简单的(“sanity”或“shallow”质量)测试用例。

生成的测试用例的质量可以检查简单用例中是否存在关键错误。该工具能够构建和执行生成的测试,并检测崩溃(segfaults)、中止、所有类型的发射信号、非零程序返回代码和程序挂起。

示例:


2

在测试目标设备之前,我使用RCUNIT在PC上进行了一些嵌入式代码的单元测试。良好的硬件接口抽象非常重要,否则大小端和内存映射寄存器可能会让你处境尴尬。


2

3
一些文档资料会很有帮助。对于第一次了解该项目的人来说,提供项目背景和目标、功能列表、相比现有替代品的优势等信息都会很有帮助。 - Craig McQueen

2

6
问题是关于 C 语言,不是 C++。 - 1800 INFORMATION
3
不可以,但C++可以与C库进行接口。因此使用C++单元测试框架测试C库可能非常好。 (顺便说一下,我的公司正在这样做,这比使用C单元测试框架要容易得多。) - Kevin
我做同样的事情。我们有一个用C语言编写的公共库,可以在我们的C++代码和脚本语言下使用。我们使用CppUnit进行测试,这个框架对于C和C++都适用,并且效果非常好。 - Jyaan

1

LibU(http://koanlogic.com/libu)有一个单元测试模块,允许显式测试套件/用例依赖关系、测试隔离、并行执行和可定制的报告格式化程序(默认格式为xml和txt)。

该库采用BSD许可证,并包含许多其他有用的模块-网络、调试、常用数据结构、配置等-如果您需要在项目中使用它们...


1

1
一种常用的技巧是使用C++ xUnit框架(和C++编译器)开发单元测试代码,同时将目标系统的源代码保持为C模块。
请确保定期使用交叉编译器编译您的C源代码,如果可能的话,自动与单元测试一起进行。

0

我刚刚写了Libcut,因为我对现有的C语言单元测试库感到沮丧。它具有原始类型的自动字符串化功能(不需要test_eq_int、test_eq_long、test_eq_short等;只需要两个不同的集合来处理原始类型和字符串),并且只包含一个头文件。以下是一个简短的示例:

#include <libcut.h>

LIBCUT_TEST(test_abc) {
    LIBCUT_TEST_EQ(1, 1);
    LIBCUT_TEST_NE(1, 0);
    LIBCUT_TEST_STREQ("abc", "abc");
    LIBCUT_TEST_STRNE("abc", "def");
}

LIBCUT_MAIN(test_abc);

但它只能与C11一起使用。


0

如果你仍在寻找测试框架,CUnitWin32 是一个适用于Win32/NT平台的框架。

这解决了我在其他测试框架中遇到的一个根本性问题。也就是说,全局/静态变量处于确定状态,因为每个测试都作为单独的进程执行。


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