问题标签 [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 回答
21 浏览

unit-testing - 将 unity.h 与 cmocka.h 一起使用

我正在使用 unity.h 断言和 cmocka 模拟测试测试我的 c 嵌入式代码。我的问题是当我使用 unity.h 断言时,例如:TEST_ASSERT_EQUAL_UINT8()当它失败时,我在运行测试时没有收到任何错误,我只是没有得到“通过”。

0 投票
1 回答
260 浏览

unit-testing - 使用 cmocka 模拟函数

我正在尝试使用 cmocka 模拟一些功能:

但是,我收到一个错误:led_status_toggel() 有剩余的未返回值。我是否必须为我的函数创建一个模拟文件,或者这个错误的根源是什么?Ps:我使用 unity.h 作为断言库。

0 投票
0 回答
73 浏览

linux - 使用 gdb 调试 cmocka 可执行文件

在测试具有多个用 ut(say abc) 编写的测试用例的可执行文件时。abc 给出了分段错误。我得到了核心,当我这样做时,gdb abc -c core我可以看到导致问题的线路,但我无法调试程序。当我这样做break main并运行命令时,run我会收到此消息libcmocka.so.0: cannot open shared object file: No such file or directory。为了解决该错误,我将 libcmocka.so.0.4.1 复制到本地目录并软链接到 libcmocka.so.0 。但仍然得到 error while loading shared libraries: libcmocka.so.0: cannot open shared object file: No such file or directory

0 投票
1 回答
63 浏览

c - 与用于单元测试的 wrap 指令链接可用于重新定义子例程?

我正在使用 Cmocka 为用 C 编写的共享对象编写单元测试套件,但我遇到了一些问题。由于我无法共享源代码,因此我编写了一个最低限度的“不工作”示例来说明问题所在:

我的程序由 5 个文件组成:foo.c、foo.h bar.c bar.h main.c。

  • bar.* 文件定义了一个 bar() 函数,它简单地返回参数乘以 2
  • foo.* 文件声明了一个使用 bar.h 定义的 bar() 函数的 foo() 函数
  • main.c 包含一个简单的 cmocka 测试和一个__wrap_bar()

函数,返回参数乘以 3。

我通过生成 libfootest.so 对象 (foo+bar) 来编译程序,然后将此对象与 main.o 链接,将 -Wl,--wrap=bar 标志传递给编译器。在这个配置中, libfootest是被测模块,main 是测试程序。我希望调用 __wrap__bar (未通过测试),但调用标准 bar() (通过测试)。我怎么解决这个问题?您可以在下面找到我正在使用的所有代码。

酒吧.c:

酒吧.h:

富.h:

富.c:

主.c:

生成文件:

0 投票
0 回答
57 浏览

unit-testing - 如果显示错误代码,如何使用 cmocka 进行调试

我用 cmocka 做 ut。当我运行测试时,消息显示“Test failed with exception:(11)”,错误代码是什么意思,如果我不下载 src 代码如何找到定义。

0 投票
0 回答
57 浏览

c - c cmocka 使用不同的参数运行相同的测试功能

我想在 cmocka 中编写一个测试,并每次使用不同的参数运行几次(这样我就可以测试不同的输入案例)。类似于 Python 的 decorators @parameterized.parameters。我可以想到一些方法,例如:

  1. 我总是可以使用一个常见的辅助函数并将测试的主要逻辑提取到它。然后从不同的测试中调用这个 aux 函数。
  2. 我可以在测试的顶部声明一个输入参数数组,然后在循环中运行测试逻辑并对数组进行迭代。
  3. 仅通过在 setup 函数中声明输入参数来执行相同的操作。
  4. 以通用方式编写测试,为每个参数集编写设置函数,然后执行相同的测试函数,同时每次提供不同的设置函数。这样,测试将从设置中接收参数值。我不确定这是一个很好的方法

目标是更好的可维护性和可扩展性。

重构测试的简单示例:假设我有一个函数bool is_even(int a) ,我想测试它。在测试文件中:

ps 让我们假设测试不仅仅是调用 is_even :)

我在徘徊还有其他方法,是否有比另一种更好的方法以及为什么:) 提前致谢。

0 投票
0 回答
45 浏览

c - 删除或削弱模块中的私有方法

我正在尝试使用 cmocka 测试模块中的私有函数。正在测试的方法还调用同一模块中的其他私有方法。

该模块被归档到一个库中,例如 libMyFoo.a,供 cmocka 测试使用。

测试方法的正常机制是使用测试链接器中的标志用替换方法包装子方法--wrap=foo_private,然后在单元测试中编写包装方法替换。

但是,由于这两种方法都在同一个模块中,这给我带来了困难。出于测试的目的,我可以更改编译、归档和链接库和测试的方式,但我无权更改被测源代码。

我试图削弱 foo_private 符号objcopy foo.o -W _foo_private foo-weak.o,当这不起作用时,我尝试使用objcopy foo.o -N _foo_private foo-removed.o.

我可以看到原始版本中的符号,

我可以看到弱版本中的符号是周末:

并在已删除的版本中丢失:

但是,无论我使用哪一个,我的测试执行总是输出。

在测试移除的对象时,我创建了一个本地(用于单元测试)版本的 foo_private。

objcopy 有什么我缺少的吗?符号名称错误?foo_private() 是否被静态编译成 foo_under_test()?我将优化设置为无(-O0)。

为了完整起见,我最初尝试对归档库执行此操作,效果类似,例如objcopy libMyFoo.a -N _foo_private libMyFoo-removed.a. 当这不起作用时,我进入模块级别,尝试削弱并删除那里的符号,然后将其添加回仅包含相关模块的库中。

是的,这个问题类似于下面的链接,但正如您所见,我尝试使用 objcopy 来削弱甚至删除有问题的符号,但仍在调用原始的 foo_private() 方法。

GNU gcc/ld - 使用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

限制链接对象的全局符号范围

0 投票
0 回答
29 浏览

c - 如何更改 cmocka 打印格式?

您好,有人知道如何更改 cmocka 框架 printf 格式吗?

例如,如果assert_int_equal失败,它将以十六进制显示值

我想把它改成十进制

0 投票
0 回答
34 浏览

c - 使用 CMocka 的模拟编译问题

我正在尝试从 CMocka 项目示例 -链接中编译厨师示例。

当我在没有模拟标志的情况下编译它时,没有编译问题。当我尝试使用定义的标志编译它时,我得到编译错误:

我收到以下错误行:

我看过几个例子,没有发现任何语法问题。我究竟做错了什么?谢谢你。

0 投票
0 回答
29 浏览

c - Cmocka:如何模拟一个称为函数指针的函数

如上面的代码所示,shellInit通过函数指针调用函数,该函数指针shell->dev->ops->init已分配给另一个文件中定义的函数。如何模拟这个被调用的函数?