今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
当前回答
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的测试套件
其他回答
在阅读Minunit之后,我认为更好的方法是在assert宏中进行测试,我使用了很多防御程序技术。所以我使用Minunit混合标准断言的相同思想。您可以在k0ga的博客中看到我的框架(一个好名字可以是NoMinunit)
我将CxxTest用于嵌入式c/c++环境(主要是c++)。
我更喜欢CxxTest,因为它有一个perl/python脚本来构建测试运行器。在进行了一些设置之后(因为不需要编写测试运行程序,所以还会更小),它非常容易使用(包括示例和有用的文档)。大部分工作是设置代码访问的“硬件”,这样我就可以有效地进行单元/模块测试。在此之后,很容易添加新的单元测试用例。
如前所述,它是一个C/ c++单元测试框架。所以你需要一个c++编译器。
CxxTest用户指南 CxxTest维基
我目前正在使用CuTest单元测试框架:
http://cutest.sourceforge.net/
它是嵌入式系统的理想选择,因为它非常轻量级和简单。让它在目标平台和桌面上运行都没有问题。除了编写单元测试,所需要的是:
头文件包含在任何地方 你称之为最可爱的程序 一个额外的“C”文件 编译/链接到映像 一些简单的代码添加到主要到 设置并调用单元测试- I 只需要把它放在一个特殊的main()中 函数,如果 过程中定义UNITTEST 构建。
系统需要支持堆和一些stdio功能(不是所有的嵌入式系统都有)。但是代码非常简单,如果您的平台没有这些需求,您可能可以使用这些需求的替代方案。
通过明智地使用extern“C”{}块,它还可以很好地支持测试c++。
我说几乎和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)编写的。
首先,看看这里:http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C
我的公司有一个客户使用的C库。我们使用CxxTest(一个c++单元测试库)来测试代码。CppUnit也可以工作。如果你被C卡住了,我推荐RCUNIT(但CUnit也很好)。