CMock IgnoreAndReturn特性行为疑问及单元测试失败排查
CMock IgnoreAndReturn特性行为逻辑与测试失败原因分析
我正在梳理CMock中IgnoreAndReturn特性的细节,被测函数为USBDriver_Exec,代码如下:
void USBDriver_Exec(void) { uint8_t Val; // 当tx fifo为空且缓冲区有tx数据时,移动数据 while (serial_writable(&USBDriver_serial) && (!Buffer_IsEmpty(&tx)) && (STATUS_OK == Buffer_Get(&tx, &Val))) { serial_putc(&USBDriver_serial, Val); } // 当rx fifo有数据且rx缓冲区未满时,移动数据 while (serial_readable(&USBDriver_serial) && !Buffer_IsFull(&rx)) { Val = serial_getc(&USBDriver_serial); Buffer_Put(&rx, Val); } }
编写的初始测试用例运行失败,错误信息为:
[TestUSBDriver.c] Test: test_USBDriver_Exec_should_ReadBytes_when_BytesInBufferedAndReadable. At line (143): "Function Buffer_Put. Called fewer times than expected."
将serial_readable_IgnoreAndReturn(TRUE)放入循环后测试通过。我无法理解该错误原因,官方文档也未给出明确指引,现咨询该特性的行为逻辑及问题根源。使用版本:Ceedling 0.30.0、Unity 2.5.1、CMock 2.5.2、CException 1.3.2
问题根源与特性逻辑解析
IgnoreAndReturn的默认行为:CMock中IgnoreAndReturn默认仅对单次函数调用生效。第一次调用被Mock的函数时,返回指定值;后续未设置预期的调用,CMock会返回类型默认值(布尔类型返回FALSE),同时触发未预期调用的校验逻辑。- 测试失败的核心原因:被测函数的第二个
while循环中,serial_readable会被多次调用:第一次调用返回TRUE进入循环,执行完一轮Buffer_Put后,会再次调用serial_readable判断是否继续循环。如果只调用一次serial_readable_IgnoreAndReturn(TRUE),第二次调用时无预期设置,CMock返回FALSE,循环提前终止,导致Buffer_Put实际调用次数远少于测试用例的预期值,因此触发报错。 - 修复生效的原理:将
serial_readable_IgnoreAndReturn(TRUE)放入循环,等同于为每一次serial_readable的调用都设置返回TRUE的预期,循环会持续执行直到Buffer_IsFull(&rx)为TRUE,此时Buffer_Put的调用次数完全符合测试用例的预期。
内容的提问来源于stack exchange,提问作者Iberico
相关产品推荐
相关产品推荐

