今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
当前回答
在测试目标之前,我使用RCUNIT在PC上对嵌入式代码进行了一些单元测试。好的硬件接口抽象很重要,否则字节顺序和内存映射寄存器会害死你。
其他回答
我将CxxTest用于嵌入式c/c++环境(主要是c++)。
我更喜欢CxxTest,因为它有一个perl/python脚本来构建测试运行器。在进行了一些设置之后(因为不需要编写测试运行程序,所以还会更小),它非常容易使用(包括示例和有用的文档)。大部分工作是设置代码访问的“硬件”,这样我就可以有效地进行单元/模块测试。在此之后,很容易添加新的单元测试用例。
如前所述,它是一个C/ c++单元测试框架。所以你需要一个c++编译器。
CxxTest用户指南 CxxTest维基
我不使用框架,我只是使用自动工具“检查”目标支持。实现一个“main”并使用assert。
我的测试目录Makefile.am(s)看起来像这样:
check_PROGRAMS = test_oe_amqp
test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static
TESTS = test_oe_amqp
我说几乎和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)编写的。
我们编写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
它也有漂亮的颜色。
Minunit是一个非常简单的单元测试框架。 我用它来单元测试c微控制器代码avr。