问题标签 [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 投票
0 回答
326 浏览

c - 尝试使用 CMocka 和 `gcc -Wl,wrap...` 模拟 `abort`

我正在使用CMocka构建单元测试。我的函数char some_func(some_enum e)将 的有效值映射e到 a char。它用于assert检查e是否有效,根据定义调用abort是否有效。

事实证明,嘲讽abort很难。遵循这个例子并构建一个函数......

..编译时-Wl,--wrap=abort没有任何抱怨。但是,执行时它不会调用__wrap_abort.

我正在尝试的甚至可能吗?

0 投票
0 回答
28 浏览

c - 语法中的单元测试不起作用

我一直在尝试学习 cmocka 来执行 unitest。在查看互联网上的各种示例后,我对如何进行单元测试感到困惑,特别是我无法理解以下语法:

我无法理解为什么使用 void ** 状态以及它意味着什么。我正在对循环缓冲区进行单元测试以检查它是否已满,我该怎么做?到目前为止,我已经为 c mocka 编写了 uni 测试,如下所示:

0 投票
0 回答
2957 浏览

c - GCC 的链接器 --wrap 不会覆盖静态库函数

我正在尝试使用 CMocka 和 GCC 的--wrap链接器选项来模拟 C 函数。到目前为止,这种技术在模拟 stdlib 函数(如fgetspopenpclose等)方面效果很好。

但是现在我正在尝试模拟静态库中的函数,但这也不起作用。事实上,静态库函数总是被调用,即使我尝试使用--wrap. 我设法在 foobar 项目中重现了这一点。

这是我非常简单的静态库的源代码:

你好.h

你好ç

这是我的测试程序的源代码:

测试.c

最后,链接器行如下(我使用的是 CMake,所以这就是为什么它看起来很奇怪),为您的眼睛分成多行:

当然,测试输出表明 wrap 函数没有按预期调用:

0 投票
2 回答
3193 浏览

c - 在 cmocka 中创建夹具

我正在开发一个使用 cmocka 框架的项目。cmocka主页状态

测试夹具是设置和拆卸功能,可以在多个测试用例之间共享,以提供准备测试环境并在之后销毁它的通用功能。

但是,读过的所有文档 都没有解释夹具系统的工作原理。

如果我使用看起来像这样的代码运行我的测试

我如何/在哪里可以指示 cmocka 运行设置/拆除固定装置以及 cmocka 有哪些功能(如果有)可以让我访问在所述固定装置中创建的东西?

0 投票
1 回答
1411 浏览

c - cmocka,如何检查函数指针

我在文档和服务员示例中进行了搜索,但找不到有关如何检查正确的函数指针是否作为参数传递给函数的示例。

此示例代码应详细说明我的意思:

我的想法是模拟这样的过程:

并且,在测试调用中:

这不起作用,因为如果我在 expect_memory 中替换为测试通过func_A。除了可以检查指针之外,func_B我没有看到任何功能。expect_*expect_memory

你用了什么?

编辑:添加了以下示例。EDIT2:更新了包含的示例并验证了它是否正确编译。

例如,我可以提供这个简单的代码:

代码注意事项:本测试代码中未测试函数register_callback。函数体被省略,因为在编译代码期间,将参数 -Wl,--wrap=register_callback 传递给链接器,函数完全替换为 __wrap_register_callback

这个想法是一个函数初始化一个回调,这个回调依赖于一些初始化值。我想根据情况检查所选回调是否正确。

从文档页面https://api.cmocka.org/group__cmocka__param.html

用于验证被模拟的函数接收到的参数的可用宏不包含用于验证函数指针参数的函数。在我看来,我可以适应这个范围的唯一功能是 expect_memory 但是

  • 它不工作,
  • 我没有正确理解它的使用方式
  • 我在写测试时犯了一个错误。
0 投票
1 回答
298 浏览

c - 单元测试运行配置

我需要启动并运行 Cmocka 单元测试框架。我的设置是:

src/math/addition/add.c (+add.h)

src/数学/减法/sub.c (+sub.h)

生成文件

单元测试

测试/数学/加法/add_test.c

测试/数学/减法/sub_test.c

test/math/addition/add_test.c(来自cmocka.org

我是 C 单元测试的新手,基本上无法设置单元测试,包括链接 Cmocka 库等。

我的想法是拥有多个单元测试文件,而不是将所有单元测试放在一个文件中。

根据 Clearer 的回答进行编辑

扩大

从 1 个测试文件到 2 个和 3 个,它将至少有 10+ 个文件。寻找一些优化和表达方式以很好地扩展并易于管理。这是我到目前为止所做的。

这是到目前为止的观察结果。

  1. 该模式似乎就像为每对测试和 src 文件添加一个新目标。
  2. 在先决条件和命令中将 .o 对象添加到 libMath
  3. test:在先决条件和命令中的目标下添加测试可执行文件

在扩大规模的同时,这种方式更好还是有更好的方法?

PS我已经删除了 CFLAGS 线,没有它它工作正常,帮助我清理并减少一些混乱。可以吗?如果 .h 文件的路径不正确,我的 IDE (clion) 会显示红色的摆动线,因此我在测试文件中使用完整路径来包含 src 文件。

PPS它在项目的根目录上创建测试可执行文件,如何在 bin 文件夹中创建所有二进制文件,然后在项目结束时全部删除。

0 投票
1 回答
397 浏览

c - c中的包装函数

我的任务是为现有项目(用 C 编写)编写单元测试(使用 cunit 和 cmocka),并且遇到了以下问题。当我包装在测试文件中定义的函数时,只调用原始函数。另外,无法更改测试文件的来源。我读到的所有内容都不符合第二个条件,但另一方面,很难相信单元测试框架没有为这类问题做好准备。

那么是否可以将函数调用包装到在一个文件中定义和调用的函数?

我试图通过向 cmake 文件添加适当的链接器标志来包装它。

0 投票
2 回答
1430 浏览

c - 被测试的非静态函数调用的 Mock/Wrap 静态函数

我想通过使用 cmocka 框架实现单元测试来测试一些功能。

例如,我有一个正在测试的非静态函数,它调用两个静态函数。由于这些静态函数与硬件交互的事实,我想模拟/包装它们并在测试时使用包装函数而不是真实函数。

就像在 cmocka 文档中描述的那样,我在构建/链接我的测试时使用了 --wrap=myfunction 链接器标志。

测试编译但是当我运行它们时,将调用真正的静态函数而不是包装。

当我将静态函数声明为非静态时,它也不起作用,并且调用了真正的函数。我发现的唯一解决方案是将函数外包在一个额外的 .c 文件中......但这是一个非常糟糕的解决方法,因为它非常操纵代码。

0 投票
1 回答
820 浏览

c - 在多个 cmocka 单元测试中分配的内存

我正在尝试使用 cmocka 对一些源代码进行单元测试。基本上(相关的)源代码看起来类似于 Source.c。

单元测试分别调用每个函数。在测试Add()函数时,此函数最终将调用单元测试包装的util_malloc()(此函数通常在 malloc 之前检查 0 大小)。在 Wrappers.c 中的包装函数__wrap_util_malloc()中,首先检查预期大小,然后使用 malloc 分配内存。

接下来测试Remove()函数,其中先前分配的内存被释放。


运行测试 cmocka 时返回以下故障:

现在,我在Add_Test()函数的末尾添加了一个Remove()调用(并在Remove_Test()的开头添加了一个Add( ) )。这似乎可以解决问题。从这一点来看,应该在每个单独的单元测试中释放所有分配的内存。

现在我的问题:

  1. 是否可以在多个单元测试中使用分配的内存?
  2. 解决这个问题的最佳方法是什么?

来源.c:

单元测试.c:

包装器.c:

0 投票
1 回答
1397 浏览

c - 如何使用 arm-none-eabi-gcc + cmake 设置 cmocka 示例?

我正在为基于 stm32f4xx 的系统开发固件。为此,我基于 ARM 和 cmake 形式的 arm-none-eabi-gcc 工具链设置了一个工具链。该工具链适用于 Ubuntu。我可以 x 编译和调试(通过 openocd + eclipse IDE)。现在我想为我的代码添加一些功能测试。我正在检查,似乎 cmocka 是用于嵌入式软件测试的好工具。

我现在正在寻找一个将测试集成到 cmake 构建中的示例/模板。

让我们假设 myfunc.c 中的一个简单函数

如果我做对了,我可以在单独的 c 文件中进行测试,例如“test.c”

通常我跑

我的问题包含一些子问题: 1.) 我安装了 libcmocka-dev。这是针对我的主机系统的。我需要为 arm-none-eabi-gcc 编译器安装 cmocka 吗?2.) 如何设置 cmake 来选择 cmocka 库,构建测试并在主机系统上运行它?认为我的工具链文件需要被忽略。