今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
当前回答
作为一个C语言新手,我发现名为“C测试驱动开发”的幻灯片非常有用。基本上,它使用标准assert()和&&来传递消息,没有任何外部依赖。如果有人习惯了全栈测试框架,这可能就不适用了:)
其他回答
我说几乎和ratkok一样,但如果你有一个嵌入的扭曲单元测试,那么……
Unity——强烈推荐用于单元测试C代码的框架。
#include <unity.h>
void test_true_should_be_true(void)
{
TEST_ASSERT_TRUE(true);
}
int main(void)
{
UNITY_BEGIN();
RUN_TEST(test_true_should_be_true);
return UNITY_END();
}
书中提到的嵌入式C线程TDD中的例子是使用Unity(和CppUTest)编写的。
使用的一种技术是使用c++ xUnit框架(和c++编译器)开发单元测试代码,同时将目标系统的源代码维护为C模块。
确保在交叉编译器下定期编译C源代码,如果可能的话自动使用单元测试。
我们编写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
它也有漂亮的颜色。
LibU (http://koanlogic.com/libu)有一个单元测试模块,允许显式测试套件/用例依赖、测试隔离、并行执行和可定制的报告格式化器(默认格式是xml和txt)。
这个库是BSD许可的,包含许多其他有用的模块——网络、调试、常用的数据结构、配置等等——如果你的项目需要它们的话……
我很惊讶没有人提到卡特(http://cutter.sourceforge.net/) 你可以测试C和c++,它与autotools无缝集成,并且有一个非常好的教程。