今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。
有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。
当前回答
如果您的目标是Win32平台或NT内核模式,您应该看看cfix。
其他回答
我说几乎和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)编写的。
如果你熟悉JUnit,那么我推荐CppUnit。 http://cppunit.sourceforge.net/cppunit-wiki
这是假设你有c++编译器来做单元测试。如果没有,那么我必须同意亚当·罗森菲尔德的观点,支票就是你想要的。
我目前正在使用CuTest单元测试框架:
http://cutest.sourceforge.net/
它是嵌入式系统的理想选择,因为它非常轻量级和简单。让它在目标平台和桌面上运行都没有问题。除了编写单元测试,所需要的是:
头文件包含在任何地方 你称之为最可爱的程序 一个额外的“C”文件 编译/链接到映像 一些简单的代码添加到主要到 设置并调用单元测试- I 只需要把它放在一个特殊的main()中 函数,如果 过程中定义UNITTEST 构建。
系统需要支持堆和一些stdio功能(不是所有的嵌入式系统都有)。但是代码非常简单,如果您的平台没有这些需求,您可能可以使用这些需求的替代方案。
通过明智地使用extern“C”{}块,它还可以很好地支持测试c++。
如果你还在寻找测试框架,CUnitWin32是Win32/NT平台的一个。
这解决了我在其他测试框架中遇到的一个基本问题。也就是说,全局/静态变量处于确定性状态,因为每个测试都是作为单独的进程执行的。
C语言中的一个单元测试框架是Check;C语言单元测试框架的列表可以在这里找到,并在下面复制。根据运行时具有多少标准库函数,您可以使用其中的一个,也可以不使用。
AceUnit AceUnit (Advanced C and Embedded Unit) bills itself as a comfortable C code unit test framework. It tries to mimick JUnit 4.x and includes reflection-like capabilities. AceUnit can be used in resource constraint environments, e.g. embedded software development, and importantly it runs fine in environments where you cannot include a single standard header file and cannot invoke a single standard C function from the ANSI / ISO C libraries. It also has a Windows port. It does not use forks to trap signals, although the authors have expressed interest in adding such a feature. See the AceUnit homepage. GNU Autounit Much along the same lines as Check, including forking to run unit tests in a separate address space (in fact, the original author of Check borrowed the idea from GNU Autounit). GNU Autounit uses GLib extensively, which means that linking and such need special options, but this may not be a big problem to you, especially if you are already using GTK or GLib. See the GNU Autounit homepage. cUnit Also uses GLib, but does not fork to protect the address space of unit tests. CUnit Standard C, with plans for a Win32 GUI implementation. Does not currently fork or otherwise protect the address space of unit tests. In early development. See the CUnit homepage. CuTest A simple framework with just one .c and one .h file that you drop into your source tree. See the CuTest homepage. CppUnit The premier unit testing framework for C++; you can also use it to test C code. It is stable, actively developed, and has a GUI interface. The primary reasons not to use CppUnit for C are first that it is quite big, and second you have to write your tests in C++, which means you need a C++ compiler. If these don’t sound like concerns, it is definitely worth considering, along with other C++ unit testing frameworks. See the CppUnit homepage. embUnit embUnit (Embedded Unit) is another unit test framework for embedded systems. This one appears to be superseded by AceUnit. Embedded Unit homepage. MinUnit A minimal set of macros and that’s it! The point is to show how easy it is to unit test your code. See the MinUnit homepage. CUnit for Mr. Ando A CUnit implementation that is fairly new, and apparently still in early development. See the CUnit for Mr. Ando homepage. This list was last updated in March 2008.
更多的框架:
CMocka
CMocka是一个支持模拟对象的C语言测试框架。它易于使用和设置。
请参阅CMocka主页。
标准
Criterion是一个跨平台的C单元测试框架,支持自动测试注册、参数化测试和理论,可以输出多种格式,包括TAP和JUnit XML。每个测试都在自己的进程中运行,因此如果需要,可以报告或测试信号和崩溃。
更多信息请参阅Criterion主页。
HWUT
HWUT是一个通用的单元测试工具,支持c语言。它可以帮助创建makefile,生成大量的测试用例,在最小的“迭代表”中编码,运行状态机,生成c语言存根等等。一般的方法是非常独特的:裁决是基于“好标准输出/坏标准输出”。不过,比较函数是灵活的。因此,任何类型的脚本都可以用于检查。它可以应用于任何可以产生标准输出的语言。
请参阅武汉理工大学主页。
CGreen
一个现代的、可移植的、跨语言的C和c++单元测试和模拟框架。它提供了可选的BDD表示法、模拟库和在单个进程中运行它的能力(使调试更容易)。一个自动发现测试函数的测试运行器是可用的。但是您可以通过编程方式创建自己的。
所有这些特性(以及更多)在CGreen手册中都有解释。
维基百科在单元测试框架列表下给出了C单元测试框架的详细列表:C