今年夏天,我开发了一个用纯c语言编写的嵌入式系统。这是我所在公司接管的一个现有项目。我已经非常习惯使用JUnit在Java中编写单元测试,但不知道为现有代码(需要重构)和添加到系统中的新代码编写单元测试的最佳方法是什么。

有什么项目可以让单元测试纯C代码像使用JUnit测试Java代码一样简单吗?任何特别适用于嵌入式开发(交叉编译到arm-linux平台)的见解都将非常感谢。


当前回答

我编写Libcut只是出于对现有C单元测试库的不满。它具有原语的自动类型字符串(不需要test_eq_int, test_eq_long, test_eq_short,等等…)对于原语和字符串只有两个不同的集合),并且由一个头文件组成。这里有一个简短的例子:

#include <libcut.h>

LIBCUT_TEST(test_abc) {
    LIBCUT_TEST_EQ(1, 1);
    LIBCUT_TEST_NE(1, 0);
    LIBCUT_TEST_STREQ("abc", "abc");
    LIBCUT_TEST_STRNE("abc", "def");
}

LIBCUT_MAIN(test_abc);

不过,它只对C11有效。

其他回答

谷歌拥有优秀的测试框架。https://github.com/google/googletest/blob/master/googletest/docs/primer.md

是的,据我所知,它将与普通C一起工作,即不需要c++功能(可能需要c++编译器,不确定)。

Michael Feather的书《有效地使用遗留代码》介绍了很多专门用于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)编写的。

如果您的目标是Win32平台或NT内核模式,您应该看看cfix。

在阅读Minunit之后,我认为更好的方法是在assert宏中进行测试,我使用了很多防御程序技术。所以我使用Minunit混合标准断言的相同思想。您可以在k0ga的博客中看到我的框架(一个好名字可以是NoMinunit)