问题标签 [cmocka]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
241 浏览

ctest - CTest 从 cmocka 源中提取测试名称

我正在使用 CTest 运行用 cmocka 编写的测试。我想知道是否可以让 CTest 从我的 cmocka 源中读取测试名称并在输出中将它们提供给我。例如,如果我的测试源包含 3 个测试:和test_order_correct,如果我将这些测试构建到一个名为的可执行文件中并使用 CTest 运行它,我得到的唯一输出是:test_order_receivedtest_customer_happytests

我倒要看看:

这是可能的,还是 CTest 不能像那样深入研究源代码?当我输入这个时,这个词似乎越来越不可能。

0 投票
2 回答
1673 浏览

unit-testing - cmocka malloc 测试OOM和gcov

我很难找到使用 cmocka、测试 malloc 失败(模拟)和使用 gcov 的问题的答案

关于 cmocka+gcov 的更新:我注意到在我的 cmocka 测试中模拟一个函数后,我会立即得到空的 gcda 文件。为什么?谷歌搜索 cmocka 和 gcov 给出了人们谈论将两者结合使用的结果。似乎大多数人都在使用 CMake,我稍后会看到,但应该没有理由(我能想到的)需要我使用 cmake。为什么我不能只使用带有 --coverage/-lgcov 标志的 cmocka?

原始问题:

我尝试了无数种组合,主要基于两个主要想法:

我尝试使用 -Wl,--wrap=malloc 所以对 malloc 的调用被包装了。从我的 cmocka 测试中,我尝试使用 will_return(__wrap_malloc, (void*)NULL) 来模拟 malloc 失败。在我的 wrap 函数中,我使用 mock() 来确定我应该返回 __real_malloc() 还是 NULL。这具有理想的效果,但是我发现 gcov 无法创建 gcda 文件,这是包装 malloc 的部分原因,因此我可以测试 malloc 失败并获得代码覆盖率结果。我觉得我玩过带有符号的肮脏游戏,并且弄乱了从其他编译单元(gcov?cmocka?)调用的 malloc() 调用。

我尝试的另一种方法是对我们 gcc -include 使用 #define for malloc 来调用“my malloc”并编译我的目标代码以使用 mymalloc.c 进行测试(定义“my malloc”)。因此,#define malloc _mymalloc 可以帮助我仅从目标测试代码中调用“特殊 malloc”,而在其他任何地方都单独调用 malloc(即,单独留下其他编译单元,以便它们始终调用真正的 malloc)。但是我不知道如何正确使用 will_return() 和 mock() 来检测失败案例与成功案例。如果我正在测试 malloc() 失败,我会得到我想要的,我会根据 mock() 返回 NULL 从“malloc”返回 NULL——这一切都是在 malloc 的包装函数中完成的,它只在目标代码中调用。但是,如果我想返回真正的 malloc 的结果,那么 cmocka 将失败,因为我没有从 mock() 返回结果。我希望我可以让 cmocka 从 mock() 宏中取出结果,然后不在乎我没有返回结果,因为我需要 malloc() 的真实结果,以便被测代码可以正常运行。

我觉得应该可以将 malloc 测试与 cmocka 结合起来并获得 gcov 结果。

无论答案是什么,我都想提取以下内容或类似内容。

然后进行 cmocka 测试,例如

我接近我尝试过的一些#define/wrap 想法,但最后我要么搞砸了 malloc 并导致 gcov 不吐出我的覆盖率数据,要么我没有办法让 cmocka 运行 malloc 案例并返回真实内存,即不从 mock() 调用返回。一方面,我可以从我的测试驱动程序调用真正的 malloc 并将其传递给 will_return 但我的 test_code 不知道所需内存的大小,只有被测试的代码知道这一点。

鉴于时间限制,我不想离开 cmocka 和我当前的测试基础设施。如果我想要的东西是不可能的,我会在未来考虑其他想法。我正在寻找的东西我知道这不是新的,但我正在尝试使用 cmocka/gcov 解决方案。

谢谢

0 投票
2 回答
1550 浏览

cmocka - Cmocka 如何测试我的 (void) 回调函数是否使用正确的参数调用?

我正在使用Cmocka进行单元测试,并且无法更改。

我正在测试我的软件的一部分,它调用回调函数,如果值更改,指示哪个数据项更改以及新值是什么。

回调函数具有以下签名:

对于单元测试,我想注册一些回调函数并确保它们被实际调用,并且它们接收到正确的参数。

我可以expect_int()在我的模拟中使用,以验证它们是否使用正确的参数调用。

但是,我看不出我可以如何使用will_return(),因为我的回调函数是类型的void(并且无法更改)。

我将如何声明一个模拟回调函数并验证它是否使用正确的参数调用?请注意,如果未调用该函数,则测试应该失败。

0 投票
1 回答
570 浏览

unit-testing - 我应该检查模拟函数中的输入变量(指针)吗?

我正在使用CMocka在 C 中编写一系列模拟函数

其中一些将指针作为输入变量,我不确定是否应该检查它们(ptr != NULL)。

一般来说,模拟函数是否负责执行输入检查?

如果是,当发现错误时它应该如何表现?它应该使用框架提供的断言函数吗?

0 投票
1 回答
787 浏览

gcc - GCC 链接器:传递多个 --wrap=

我正在使用cmocka添加很多模拟,这需要我使用 GC Clinker 选项为它们起别名--wrap=

我正在传递格式的链接器选项

有什么办法可以缩短吗?

-Wl,--wrap=foo,bar,baz,...不工作。有什么建议么?

0 投票
2 回答
2472 浏览

c - Cmocka:检查作为参数传递的结构

假设我声明了一个名为 foo 的 C 结构,它有一个名为 bar 的 int 字段和一个名为 baz 的 char *。

如何使用Cmocka expect_check_expected宏来检查传递的结构是否正确以及两个字段是否具有预期值?如果文档中有示例,我错过了。


[更新] 也许我可以使用expect_check()?但我找不到一个例子:-(

0 投票
2 回答
1757 浏览

c - 如何模拟头文件中的函数?

我在做什么:

我正在使用 cmocka 为大型嵌入式项目运行单元测试。嵌入式项目使用arm-gcc-compiler. gcc单元测试使用嵌入式代码和 cmocka 库的正常使用片段进行编译。

通常 cmocka 建议使用-Wl,--wrap=functionName标志来模拟(替换)一些不需要的子功能。这工作得很好。

问题:

好吧,在我的嵌入式代码中有一个头文件 ( foo.h),其中包含一些函数(声明为内联)。其中一个函数包含 . 的一些汇编代码arm-gcc-compiler,当然gcc.

愚蠢的是,wrap-flag 似乎不适用于放置在头文件中的函数。

问题:

如何在头文件中模拟这个函数?

我如何尝试解决问题:

我想过插入一些#idef宏来排除提到的汇编器部分。但这无法做到,因为该文件属于许可库,并且我不允许更改其内容。

我可以将我的待测函数提取到一个附加文件中,这样foo.h就不需要再包含它了。但这会混淆嵌入式源代码结构。

问题的确切线

确切的代码放在 freeRtos 的portmacro.h中的第 233 行:

其中 asportFORCE_INLINE定义为:

0 投票
1 回答
1211 浏览

c - 如何用 cmocka 处理静态元素?

我正在使用 cmocka 对我的 C 项目进行一些单元测试,我想知道如何处理静态元素。

静态元素适合我:

  1. 声明为静态的函数
  2. 声明为静态的函数内的变量

所以让这个函数fut成为我们被测试的函数,并foo成为另一个函数。两者都放在文件中bar.c

让 foo.h 看起来像这样:

所以让我们继续,我将展示问题。我想通过两个独立的测试来测试被测函数,这些测试传递了一些随机值add。测试例程放在 main.c 中,如下所示:

现在我可以尝试使用以下代码编译单元测试: gcc main.c foo.c -Icmocka

现在有两个问题:

  1. 声明为 static 的函数无法从 访问main.c,因此链接器将在构建过程中停止。

  2. 函数内部声明为静态的变量不会在两次测试之间重置。所以fut_test_2会失败。

如何处理上述静态元素的这些问题?

0 投票
1 回答
2959 浏览

c - Cmocka - 错误:没有符号条目

我刚开始使用 Cmocka,我已经在这个问题上停留了一段时间。我有一个正在尝试构建的 cmocka 项目。当我尝试使用“make”时,我看到了错误。

[ 错误 ] --- 没有符号 __wrap_i2c_read 的条目。

此外,我在调用的行的 mock_i2c.c 文件中看到错误mock()

无法获得模拟函数 __wrap_i2c_read 的值。

现在我只是想模拟一个真/假值来让它工作。所以我的模拟看起来像

我在我的测试中检查了我正在打电话will_return(__wrap_i2c_read, true);

在我的 Makefile 中,LDFLAGS += -Wl,--wrap=i2c_read 我已经cmocka.h包含在 mock_i2c.c 文件中。

对于这个模拟函数,这似乎不是一个问题,因为如果我不使用它,我会在该文件中的其他模拟函数中得到相同的错误。我不确定还需要什么其他信息,请告诉我。有人知道这是什么意思/以前见过吗?

谢谢。

编辑:所以我想我已经弄清楚为什么会出现这个错误。我正在测试的函数中有一个for循环。从这个函数调用模拟函数。一旦我删除循环,错误就会消失。这可能与will_return模拟值如何/何时排队有关吗?for循环阻碍了?

Edit2:好的,看来我只是没有排队足够的模拟值。

0 投票
1 回答
457 浏览

signals - 如何在 FreeRTOS 中使用 cmocka?

我在运行FreeRTOS的嵌入式 arm 微控制器(stm32)上使用cmocka

好吧,cmocka 在作为 FreeRTOS 任务运行时似乎有一些问题。在第 2953 行,一些信号被初始化,这会导致 FreeRTOS任务中的堆栈溢出。我将任务堆栈大小增加到最大 64kB,但这无济于事。

如果我在没有启动 FreeRTOS 调度程序的情况下运行 cmocka,它工作得很好。

但我需要用 FreeRTOS 运行 cmocka。所以我尝试通过传递-DHAVE_SIGNAL_H给编译器来运行 cmocka 而不使用 signal.h,然后编译器应该禁用第 30 行中的定义。但这不会禁用信号的使用。它只是禁用包含。

如何将cmockaFreeRTOS一起使用?