问题标签 [cpputest]

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 回答
234 浏览

c - 如何在一个模块中运行 C 函数的模拟,但在使用链接时间替换的同时在另一个模块中运行实际实现?

我有一个场景,我的同事正在编写我希望在我的模块中使用的函数。他为他的模块编写单元测试,而我正在为我的模块编写单元测试。自然,我想为我的测试模拟他的功能。

生产代码是用 C 语言编写的,并与单元测试代码分开编译为库。在链接时,我们正在为 Mock 版本覆盖产品的目标代码。但是,这会覆盖对该特定函数的所有调用,而不仅仅是在我的单元测试中。

这是一个例子。

使用 CPPUTEST,我可以MockSupport_c.h随意使用。所以我为他的功能写了一个模拟。前任

实际功能:

我用我想测试的函数调用上述内容

测试模块如下所示:

编译单元测试时,链接器会将生产代码实现替换为模拟版本;但它会为对该函数的所有调用执行此操作。所以我的同事单元测试现在调用模拟,当它应该测试他的实际调用时。

如何让模拟仅在我的测试期间应用,而不覆盖我的同事电话?

或者我只是对所有这些工作方式不满意?

0 投票
0 回答
112 浏览

c++ - Valgrind 在 cpputest TEST() 宏中显示内存泄漏

似乎在使用 cpputest 库时运行 valgrind 会导致内存泄漏错误。我使用 CLion + WSL (GCC + Valgrind)。包含TEST()宏的每一行都列在泄漏报告中。

我不认为它们是真正的泄漏(是吗?)。当您展开宏时,您可以看到类似于以下内容的内容:

0 投票
0 回答
91 浏览

c++ - 如何对只读的外部设备寄存器进行单元测试?

我是 TDD 和单元测试的新手,目前正在阅读 James Greenings 的《嵌入式 C 的 TDD》一书。

我真的采用双重目标,因为它可以在主机和目标设备上测试我的情况。

我正在对我的放大器驱动程序进行单元测试,并且有两个要求被声明为

每当需要时,驱动程序应手动读取放大器 IC 上的故障通知引脚。

故障通知引脚应在发生任何故障时触发系统。

如您所见,应该有一个 read_fault_notification 函数,它传递地址并访问硬件。到这里为止一切都很好。

这是我在amp.c中的ampamp_get_fault_notification 函数

放大器.c

现在,ampl_gpio_read 链接到 hardware.c 中的特定于目标的函数,因此,硬件抽象提供了。

问题是我应该如何测试这个要求“驱动程序应在需要时手动读取放大器 IC 上的故障通知引脚”。@kamilcuk 告诉我,如果您想参加此活动,请进行整合。如果您想测试您的函数,请模拟它但没有告诉我如何设置该测试用例。

另一个似乎更困难的问题是我应该如何以及在哪里(在这个驱动程序层或应用程序层?)测试这个要求“故障通知引脚应在发生任何故障时触发系统”。

每个人都告诉我使用模拟。问题是没有使用mock框架,这个很简单,问题是虽然我看了很多资料,还是不明白Mocking的概念。因为,在詹姆斯的书中,他是在填充硬件相关代码的函数体来表现得像真的一样,这让我很困惑。一旦虚拟地编写依赖于硬件的代码,根据这个虚拟函数测试嵌套的指令函数对我来说没有意义。目的是什么。双目标方法很好。我觉得自己有点白痴。

0 投票
0 回答
161 浏览

c++ - CppUTest - 没有测试正在运行

我正在尝试使用 CMake 设置 CppUTest 项目。我是 CMake 的新手,所以我从这个例子开始:link

它工作正常。项目编译,我看到测试运行。

然后我尝试根据这个例子创建我自己的项目。我的项目也编译没有错误,但我总是得到以下输出: OK (0 tests, 0 ran, 0 checks, 0 ignored, 0 filtered out, 0 ms)

我不知道为什么 CppUTest 框架“看不到”我创建的测试。

我所做的是:创建了这样的项目结构:

代码目录下的 CMakeLists.txt 文件包含以下代码:

code/Tests 目录中的 CMakeLists.txt 包含:

leds_tests.cpp 包含:

我还注意到,当我将 leds_test.cpp 的内容更改为:

在 RunAllTests.cpp 中做了:

然后我在控制台输出上得到“一些文本”。所以 LedDriverTest.a 正确链接到 RunAllTests 可执行文件。

如果有人可以帮助我,我将不胜感激,因为我想在我的工作中引入单元测试和 tdd。

问候,MF

0 投票
0 回答
28 浏览

eclipse - 有没有办法为在 Eclipse 中有两个不同工具链的 2 个嵌套项目共享相同的文件目录?

我的项目是在 STM32Cube IDE 中创建的,基于 Eclipse 并使用 Arm GCC。还有另一个嵌套项目,它是使用 Cygwin C/C++ 的单元测试项目。

我想使用相同的文件目录进行开发和测试。在创建测试用例时,它将创建生产代码,如果我通过同一个文件目录链接这两个项目,我认为我可以自动执行此操作。

例如:假设CubeIderproj/driver/inc中有led_driver.cand 。我想测试使用过的. 如何在嵌套的 utest proj 中调用我的 which。led_driver.hled_driver_test.cppled_driver.hled_driver.hled_driver_test.cpp

在测试前进的led_driver.h同时led_driver.cCubeIderproj将开始自动创建。

这是一个好方法吗?还有其他更可靠或更简单的方法吗?

顺便说一句,我尝试在基于 arm 的项目中创建一个名为 Test 的构建类型。然后,我尝试链接 cygwin 编译器,但没有成功。

0 投票
1 回答
163 浏览

jenkins - Jenkins 上的 CppUTest

我们使用 CppUTest 运行单元测试。这是由 Cmake/Ninja 执行的,在构建测试之后,我们使用 ninja 执行它们ninja test

一个示例输出是:

如果我在我的机器上本地触发构建并手动分析它,这没关系。现在我正在寻找的是一个已经存在的解决方案来帮助詹金斯分析输出。

现在,Jenkins 执行构建并“成功”退出,因为命令本身ninja test成功执行,但不是所有测试。

0 投票
0 回答
69 浏览

c++ - 测试时如何避免二次定义静态内联函数

我正在尝试将 CppuTest 添加到函数 TestFunc(),该函数使用在 helperfunction.hpp 中定义的静态内联函数helperFunc() 。helperfunction.hpp 作为头文件添加到我要测试的文件中。

我想在 helperfunctionMock.hpp 中使用静态内联 helperFunc() 的模拟版本,而不是真正的 helperFunc()。我将 helperfunctionMock.hpp 添加到测试文件中。

当我单独从模拟中调用 helperFunc() 时,它工作正常。但是当我调用 TestFunc() 时,它在 CppUTest 中给了我一个分段错误。我相信这是由于静态内联 helperFunc()的两个定义。构建和执行测试文件时如何避免此错误?

FileUnderTest.cpp

辅助函数.hpp

TestFileUnderTest.cpp

最后,helperfunctionMock.hpp

0 投票
1 回答
321 浏览

c++ - 如何将编译选项添加到 CMake FetchContent 依赖项?

我有一个 C/C++ 项目,我想在其中使用 CppUTest。因此,我将 CppUTest 的依赖项包括在内:

这工作正常。

在我的(汽车)项目中,我使用 C++20 标准,我需要启用所有/大多数警告。但是当我这样做时,CppUTest 会给我带来很多警告。所以,我想用与项目代码不同的编译器选项来编译 CppUTest。

如何在 CMake 中配置它?我用谷歌搜索了很多,但没有找到任何有用的东西。

谢谢,斯特凡

PS:我的简化 CMake 文件是:

0 投票
1 回答
48 浏览

c - 可以模拟具有声明函数的标头吗?

我正在从事一个针对 Silicon Labs 微控制器的项目。我想为蓝牙 SDK 调用创建一个包装器。SDK 库依赖很多,因此通过在该界面中创建外观,我可以避免将它们添加到我的测试中。请注意,此问题并非特定于 Silicon Labs 平台,但我将保留 SiLabs SDK 文件名,以防读者熟悉该平台。

我使用 CPPUTest 作为我的测试框架。我的代码是 C 和 C++ 的混合体,但就这个问题而言,它是 C。

例如,我的一个包装函数(在一个名为 的模块中Bluetooth_HW)将是

BT_setAdvertisementMessage()wraps gecko_cmd_le_gap_bt5_set_adv_data(),在native_gecko.hSDK 头文件中定义。我BT_setAdvertisementMessage()在中声明Bluetooth_HW.h并定义它bluetooth_HW.c。我需要设置广告消息的代码然后包含Bluetooth_HW.h而不是native_gecko.h,并且Bluetooth_HW.h很容易模拟。

我想测试一下Bluetooth_HW.c。我需要对此进行模拟native_gecko.h,因为我对运行它的代码不感兴趣(它是由制造商提供的,我相信它,而且我不是单元测试native_gecko,我是单元测试Bluetooth_HW)。通常,我会.h在测试中包含生产文件,以获取函数的声明,然后.c用我的假实现替换包含生产代码定义的文件。

我的问题是它native_gecko.h定义gecko_cmd_le_gap_bt5_set_adv_data()为标题内的内联,而不是在文件上执行它的更常见方法.c

我可以将自己包装native_gecko.h在一个只声明我需要的函数的标头上,并使我的代码包含该标头,但是我无法访问在 中声明的其他内容native_gecko.h,例如自定义类型和枚举。我无法将这些类型和枚举移动到包装器中,因为我无法从中删除它们,native_gecko.h然后编译器会抱怨被定义了两次,我不想 touch native_gecko.h,因为它是一个 SDK 文件。

所以,我的问题是如何模拟在其标头中定义代码的模块?

0 投票
0 回答
16 浏览

c++ - MSVS cpputest:链接器:尝试构建最小运行示例时未解析的符号

我想在 MSVS2019 下使用 cpputest 构建一个小示例项目。为此,我使用一个空项目(稍后将包含我的源文件)、包含的 cpputest-repository 和我的 utest-project 构建一个解决方案,我想在其中为第一个项目编写测试。

当我构建时,我从链接器中得到了很多未解决的符号错误,尽管 Visual Studio“知道”(当我点击它们时,我可以打开连接的 .cpp 文件,查看它们的 defs 等等)......首先一种是:

这是我尝试过的:

  • 我首先在https://cpputest.github.io/下载了 3.8.-zip,并在 /doc 中找到了一个解释如何设置 msvs-project 的 word 文件(它与 vs2010 相关,但我认为不可能远离我想在 vs2019 中做的事情)。
  • 当我尝试构建此解决方案时,我无法构建此解决方案,找不到某些文件,我认为我遇到了与此处所述相同的问题:https ://github.com/cpptest/cpputest/issues/1046 -到目前为止,一切都很好
  • 我从所有不必要的遗留配置中清除了用于 unittest-project 的编译器和链接器,现在我只使用编译器配置:

AdditionalIncludeDirectories C:\Projects\cpputest\include;

和链接器配置:

附加库目录“C:\Projects\cpputest\lib”

这导致 cl 文本:

/JMC /ifcOutput "调试" /GS /analyze- /W1 /Zc:wchar_t /I"C:\Projects\cpputest\include" /ZI /Gm- /Od /Fd"Debug\vc142.pdb" /FI"C :\Projects\cpputest/include/CppUTest/MemoryLeakDetectorNewMacros.h" /FI"C:\Projects\cpputest/include/CppUTest/MemoryLeakDetectorMallocMacros.h" /Zc:inline /fp:precise /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /FC /Fa"Debug" /EHsc /nologo /Fo"Debug" /Fp"Debug\UnitTest.pch" /diagnostics:column

和链接器文本

/OUT:"C:\Projects\dummyfirmware_cpputest\dummyFirmware_CppUTest_Solution\Debug\UnitTest.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Projects\dummyfirmware_cpputest\dummyFirmware_CppUTest_Solution\Debug\UnitTest.pdb" /DYNAMICBASE "kernel32.lib" " user32.lib""gdi32.lib""winspool.lib""comdlg32.lib""advapi32.lib""shell32.lib""ole32.lib""oleaut32.lib""uuid.lib""odbc32.lib"" odbccp32.lib" /DEBUG:FULL /MACHINE:X86 /INCREMENTAL /PGD:"C:\Projects\dummyfirmware_cpputest\dummyFirmware_CppUTest_Solution\Debug\UnitTest.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile :"Debug\UnitTest.exe.intermediate.manifest" /LTCGOUT:"Debug\UnitTest.iobj"/ERRORREPORT:PROMPT /ILK:"Debug\UnitTest.ilk" /NOLOGO /LIBPATH:"C:\Projects\cpputest\lib" /TLBID:1

我的代码:

有人知道我哪里出错了吗?