Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单元测试C代码_C_Unit Testing_Testing_Embedded - Fatal编程技术网

单元测试C代码

单元测试C代码,c,unit-testing,testing,embedded,C,Unit Testing,Testing,Embedded,今年夏天,我在一个用C语言编写的嵌入式系统上工作。这是一个我工作的公司已经接管的现有项目。我已经非常习惯于使用JUnit在Java中编写单元测试,但是对于为现有代码(需要重构)以及添加到系统中的新代码编写单元测试的最佳方法,我感到困惑 有没有任何项目可以使纯C代码的单元测试像使用JUnit对Java代码进行单元测试一样简单?任何专门应用于嵌入式开发(交叉编译到arm linux平台)的见解都将不胜感激;可以找到C语言中的单元测试框架列表,如下所示。根据您的运行时有多少标准库函数,您可以使用这些函

今年夏天,我在一个用C语言编写的嵌入式系统上工作。这是一个我工作的公司已经接管的现有项目。我已经非常习惯于使用JUnit在Java中编写单元测试,但是对于为现有代码(需要重构)以及添加到系统中的新代码编写单元测试的最佳方法,我感到困惑


有没有任何项目可以使纯C代码的单元测试像使用JUnit对Java代码进行单元测试一样简单?任何专门应用于嵌入式开发(交叉编译到arm linux平台)的见解都将不胜感激;可以找到C语言中的单元测试框架列表,如下所示。根据您的运行时有多少标准库函数,您可以使用这些函数中的一个,也可以不使用

AceUnit AceUnit(高级C和嵌入式单元)自称是一个舒适的C代码单元测试框架。它试图模仿JUnit4.x,并包含类似反射的功能。AceUnit可用于资源受限环境,例如嵌入式软件开发,重要的是,它在无法包含单个标准头文件且无法从ANSI/ISO C库调用单个标准C函数的环境中运行良好。它还有一个Windows端口。它不使用fork来捕捉信号,尽管作者表示有兴趣添加这样的功能。看

GNU自动单元 与Check大致相同,包括在单独的地址空间中运行单元测试(事实上,Check的原始作者借用了GNU Autounit的思想)。GNU Autounit广泛使用GLib,这意味着链接等需要特殊选项,但这对您来说可能不是什么大问题,特别是如果您已经在使用GTK或GLib。看

库尼特 还使用GLib,但不使用fork来保护单元测试的地址空间

库尼特 标准C,带有Win32 GUI实现计划。当前不分叉或以其他方式保护单元测试的地址空间。在早期开发中。看

可爱的 一个简单的框架,只有一个.c和一个.h文件,您可以将它们放入源代码树中。看

CppUnit

C++的最基本单元测试框架;您还可以使用它来测试C代码。它稳定、开发积极,并具有GUI界面。不使用CppUnit作为C的主要原因是第一个原因是它很大,其次是你必须在C++中编写测试,这意味着你需要一个C++编译器。如果这些听起来不像是关注的话,那当然是值得考虑的,以及其他C++单元测试框架。看

埃姆布尼特 embUnit(嵌入式单元)是嵌入式系统的另一个单元测试框架。这一个似乎被AceUnit取代

细节 一组最小的宏,就是这样!重点是展示单元测试代码是多么容易。看

安藤先生的CUnit 一个相当新的CUnit实现,显然仍处于早期开发阶段。看

该名单最近一次更新是在2008年3月

更多框架: 科摩卡 CMocka是一个支持模拟对象的C测试框架。它易于使用和设置

标准 Criteria是一个跨平台的C单元测试框架,支持自动测试注册、参数化测试、理论,并可以输出多种格式,包括TAP和JUnitXML。每个测试都在自己的过程中运行,因此,如果需要,可以报告或测试信号和崩溃

有关更多信息,请参阅

HWUT HWUT是一个非常支持C的通用单元测试工具。它可以帮助创建Makefiles,生成在最小“迭代表”中编码的大量测试用例,遍历状态机,生成C-stub等等。一般的方法非常独特:判决基于“好标准/坏标准”。不过,比较功能是灵活的。因此,可以使用任何类型的脚本进行检查。它可以应用于任何能够产生标准输出的语言

绿色

一个现代的、可移植的、跨语言的单元测试和模拟框架,用于C和C++。它提供了一个可选的BDD符号,一个模拟库,能够在一个进程中运行它(使调试更容易)。可以使用自动发现测试功能的测试运行程序。但您可以通过编程方式创建自己的

中介绍了所有这些功能(以及更多功能)


Wikipedia提供了C单元测试框架的详细列表,位于Google拥有优秀的测试框架下


是的,就我所见,它将与普通C一起工作,即不需要C++特征(可能需要C++编译器,不确定)。

< P> >

< P>如果您熟悉JUnit,那么我推荐CppUnit。


假设你有C++编译器来执行单元测试。如果不是,我必须同意Adam Rosenfield,检查是你想要的。< /P> < P>使用的技术是用C++ XUng+FraseC++(C++编译器)开发单元测试代码,同时保持目标系统的源为C模块。 确保定期在交叉编译器下编译C源代码,如果可能的话,使用单元测试自动编译

是嵌入式C系统的单元测试框架。它的设计是从JUnit和CUnit以及其他版本复制过来的,然后在某种程度上适应了嵌入式C系统。嵌入式单元不需要标准C库。所有对象都分配给常量区域

并且自动化了嵌入式软件的单元测试。

是一个非常简单的单元测试框架。 我用它来单元测试avr的c微控制器代码。

首先,看这里:

我的公司有一个客户使用的C库。我们使用CXXTest(一个C++单元测试库)来测试代码。该股也将发挥作用。如果你还停留在C语言中,我建议你使用RCUNIT(但CUnit也很好)。

我使用它作为嵌入式C/C++环境
#include <tap.h>

int main () {
    plan(5);

    ok(3 == 3);
    is("fnord", "eek", "two different strings not that way?");
    ok(3 <= 8732, "%d <= %d", 3, 8732);
    like("fnord", "f(yes|no)r*[a-f]$");
    cmp_ok(3, ">=", 10);

    done_testing();
}
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
#include "myimplementationfile.c"
#include <gtest/gtest.h>

// Mock out external dependency on mylogger.o
void Logger_log(...){}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(null_test_success),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}
#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