今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
当前回答
LibU (http://koanlogic.com/libu)有一个单元测试模块,允许显式测试套件/用例依赖、测试隔离、并行执行和可定制的报告格式化器(默认格式是xml和txt)。
这个库是BSD许可的,包含许多其他有用的模块——网络、调试、常用的数据结构、配置等等——如果你的项目需要它们的话……
其他回答
如果你还在寻找测试框架,CUnitWin32是Win32/NT平台的一个。
这解决了我在其他测试框架中遇到的一个基本问题。也就是说,全局/静态变量处于确定性状态,因为每个测试都是作为单独的进程执行的。
我们编写CHEAT(托管在GitHub上)是为了便于使用和移植。
它没有依赖关系,不需要安装或配置。 只需要一个头文件和一个测试用例。
#include <cheat.h>
CHEAT_TEST(mathematics_still_work,
cheat_assert(2 + 2 == 4);
cheat_assert_not(2 + 2 == 5);
)
测试编译成一个可执行文件,负责运行测试并报告测试结果。
$ gcc -I . tests.c
$ ./a.out
..
---
2 successful of 2 run
SUCCESS
它也有漂亮的颜色。
在测试目标之前,我使用RCUNIT在PC上对嵌入式代码进行了一些单元测试。好的硬件接口抽象很重要,否则字节顺序和内存映射寄存器会害死你。
C语言有一个优雅的单元测试框架,它支持模拟对象,叫做cmocka。它只需要标准的C库,适用于各种计算平台(包括嵌入式)和不同的编译器。
它还支持不同的消息输出格式,如Subunit、Test Anything Protocol和jUnit XML报告。
cmocka也可以在嵌入式平台上工作,也支持Windows。
一个简单的测试是这样的:
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
(void) state; /* unused */
}
int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(null_test_success),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
API有完整的文档,源代码中有几个示例。
要开始使用cmocka,您应该阅读LWN.net上的文章:在C中使用模拟对象进行单元测试
cmocka 1.0已于2015年2月发布。
API完整性检查器- C/ c++库的测试框架:
An automatic generator of basic unit tests for a shared C/C++ library. It is able to generate reasonable (in most, but unfortunately not all, cases) input data for parameters and compose simple ("sanity" or "shallow"-quality) test cases for every function in the API through the analysis of declarations in header files. The quality of generated tests allows to check absence of critical errors in simple use cases. The tool is able to build and execute generated tests and detect crashes (segfaults), aborts, all kinds of emitted signals, non-zero program return code and program hanging.
例子:
fontconfig 2.8.0测试套件 FreeType 2.4.8的测试套件