问题标签 [ceedling]
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.
c - CMock 模拟一些功能,但不是来自同一模块的其他功能
我正在做单元测试。将 CMock 与 ceedling 一起使用,有什么方法可以模拟 func1(),但按照最初编写的方式运行 func2()?
c - 为什么 gcov 不涵盖逻辑 && 运算符?
我正在对其进行单元测试的代码是这样的:
我的单元测试用例包括以下内容:
其中 DoIP_LocalIpAddrAssignmentChg 是 if 所在的函数名称,0xFF 表示无效状态,显然不等于所有 3:TCPIP_IPADDR_STATE_ASSIGNED,TCPIP_IPADDR_STATE_ONHOLD,TCPIP_IPADDR_STATE_UNASSIGNED。SoConId的值为12。DOIP_INVALID_16 = 0xFF的值。
所以当我检查我的单元测试报告时,它给出了这个结果: 我的问题是为什么它没有覆盖TCPIP_IPADDR_STATE_UNASSIGNED 的条件,因为我传递的状态值是0xFF,这是无效值。
c - 在 Ceedling 中使用静态全局变量测试函数
如何在 Ceedling 中为使用静态全局变量的函数编写测试?我想测试变量的每个可能值以实现良好的测试覆盖率。
c - 编写一个宏,以便在测试时禁用静态
我在编写这个宏时遇到了麻烦。我正在使用ceedling。
我有一个文件“globals.h”,其中包含以下代码:
所以,这里应该发生的是,如果代码没有被统一测试,任何使用 STATIC 的方法都将是静态的,否则它将不是静态的。
我的测试文件包含“unity.h”,然后包含“globals.h”,然后包含“protocol.h”。
正在测试的文件“protocol.c”包括“globals.h”和“protocol.h”。
测试文件“test_protocol.c”包括“unity.h”,然后是“globals.h”,然后是“protocol.h”。
根据我的理解,应该首先定义 UNITY,然后它会去globals.h
,并将 STATIC 定义为空,因为 UNITY 已经在 UNITY.h 中定义了
但是,我看到的行为是,无论我做什么,我都无法globals.h
输入该#else
指令,因此似乎不可能STATIC
被定义为static
.
但是,我知道我想要完成的事情是可能的,因为很多人推荐并实施了这个策略。那么,我在做什么导致globals.h
认为 UNITY 未定义,何时定义?
c - 如何对从 ISR 调用的静态回调例程进行单元测试
我正在使用 ceedling 对 C 应用程序进行单元测试,并试图实现 ~100% 的高覆盖率。
我的一个应用程序模块中有一个静态回调函数,它使用函数指针注册到 SDK 函数,并在 SDK 的某个事件中调用。
在 appModule.c 中,
我想对这个函数进行单元测试,因为这个函数是静态的,所以不会在 ceedling test_appModule.c 中看到。我有一个解决这个定义的方法,TEST_STATIC
而不是static
,
但我不是这项工作的忠实拥护者,对上述问题有什么建议吗?
c - Ceedling未能模拟标题
我正在尝试模拟我正在测试的源文件中包含的标头。
标头以以下内容开头:
我试图像这样模拟它:
但是,在尝试运行 ceedling 测试时,我不断收到以下错误:
c - 将代码组织成模块化的、自包含的块
我正在寻求智者的帮助。:-) 这不是关于测试本身的技术帮助,而是更多的代码组织问题。我正在使用 libopencm3 HAL 和 ceedling 作为测试套件的 STM32 项目。
我将问题保持简短并仅引用一小部分来证明这一点,显然代码中还有其他此类模块。
深入研究这个问题,主函数调用了一个函数“Init”,该函数存在于它自己的模块“Init”中。Init 从 IO 模块调用几个函数——IOInit 和 IOBlink,它们初始化 GPIO 并以特定模式闪烁 GPIO。
IOInit和IOBlink的形式如下
其中 GPIO 和 PATTERN 分别是 STATUS_LEDS、POWERUP 之类的东西,可以是枚举或 #define,具体取决于我选择构建它们的方式。
所以第一个问题就在这里,在这里定义IOInit 和IOBlink 的参数有什么意义?如果我想要一些在这里冗长但稍后在较低级别的函数调用中得到解决的参数?我将如何定义论点?作为 uint8_t,枚举,#define?
所以他们可以看起来像
现在,IOInit 和 IOBlink 在位于 HAL 顶部的“DriverIO”模块中调用它们的较低级别的函数。DriverIO 具有相应的功能 - InitIO 和 GPIOToggle,它们可能看起来像这样
现在有一些明显的明显的事情我认为可以而且应该改进。
所有三个层,Init、IO 和 DriverIO 都需要一个公共包含,其中包含 STATUS_LED_PORT 和 STATUS_LED 的定义 - 这闻起来很糟糕。这个想法是让每一层更加模块化和自包含,如果我必须在所有三层中包含 BSP.h 或类似的东西,这将失败。
2a. DriverIO 无法模拟和测试 - 因为它位于 HAL 之上。- 解决这个问题的一种方法,从我在这里读到并且可以理解的是添加一个“垫片层”或一个“包装器”,它基本上位于 DriverIO 和 HAL 之间,我可以简单地将标题包含在“包装器”中DriverIO,模拟包装器并测试 DriverIO。
2b。垫片层还有另一个问题。低级 HAL 使用 typedef 枚举作为参数,垫片层和上述层将无法访问这些参数。那么 shim 层中的翻译函数会是什么样子?
例如 - libopenCM3 HAL 中的时钟启用功能如下所示
在垫片层中它会是什么样子?考虑到 DriverIO 不会知道枚举 rcc_periph_clken 的样子?
整体架构在设计时感觉还不错。但在实施过程中它真的崩溃了。原则上,main 只调用状态函数,每个状态函数只调用存在大量控制逻辑的中间层函数,中间层调用位于 HAL 上的驱动层函数。我为这篇冗长的帖子道歉,但我在设计和架构阶段花了很多时间来做这件事,我无法直截了当地思考。我患有一些分析麻痹。这可能是一个非常简单的解决方案,但我无法直接看到它。
再次,如果我没有多大意义,我深表歉意。我已经盯着这个看了好几天了,我认为它对其他人没有多大意义(如果有的话)。我试图让它可以理解,但这可能只是我缺乏梦话。请让我知道是否有特定部分我可以以更好的方式解释并说清楚。
真诚感谢任何帮助。
c - Ceedling 使用错误的启动文件
我正在用 Ceedling 对 STM32 代码进行单元测试。我的问题是 Ceedling 使用 crt0.S 作为启动文件,但我需要它来使用 .S 代替(否则它会一直失败)。可以在 project.yml 中的某处指定吗?
这是我的编译器设置:
这是错误消息:
还有我的 CMake 配置:
这些项目构建得很好......
c++ - 如何在 Linux PC 上运行 stm32 单元测试?
我正在尝试在我的 linux 机器上对一些 STM32 代码进行单元测试(使用 unity+ceedling),但是每次我访问任何寄存器时,代码都会失败并出现以下错误:
例如,此代码将导致 PASSED 1/1(请注意,我正在测试返回 a+b 且与 STM 外围设备无关的函数)。
但是这段代码会产生上面提到的错误。
是否有可能以这种方式进行测试,或者我是否必须使用 QEMU(以及如何在不使用 Eclipse 或任何其他 IDE 的情况下这样做)?请注意,Ceedling 使用 gcc,如果我使用 arm-none-eabi 它会生成 hex 文件,我无法在我的 PC 上运行它。
gcc - ceedling/cmock:模拟可变参数函数,或 va_list 参数
我试图模拟这段代码:
对于这两个函数,都会生成一些错误的代码。例如:
甚至,在va_list
参数的情况下,生成的代码也无法编译:
有没有办法解决这些问题?