当前位置: 首页 > article >正文

CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南

CMock函数模拟全解析从ExpectAndReturn到Callback的高级用法指南单元测试是软件开发中不可或缺的一环而C语言开发者常常面临一个难题如何有效地测试那些依赖外部系统或复杂模块的函数这正是CMock大显身手的地方。作为Ceedling框架的核心组件之一CMock提供了强大的函数模拟能力让开发者能够精确控制测试环境验证代码在各种边界条件下的行为。1. CMock基础从Expect到Ignore的模拟策略1.1 ExpectAndReturn精确控制函数行为ExpectAndReturn是CMock中最常用的模拟函数之一。它允许你预设一个函数的输入参数和返回值当被测代码调用这个函数时CMock会检查实际参数是否与预期匹配并返回预设的值。// 假设我们有一个获取温度的函数 int get_temperature(int sensor_id); // 在测试中模拟这个函数 get_temperature_ExpectAndReturn(1, 25); // 预期sensor_id1返回25℃这种模拟方式特别适合以下场景需要验证函数是否以特定参数被调用需要控制依赖函数的返回值以测试不同路径需要确保函数被调用了特定次数常见陷阱忘记为每次调用设置Expect会导致测试失败参数顺序错误会导致难以调试的测试失败浮点数比较可能需要特殊处理1.2 IgnoreAndReturn简化非关键依赖当某些函数的参数和调用细节对当前测试不重要时IgnoreAndReturn可以大幅简化测试代码// 模拟一个日志函数我们不关心它的参数 log_message_IgnoreAndReturn(0); // 总是返回0 // 之后如果不再需要忽略 log_message_StopIgnore();适用场景包括第三方库的包装函数非核心路径的日志记录暂时不需要详细测试的依赖提示虽然Ignore可以简化测试但过度使用会降低测试的精确度。建议仅在确实不关心函数行为时使用。2. 高级模拟技巧参数匹配与调用顺序2.1 灵活的参数匹配策略CMock提供了多种参数匹配方式满足不同测试需求匹配方式描述示例精确匹配参数必须完全等于预期值func_ExpectAndReturn(42, 0)忽略参数不检查特定参数func_IgnoreArg_param1()任意参数接受任何参数值func_ExpectAnyArgsAndReturn(0)数组参数验证数组内容func_ExpectWithArrayAndReturn(arr, 1, 0)2.2 严格的调用顺序验证CMock默认会验证模拟函数的调用顺序是否与预期一致。这在测试状态机或流程控制代码时特别有用// 设置严格的调用顺序 enable_sensor_ExpectAndReturn(1, 0); read_sensor_ExpectAndReturn(1, 25); disable_sensor_ExpectAndReturn(1, 0);如果需要关闭顺序检查不推荐可以在project.yaml中配置:cmock: :enforce_strict_ordering: FALSE3. Callback与Stub完全掌控函数行为3.1 使用Callback实现动态响应当简单的返回值预设不能满足需求时Callback提供了完全控制函数行为的能力// 定义回调函数 int calculate_discount_callback(int product_id, int quantity, int call_count) { // 根据调用次数动态计算折扣 return call_count 3 ? 10 : 5; // 前两次10%折扣之后5% } // 在测试中设置回调 calculate_discount_AddCallback(calculate_discount_callback);Callback特别适合以下场景需要基于输入参数动态计算返回值需要模拟复杂的状态变化需要验证函数被调用的次数3.2 Stub完全替换函数实现当需要完全自定义函数行为时可以使用Stub// 自定义stub实现 int db_query_stub(int query_type, const char* sql) { test_assert(query_type SELECT_QUERY); return mock_data[query_type]; } // 替换原始模拟 db_query_StubWithCallback(db_query_stub);与Callback不同Stub会跳过所有CMock的自动检查完全使用自定义实现不记录调用次数和参数4. 实战测试一个温度监控系统让我们通过一个完整的例子展示CMock的高级用法。假设我们有一个温度监控系统当温度超过阈值时会触发警报// 被测代码 void check_temperature_system() { int temp read_temperature(MAIN_SENSOR); if (temp CRITICAL_TEMP) { trigger_alarm(ALARM_HIGH_TEMP, temp); log_event(Critical temperature reached); } }对应的测试代码可能如下void test_should_trigger_alarm_when_temperature_too_high(void) { // 设置模拟 read_temperature_ExpectAndReturn(MAIN_SENSOR, CRITICAL_TEMP 1); trigger_alarm_Expect(ALARM_HIGH_TEMP, CRITICAL_TEMP 1); log_event_Ignore(); // 我们不关心日志内容 // 执行被测函数 check_temperature_system(); // 验证在TEST_ASSERT层面完成 }测试技巧为每个测试用例创建独立的上下文明确区分必须验证和可以忽略的依赖使用_Expect系列函数验证关键调用对非关键路径使用_Ignore简化测试5. CMock配置与最佳实践5.1 优化project.yaml配置合理的CMock配置可以提升测试效率和可维护性:cmock: :plugins: - :expect # 必须 - :ignore # 推荐 - :callback # 按需 - :array # 如果需要测试数组参数 :treat_as: uint8: unsigned char bool: _Bool5.2 常见问题解决模拟函数未生成删除build目录后重新运行测试检查头文件中的函数声明是否正确定义参数匹配失败确保_Expect调用次数与实际调用次数一致浮点数比较考虑使用近似匹配内存泄漏检测结合CException插件测试错误处理路径使用valgrind等工具辅助检测在实际项目中我发现最有价值的实践是为每个模块维护一组标准的测试辅助函数将常见的模拟模式封装起来。例如对于数据库访问层可以创建// 测试辅助函数 void expect_db_query_return_rows(int expected_rows) { db_query_ExpectAndReturn(SELECT_QUERY, NULL, expected_rows); }这样既提高了测试代码的可读性又减少了重复代码。当接口变更时只需修改辅助函数即可更新所有相关测试。

相关文章:

CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南

CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南 单元测试是软件开发中不可或缺的一环,而C语言开发者常常面临一个难题:如何有效地测试那些依赖外部系统或复杂模块的函数?这正是CMock大显身手的地方。作为Ceedlin…...

QWen 3.5plus总结的总结基准测试结果的正确方法

原文地址:https://dl.acm.org/doi/epdf/10.1145/5666.5673 如何用统计撒谎:总结基准测试结果的正确方法 作者:PHILIP J. FLEMING 和 JOHN J. WALLACE 在文献中,性能结果经常使用性能比率的算术平均值来总结,在某些情况…...

从软件到硬件:Taalas ASIC如何让AI成为“物理基础设施”

当AI推理速度突破15000 tokens/秒,我们谈论的不再是“更快的服务”,而是“消失的延迟”。过去两年,大模型领域的竞争焦点高度集中在算力堆叠和参数规模上。GPU成为稀缺资源,英伟达H200、B200的发布一次次刷新算力上限,…...

新手避坑指南:用Arduino Uno和CNC Shield V3驱动42步进电机(附完整代码与接线图)

新手避坑指南:用Arduino Uno和CNC Shield V3驱动42步进电机(附完整代码与接线图) 刚拿到Arduino Uno和CNC Shield V3时,你可能迫不及待想驱动42步进电机完成第一个项目。但现实往往是:电机纹丝不动、发出奇怪噪音&…...

探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变

探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变 【免费下载链接】Meshroom 3D Reconstruction Software 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 定位3D重建价值:打破技术壁垒的开源方案 在数字创作领域,3D模型一…...

标签噪声鲁棒训练:从理论到实践,构建深度学习模型的抗噪防线

1. 标签噪声:深度学习中的隐形杀手 第一次用MNIST数据集跑分类模型时,我发现哪怕故意把20%的标签打乱,模型在测试集上依然能达到85%以上的准确率。这个结果让我误以为深度神经网络对标签噪声天然具有免疫力——直到后来在医疗影像分类项目里…...

FPGA时序优化全攻略:Vivado 2019.2中的建立与保持时间问题解决

FPGA时序优化全攻略:Vivado 2019.2中的建立与保持时间问题解决 在高速FPGA设计中,时序问题往往是工程师面临的最大挑战之一。当设计频率提升到200MHz甚至更高时,建立时间和保持时间的违例会频繁出现,导致设计无法正常工作。本文将…...

JAVA集成CAS客户端总结

一、依赖<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-support-springboot</artifactId><version>3.6.4</version></dependency>二、yml配置cas:server-url-prefix: https://xxx.xxx:8443/cas…...

AI辅助创作:Krita智能选区工具效率提升指南

AI辅助创作&#xff1a;Krita智能选区工具效率提升指南 【免费下载链接】krita-vision-tools Krita plugin which adds selection tools to mask objects with a single click, or by drawing a bounding box. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-vision-too…...

AI选型与配置:让快马智能推荐npm包并生成个人博客系统前端代码

最近在尝试用AI辅助开发个人博客系统&#xff0c;发现整个过程比想象中顺畅很多。特别是依赖管理和技术选型这个环节&#xff0c;AI能帮我们省去大量查文档和试错的时间。下面记录下我的实践过程&#xff0c;或许对同样想快速搭建博客的朋友有帮助。 需求明确化阶段 首先需要…...

文墨共鸣大模型生成技术教程:以“计算机组成原理”为例的课件与习题制作

文墨共鸣大模型生成技术教程&#xff1a;以“计算机组成原理”为例的课件与习题制作 作为一名在技术领域摸爬滚打了十多年的从业者&#xff0c;我见过太多优秀的工具因为“用起来太麻烦”而被束之高阁。今天&#xff0c;我想和你分享一个让我眼前一亮的“AI助教”——文墨共鸣…...

职场生存暗规则 DAY5:同事抢你功劳?用这 1 招让他偷鸡不成蚀把米|乐想屋

“本文来自「乐想屋」公众号&#xff0c;系列更新[职场反PUA30天觉醒计][职场生存暗规则]&#xff0c;读完你未必能立即升职加薪&#xff0c;但一定能避开那些让99%的人莫名出局的深坑。职场这场游戏&#xff0c;活下去&#xff0c;才能赢下去。”——————————————…...

Ansys与Adams刚柔耦合仿真实战:从模态分析到MNF文件生成全流程解析

1. 为什么需要刚柔耦合仿真&#xff1f; 刚接触机械系统仿真的朋友可能会有疑问&#xff1a;为什么不能直接用刚性体模型做动力学分析&#xff1f;这个问题我刚开始做项目时也纠结过。简单来说&#xff0c;现实世界中没有绝对的刚性体&#xff0c;所有物体在受力时都会发生形变…...

Qwen-Image-Layered场景实战:用AI图层技术为你的产品图换背景

Qwen-Image-Layered场景实战&#xff1a;用AI图层技术为你的产品图换背景 1. 引言 1.1 电商设计的痛点 在电商运营中&#xff0c;产品主图的质量直接影响转化率。传统换背景流程需要设计师手动抠图、调整边缘、匹配光影&#xff0c;一个产品图往往需要30分钟以上的处理时间。…...

WebGIS驱动的智慧校园导航系统:架构设计与功能实现全解析

1. WebGIS如何让校园导航更智能&#xff1f; 第一次接触校园导航系统是在三年前&#xff0c;当时某高校的IT部门负责人向我吐槽&#xff1a;学生们总在开学季迷路&#xff0c;传统纸质地图根本不够用。这让我意识到&#xff0c;基于WebGIS的智慧导航系统不是锦上添花&#xff0…...

WorkshopDL:跨平台资源获取的开源工具解决方案

WorkshopDL&#xff1a;跨平台资源获取的开源工具解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在游戏模组生态中&#xff0c;跨平台资源访问与高效下载一直是技术爱…...

OpenFeign性能优化最全实战

Feign 就是动态代理 模板化 HTTP 请求&#xff0c;帮你把接口方法自动转成 HTTP 调用。 完整执行流程&#xff08;8 步&#xff09; 启动时&#xff1a;FeignClient 接口被 Feign 扫描&#xff0c;生成动态代理类 调用时&#xff1a;执行接口方法 → 进入代理类 解析注解&…...

MacBook上5分钟搞定Jmeter接口压测:从下载到脚本自动保存结果(附BeanShell代码)

MacBook高效接口压测指南&#xff1a;5分钟实现Jmeter自动化结果收集 每次遇到偶发性接口问题&#xff0c;手动点击上百次查看结果是不是让你抓狂&#xff1f;作为开发者&#xff0c;我们需要的不仅是工具&#xff0c;更是一套能自动完成脏活的解决方案。今天我们就来彻底解决…...

保姆级教程:用Halcon的cooc_feature_image算子搞定LCD屏幕缺陷检测(附完整代码)

工业级LCD屏幕缺陷检测实战&#xff1a;Halcon纹理特征分析与优化策略 在液晶显示屏&#xff08;LCD&#xff09;制造过程中&#xff0c;微米级的缺陷可能导致产品报废。传统人工检测不仅效率低下&#xff0c;且漏检率高达15%-30%。Halcon的cooc_feature_image算子通过灰度共生…...

AI转PSD终极指南:快速实现矢量图到Photoshop分层文件的完美转换

AI转PSD终极指南&#xff1a;快速实现矢量图到Photoshop分层文件的完美转换 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 还在为Illustrato…...

ComfyUI-VideoHelperSuite解决VHS_VideoCombine节点缺失的4阶段实战方案

ComfyUI-VideoHelperSuite解决VHS_VideoCombine节点缺失的4阶段实战方案 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在ComfyUI视频工作流中&#xff0c;VHS_V…...

工业Python网关性能断崖式下降?实测发现:asyncio在ARM Cortex-A9上协程切换开销超预期237%,3种轻量替代架构对比报告

第一章&#xff1a;工业Python网关性能断崖式下降的现场诊断逻辑工业Python网关在连续运行数周后突发响应延迟激增、消息吞吐骤降50%以上&#xff0c;此类“断崖式”性能劣化往往非单一因素导致&#xff0c;需构建分层递进的现场诊断逻辑&#xff1a;从资源表象切入&#xff0c…...

别急着扔!用Windows虚拟内存和这几招,让老电脑再战三年(附SSD选购建议)

让老旧电脑重获新生的5个关键策略与SSD选购指南 老旧电脑卡顿到让人抓狂&#xff1f;先别急着换新机。我的邻居张叔上周还抱怨他那台2015年的联想笔记本"慢得像蜗牛"&#xff0c;经过一番优化后&#xff0c;现在居然能流畅运行Photoshop处理照片。本文将分享一套系统…...

KV STUDIO Ver.12 梯形图编程实战:从入门到精通的5个关键步骤

1. 环境配置&#xff1a;从零搭建KV STUDIO开发环境 第一次打开KV STUDIO Ver.12时&#xff0c;很多新手会被复杂的界面吓到。其实只要按照正确步骤配置&#xff0c;半小时就能搭建好开发环境。我去年给产线做自动化改造时&#xff0c;需要在三台不同型号的KV PLC上部署程序&a…...

AI赋能开发:让快马智能分析并优化你的openclaw101风格网站代码与体验

今天想和大家分享一个很有意思的发现&#xff1a;用AI辅助开发工具来优化技术博客网站&#xff0c;效果真的超出预期。就拿我最近在InsCode(快马)平台上体验的openclaw101风格网站优化来说&#xff0c;整个过程既高效又有趣。 网站分析阶段 首先&#xff0c;我让平台的AI模型…...

从无人机航拍到手机扫描:聊聊SfM(运动恢复结构)在实际项目中的选型与避坑指南

从无人机航拍到手机扫描&#xff1a;SfM技术实战选型与避坑指南 当我们需要将一座千年古刹数字化存档&#xff0c;或是为电商平台上的家具产品创建3D展示模型时&#xff0c;运动恢复结构&#xff08;SfM&#xff09;技术往往成为首选方案。这项能够从普通照片中重建三维场景的技…...

Source Han Serif CN:终极开源中文字体深度技术指南

Source Han Serif CN&#xff1a;终极开源中文字体深度技术指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf Source Han Serif CN&#xff08;思源宋体&#xff09;是Google与Adobe…...

Qwen2.5-VL-7B-Instruct详细步骤:GPTQ量化模型加载与推理加速技巧

Qwen2.5-VL-7B-Instruct详细步骤&#xff1a;GPTQ量化模型加载与推理加速技巧 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款强大的多模态视觉-语言模型&#xff0c;能够同时处理图像和文本输入&#xff0c;生成高质量的响应。本指南将详细介绍如何通过GPTQ量化技术来优化模型加…...

5V低压开环FOC驱动器:低成本实现微型电机流畅控制

1. 5V低压开环FOC驱动器的核心价值 对于很多电子爱好者和小型项目开发者来说&#xff0c;控制微型电机常常会遇到两个难题&#xff1a;要么控制方案太贵&#xff0c;要么效果不够理想。我自己在开发桌面旋转展示台时就深有体会——市面上的驱动器要么价格高昂&#xff0c;要么体…...

NVIDIA GPU监控效能深度解析:nvitop如何破解多用户环境资源管理难题

NVIDIA GPU监控效能深度解析&#xff1a;nvitop如何破解多用户环境资源管理难题 【免费下载链接】nvitop An interactive NVIDIA-GPU process viewer and beyond, the one-stop solution for GPU process management. 项目地址: https://gitcode.com/gh_mirrors/nv/nvitop …...