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

c - target_link_libraries(--wrap) 是如何工作的?

我想为 C 代码测试创建模拟函数并了解在 target_link_libraries() 中可以选择包装类似于模拟的函数,但不明白它是如何工作的?

我如何编写这个包装功能以及它是如何工作的?

0 投票
1 回答
868 浏览

c - 如何使用 CMOCKA 框架运行 c 单元测试用例?

我最近开始研究一个用 C 语言编写的项目。为了添加单元测试用例,我搜索了 C 单元测试框架,我遇到了这个答案C-unittest-frameworks。所以我选择了mocka,从安装步骤安装。但我知道如何运行书面测试用例。有人可以帮我从命令行(GCC命令)运行下面的简单单元案例:

仅供参考,我指的是cmocka。请告诉我除了 GCC 和 cmocka 之外还需要哪些依赖项。或者需要为 LD 路径等设置任何环境变量。

关于这个问题的更新,我按照以下步骤操作:

毕竟,步骤,如果我在构建目录中执行ctest tests/,它正在运行所有测试用例。现在我被困在如何为我的项目遵循相同的步骤并运行一个虚拟单元测试用例。

0 投票
0 回答
449 浏览

cmake - 如何将 CMake 和 CPack 与覆盖我的变量的依赖项一起使用?

我正在尝试使用 CPack 来打包我的项目,但我遇到了我的依赖项之一的问题。

首先,我试图通过依赖于目标和使用target_link_libraries. 我的项目使用CMocka库作为依赖项。我已将 CMocka 存储库添加为 git 子模块,并且add_subdirectory(cmocka_dir)在我自己的CMakeLists.txt文件中。

我还使用带有TGZ生成器的 CPack 将我的所有文件收集到一个存档中。我只是在我set(CPACK_GENERATOR TGZ)的. 我发现这可以解决所有问题,也就是说,直到我开始使用 CMocka。CMocka在它的root中设置了很多变量。我相信,当我在自己的项目中包含 CMocka 的子目录时,这些变量会在我的 CMake 范围内传播,并且会干扰我的打包过程。include(CPack)CMakeLists.txtCPACK_xxx CMakeLists.txt

我的问题是如何解决这个问题。具体来说:

  1. 有没有办法在自己的环境中隔离 CMocka,或者以其他方式防止它破坏我的包装过程?
  2. 使用 CMocka 包含我做错了add_subdirectory吗?
  3. 我只是通过设置CPACK_GENERATOR和做错了 CPackinclude(CPack)吗?

谢谢你的想法。

0 投票
1 回答
1645 浏览

c - 使用 C 进行 Cmocka 单元测试:模拟嵌套函数调用

因此,玩具程序复制了我使用 cmocka 为现有代码开发单元测试时遇到的问题。问题是嵌套函数调用不模拟,这使得单元测试依赖于嵌套函数调用的正确执行。请注意,使用“mockable_static”定义是因为原始代码具有作为“内部函数调用”存在的静态函数,但出于单元测试的目的,这些对外部调用开放。(请参阅这个想法来自的stackoverflow帖子

废话不多说,代码如下:

函数.h:

函数.c:

测试.c:

gcc 编译行:

测试执行结果:

正如你所看到的,bar() 没有被包裹在 foo() 中,但是在包裹测试中,bar 被包裹在 foo() 调用 bar 中。Bar 使用 __real_bar() 进行测试,它是 cmocka 测试库的一部分(而 __real_bar() 有一个原型,该函数从未定义过,并根据 cmocka 文档返回预期结果。任何人都有在嵌套函数调用上使用单元测试的经验? 我没有找到任何用 cmocka 模拟嵌套函数调用的结果,但是我的 google-foo 可能缺少。如果在 test_foo() 结束时删除了断言,则由于 will_return 队列中未使用的值,测试失败。

0 投票
0 回答
455 浏览

c - Cmocka:在测试失败时打印上下文

我正在使用 CMocka 编写一些单元测试。我的一些测试循环通过存储在结构中以避免重复的案例列表:

这确实有效:

然而,断言只是在第 64 行(assert_int_equal(...)),在这种情况下,失败的情况很明显。但是,并非总是如此 - 也许失败是一个没有直接出现在案例中的数字,或者是在案例之间共享的,这意味着您无法分辨出ERROR哪个LINE失败TestCase了。我真的不希望printf()每一种情况都如此,否则测试中会有数千行垃圾邮件,但我也不想在提高调试级别的情况下重新运行测试以查看失败的原因。

使用 Boost Test,我可以使用消息或上下文 ( docs ) 来执行此操作并在失败时打印一条方便的消息(包括 RAII 范围之类的好东西,但它是 C++,所以这就是原因)。在 Cmocka中,state如果需要,我有存储消息的参数,但是,我看不到如何挂钩断言失败以将该消息打印给用户。

state如果您知道测试是否在拆卸期间失败,您可以在执行期间使用 、push 和 pop实现一堆字符串,并在发生失败时打印它们,但事实上,我看不出拆卸回调有任何想法测试通过/失败状态。

这在 CMocka 中可能吗?

0 投票
1 回答
81 浏览

c - 为什么C不支持TDD。它不能模拟功能?

目标:模拟(main.c)而不修改任何原始文件(work.a)

objcopy work.a --add-symbol _real_test1=.text:00000000000126ed,weak --weaken work.a

00000000000126ed 是命令的 test1 地址 (nm work.a)

在没有原始文件的情况下覆盖函数并在 main.c 中调用真实函数

它可以工作

#work.a

#main.c

问题:我怎样才能制作多个 real_function

例如:test1,__real_test1 test2,__real_test2...

或其他模拟功能的方法

尝试失败

尝试失败:因为它需要修改原始文件work.a

尝试失败:因为它只是修改函数名而不是模拟函数

尝试失败:因为它只在 main.c 中工作,它仍然在 work.a 中调用旧的 test1

0 投票
0 回答
277 浏览

c - cmocka 如何在共享库中使用 --wrap 来模拟函数?

我正在使用 cmocka 对用 C 编写的大型代码库进行单元测试。我希望单元测试在库级别运行,但是在共享库中编译时遇到了模拟函数的问题。我相信共享库是问题所在,因为--wrap当不是共享库的一部分时,我可以使用链接器标志成功地模拟相同的代码。同样SOURCE_FILE,这是我的两种不同的编译方法。作为参考,我正在尝试模拟 C 标准库函数strcmp

导致成功模拟的编译步骤strcmp

创建共享库然后进行测试的编译步骤。执行my_test演示不成功的模拟时抛出错误strcmp

供参考,这是我看到的错误:

每当您尝试使用 cmocka 时,都会引发此 cmocka 错误will_return,但未发生函数包装。我试图弄清楚为什么创建共享对象的一小步会阻止 gcc 链接器包装函数调用。

我找不到有关堆栈溢出或其他有关在共享对象上使用 cmocka 的任何信息。将不胜感激任何想法,建议或解释为什么这不起作用。我知道--wrap当调用者和被调用者定义在同一个文件中时,这不起作用。这就是这里造成问题的原因吗?

0 投票
0 回答
43 浏览

unit-testing - 在 ubuntu 中设置 CMOCKA 单元测试框架工作

考虑到我只是软件公司的新手,我收到的第一个任务是为我的项目设置 CMOCKA 单元测试框架。目前我所知道的是源代码(待测试)在 Ubuntu 机器上可用。因为我以前从未使用过单元测试。我很不清楚如何设置这个框架。我试图在网上阅读它,但找不到太多。我对社区的问题是如何在 ubuntu 中设置 CMOCKA 单元测试框架,以便我可以在 Ubuntu 中测试我的代码。

0 投票
1 回答
241 浏览

c - __wrap_strcpy() 有剩余的非返回值

我是新手,我在使用 cmocka 进行单元测试时遇到问题。我有以下功能:

我想为该函数编写单元测试并在此处为 strcpy 使用模拟:

并且程序给出了这样的错误:

我应该如何修复它以获得准确的结果?

0 投票
1 回答
34 浏览

embedded - 在 Bazel Build 中导入 cmocka 库

我将 cmocka 与 Bazel 一起使用,我想在我的测试文件(用于 c 嵌入式代码)中导入 cmocka 库,例如 <cmocka.h> 但我总是得到: cmocka.h: No such file or directory。

我的构建是: