课程培训
单元测试实战培训

 课程介绍

在嵌入式开发中,复杂的硬件交互、严苛的实时性要求与漫长的硬件调试周期,使得代码质量的保障尤为困难。传统调试方法犹如"盲人摸象",难以系统性地预防逻辑缺陷。本课程除了专为使用C语言的嵌入式开发团队设计额外补充与保持知识时代性特色,旨在提供一套完整、可落地的单元测试实战方案,为工业化项目实践提供坚实基础

 

培训对象

各类软件研发机构的软件研发管理者、架构师,软件设计师、程序员。对于怀有设计疑问和问题,需要梳理解答的团队和个人,效果最佳。

 

学员基础

学员学习本课程应具备下列基础知识:

1) 了解Java/Python/C#/C++/C语言任一种,尤其是Python/C

2) 简单了解单元测试框架的任何一种

 

培训内容 

授课内容:直切入嵌入式测试的核心挑战:从测试方法论Quick review到明确嵌入式测试方法论与提高,如何为高度依赖硬件的代码编写有效测试。我们将系统讲解如何运用测试框架与Mock(模拟)技术,将通信外设等硬件依赖隔离开,从而在PC上对核心业务逻辑(如状态机、控制算法、协议解析)进行快速、反复的验证。您将不仅学习编写测试用例,更将掌握提高代码可测试性的关键设计技巧,以及如何将测试自动化集成到开发流程与CI/CD管道中,打造快速反馈的质量防线。

第一篇 测试方法论至嵌入式深度

内容一:软件测试基础

    1. 软件测试历史

1) 50-60年代:数学方法穷尽测试调试

2) 70年代:证明软件工作(正向测试)证明软件失败(负向测试)

3) 80年代-至今:现代测试方法发展

    2. 为什么软件测试重要以及测什么

1) 个人用户角度:工具从自写到可选上百万选择

2) 企业角度:质量影响计算结果(飞机、轮船、核电站、医疗设备等安全关键系统)

3) 软件无处不在:手机故障尚可承受,飞机事故不可挽回

    3. 基本软件测试术语

1) 测试与质量:质量保障、质量控制

2) 测试定义:规划、准备和评估软件产品及相关工作产品以确定其满足指定要求、证明其适合目的并检测缺陷的过程

    4. 软件开发生命周期模型与测试

1) 瀑布模型:测试在项目中期开始,最大化在项目末期,通常太晚

2) V模型:测试从一开始就开始,但主要集中于阶段过渡之间

    5. 软件测试生命周期

通用规划与需求分析验收标准建立测试策略建立测试用例创建测试用例执行缺陷报告测试结果分析测试结果报告

    6. 软件测试分类

1) 功能测试与非功能测试:测什么vs怎么测

2) 静态测试与动态测试

3) 手工测试与自动化测试

4) 白盒测试与黑盒测试

内容二:测试计划

    1. 测试计划及其任务和目标

1) 测试计划定义:描述要实现的测试目标及实现手段和进度安排的文件

2) 规划任务:工作量估算、资源分配、日程安排、风险缓解、职责分配、团队协调

    2. 测试计划章节

项目范围与主要目标、待测试需求、不待测试需求、测试策略与方案、文档、准则、指标、资源、风险评估等

    3. 测试计划示例

文件转换器项目测试计划示例

内容三:需求工程

    1. 什么是需求以及需求为什么重要

1) 需求定义:用户解决问题或实现目标所需的条件或能力

2) 产品文档、项目文档的重要性

    2. 需求收集方法

访谈、会议与头脑风暴、提问、观察、原型、建模、文档分析、焦点小组、自重写

    3. 良好需求属性

强制性、时效性、原子性、一致性、无歧义性、可验证性、完整性、可追溯性、可实现性、可修改性、重要性、稳定性、优先级

    4. 需求测试技术

同行评审、提问、编写检查单、可视化、建模与原型

    5. 需求示例

文件转换器项目需求规格说明示例

内容四:测试用例设计

    1. 检查单

1) 检查单定义:思想的集合,是进一步活动的草稿

2) 著名"三角形任务"检查单示例

    2. 基本测试技术

1) 等价类划分:将一组数据视为相同方式处理产生相同结果

2) 边界值分析:等价类的"边界"是测试的关键点

3) 用户名要求示例:长度3-20符号,允许数字、下划线、英文字母

    3. 测试用例

1) 测试用例定义:一组前置条件、输入、动作、预期结果和后置条件

2) 关键字段:ID、标题、前置条件、输入、预期结果、后置条件

    4. 良好测试用例属性

1) 独立性测试用例:不引用也不被其他测试用例引用

2) 链接测试用例:引用其他测试用例或在用例链中有固定位置

3) 独立测试用例是工业标准

    5. 测试套件

1) 测试套件定义:一组测试用例或测试程序,在特定测试周期中执行

2) 自由测试套件vs链接测试套件

    6. 检查单、测试用例、测试套件示例

文件转换器项目检查单、测试用例、测试套件示例

    7. 关注重要事项

1) 缺陷:工作产品中不符合要求或规格的缺陷

2) 预期结果:基于规格的产品可预测行为

3) 实际结果:测试时观察到行为

    8. 带四个问题的良好测试用例

1) 测试用例帮助发现缺陷,但不可能发现所有缺陷

2) 要在可用时间内发现尽可能多的重要缺陷

内容五:缺陷管理

    1. 缺陷与缺陷报告

1) 缺陷定义:工作产品中不符合要求或规格的缺陷

2) 预期结果、实际结果、缺陷之间的关系

    2. 缺陷报告字段

关键字段:ID、摘要、描述、重现步骤、预期结果、实际结果、可重现性、严重性、优先级、症状、工作绕过

    3. 典型缺陷报告错误

1) 信息不足以理解和重现缺陷

2) 发现未标记为"就绪测试"的功能中的缺陷

3) 字段包含错误信息

4) 使用俚语或强词

    4. 缺陷报告建议

专注、具体、彻底、精确、严谨

    5. 缺陷报告示例

文件转换器项目缺陷报告示例

内容六:测试结果报告

    1. 测试结果报告

1) 测试进度报告:定期 produced关于测试活动相对于基线的进展、风险和需要决策的 alternatives

2) 测试总结报告:相对于出口条件评估相应测试项目

3) 测试报告:总结测试活动和结果

    2. 测试结果报告章节

总体缺陷统计、测试团队、建议、附件/附录、时间表、新缺陷统计、新缺陷列表

    3. 测试结果报告示例

文件转换器项目测试结果报告示例

内容七:测试自动化

    1. 什么是测试自动化

1) 测试自动化定义:使用软件执行或支持测试活动

2) 测试自动化框架:提供测试自动化环境的工具

3) 测试 harness:执行测试所需的 stubs drivers 组成测试环境

    2. 测试自动化高效领域

回归测试、性能测试、多环境测试、大型系统冒烟测试、配置测试、无人机界面应用、组合技术、技术和低级操作、单元测试、长时间常规操作、一些集成测试用例、标准功能、基本安全测试

    3. 测试自动化技巧

详细描述测试用例以便自动化

    

内容八:测试阶段与模板参考

    1. 测试阶段

1) 单元测试阶段:代码走读、单元测试

2) 集成测试阶段:模块集成、进程集成、系统集成

3) 确认测试阶段:数据测试

4) 验收测试阶段:整体软件测试

5) 缺陷管理

    2. 测试模板参考

1) 代码走读报告模板:目的、定义、参考资料、人力资源、检查表、走读结果、缺陷统计

2) 源代码验证报告模板:人力资源、验证范围、验证结果、缺陷统计、改进建议

3) 数据测试报告模板:测试执行、测试统计、缺陷分布、测试结论

4) 软件集成测试报告模板:测试策略、模块集成、进程集成、测试结果、缺陷统计

5) 系统集成测试分析报告模板:测试项执行、缺陷分析、结果统计、能力评价、结论

6) 测试缺陷报告模板:缺陷列表ID、描述、版本号、严重级别、状态、测试阶段

7) 整体软件测试报告模板:测试总结、缺陷分析、结论、建议

内容践行嵌入式测试方法论

    1. 嵌入式软件测试概述

1) 嵌入式软件的特点与挑战:资源受限环境、与硬件紧密耦合、可靠性与安全性要求

2) 嵌入式测试 vs 通用软件测试:测试环境复杂性、测试覆盖要求、测试工具链差异

3) 嵌入式测试金字塔:单元测试(40%) → 集成测试(30%) → 硬件测试(20%) → 系统测试(10%)

    2. V模型与测试类型

1) V模型:需求分析系统设计详细设计编码 对应 单元测试集成测试系统测试验收测试

2) 测试类型分类:静态测试/动态测试、按阶段分类、按策略分类

3) TDD在嵌入式中的应用:Red-Green-Refactor循环、硬件依赖对策

    3. 静态测试技术

1) 代码审查:Fagan Inspection / Walkthrough / Peer Review

2) 嵌入式审查要点:资源管理、并发安全、可移植性、MISRA合规

3) 静态代码分析工具:PolyspaceKlocworkCoverityCppcheckClang

    4. MISRA C编码规范

1) 标准演进:MISRA C:1998 → 2004 → 2012 → 2023

2) 规则分类:强制 / 必要 / 建议

3) 关键规则示例

    5. 动态测试技术

1) 代码覆盖率分析:语句覆盖分支覆盖条件覆盖→MC/DC→路径覆盖

2) 动态分析技术:内存分析(泄漏检测、缓冲区溢出)、性能分析(WCET、中断延迟)

3) 故障注入测试:硬件故障注入、软件故障注入、接口故障注入

    6. 单元测试框架Ceedling

1) Unity测试框架:纯C、极小资源占用、丰富断言宏

2) CMock自动Mock生成:解析头文件生成Mock代码

3) Ceedling构建系统:Rake + Unity + CMock + 插件

    7. 集成测试策略

1) 集成策略对比:大爆炸集成 vs 增量集成(自顶向下/自底向上/三明治)

2) 嵌入式系统集成测试:硬件-软件集成、中间件集成、测试环境

3) 测试环境:QEMU/SkyEye仿真、评估板、JTAG边界扫描

内容十:测试自动化与最佳实践

    1. 持续集成/持续测试(CI/CT

1) 流程:代码提交静态分析单元测试模拟器测试目标板部署

2) 工具链:CMake/Yocto + Unity/Ceedling + GCOV + Jenkins

3) 质量门禁:覆盖率阈值、缺陷数限制、通过率要求

    2. 自动化测试工具链

1) 开源工具链:Make/CMake + Unity/CMock + Cppcheck/GCOV + Jenkins

2) 商业工具链:VectorCAST + Cantata + Polyspace + dSPACE

3) 测试数据管理:用例管理、结果管理、缺陷追踪集成

    3. 嵌入式测试最佳实践

1) 策略层:左移测试、分层测试、自动化优先

2) 技术层:硬件抽象(HAL)、Mock策略、覆盖率驱动

3) 协作层:测试即代码、持续改进、度量驱动

    4. 案例:工业控制器HIL测试

1) 背景:工控/楼宇门禁控制器开发,核心功能为通过继电器控制电动门开关

2) 方案:构建HIL(硬件在环)测试台架

3) 收益:危险工况100%覆盖,认证周期缩短40%

4) 优势:安全(零风险虚拟环境)、高效与完备(自动化100%覆盖)、加速开发(测试左移)

    5. 测试提高与职业素养

1) 测试工程师职业素养:技术广度、沟通能力、质量意识

2) 测试团队建设:测试流程、度量体系、持续改进

3) 测试前沿技术:AI辅助测试、智能化测试、云端测试

 

第二篇 嵌入式测试技术聚焦

内容一:单元测试基础

    1. 单元测试核心理念与嵌入式价值

1) 破冰讨论:当前测试痛点(如Bug难复现、改代码心慌)

2) 核心理念:单元测试的定义、范围(测逻辑,不测硬件)、FIRST原则

3) 嵌入式价值:为何在资源受限的单片机中仍需单元测试(预防寄存器误配置、状态机逻辑错误、降低硬件依赖的调试成本)

4) 测试策略:测试金字塔在嵌入式领域的应用——单元测试是基础

    2. 深入理解单元测试

1) 什么是单元测试?

2) 为什么要写单元测试,为什么不写单元测试

3) 理解单元测试--第一个单元测试案例

4) 好的测试是什么样子的,为什么要写""的单元测试

5)  单元测试的维护成本

6) 单元测试与自动化测试

7) 分析真实项目,如何做单元测试

8) 通过案例分析,了解基本的单元测试

内容二:熟悉单元测试框架

    1. 工具链集成与第一个测试用例

1) 手把手环境搭建:在学员电脑上,基于团队现有IDE/编译器,集成Unity+CMock框架

2) "Hello Test":为一个纯逻辑函数(如int sum(int a, int b))编写第一个测试,学习TEST_ASSERT_*系列断言

3) 测试夹具(Setup/TearDown):讲解并练习如何为测试组初始化和清理数据

4) 实操挑战:针对一个简单的业务函数(如校验数据包的CRC)编写完整测试集

5) 每位学员成功在本地执行第一个单元测试

6) 掌握测试用例的基本结构和断言用法

内容三:单元测试设计

    1. 构思单元测试

1) 单元测试模型的设计

2) 单元测试用例设计

3) 为系统运行起来而设计

4) 为正向测试而设计用例

5) 为逆向测试而设计用例

6) 为满足特殊需求而设计用例

7) 为代码覆盖而设计用例

8) 通过案例分析单元测试编程前的测试用例的设计

    2. 单元测试设计与构建-基于路径的白盒测试

1) 单元测试白盒设计

2) 标识单元测试点

3) 语句覆盖

4) 判定覆盖

5) 基本路径测试法

6) 白盒测试综合策略

7) 测试覆盖准则

8) 通过大量案例分析,如何应用各种白盒测试设计技术,进行设计单元测试

    3. 单元测试设计与构建基于测试数据的黑盒测试

1) 单元测试黑盒设计

2) 等价类设计法

3) 边界值分析法

4) 判定表(决策表)驱动化

5) 状态转移测试设计

6) 用例/场景测试

7) 动态分析法

8) 通过大量案例分析,如何应用各种黑盒测试设计技术,进行设计单元测试

    4. 单元测试设计SPIFFy原则

1) 单元测试粒度

2) 单元测试依赖

3) 单元测试原则-SPIFFy:

4) Small: 10 lines or less, ideally

5) Precise: Checks one behavior of one class

6) Isolated: Does not affect other tests

7) Fast: Takes milliseconds to run

8) Frequently Run: Every time you make a change

内容四:单元测试坏味道

    1. 测试代码坏味道

1) 模糊测试(也称为长测试、复杂测试、冗长测试)

2) 条件测试逻辑(也称为缩排的测试码)

3) 难以测试的代码

4) 测试码复制

5) 产品中的测试逻辑

6) 通过案例分析测试代码的坏味道,症状,原因,重构等

    2. 测试行为的坏味道

1) 断言滚轮

2) 不稳定测试

3) 脆弱性测试

4) 手工干预测试(指必须手工设置测试环境,调整测试代码)

5) 缓慢测试

6) 通过案例分析以上每种行为坏味道,症状,原因,重构等

    3. 测试项目的坏味道

1) 缺陷测试坏味道

2) 开发人员没有写测试

3) 高维护成本的单元测试

4) 通过案例分析以上每种行为坏味道,症状,原因,重构等

内容五:测试覆盖

    1. 逻辑覆盖

1) 实施逻辑覆盖的原因

2) 语句覆盖

3) 判定覆盖

4) 条件覆盖

5) 条件覆盖

6) 条件判定组合覆盖

7) 多条件覆盖

8) 修正条件判定覆盖

9) 结合案例分析,逻辑覆盖的度量

    2. 统计测试覆盖--

1) 单元测试做覆盖率分析

2) 结合案例分析,通过测试覆盖率工具,分析覆盖率

内容六:Mock技术与Stub依赖解耦实战

    1. Mock技术与依赖解耦实战

1) 识别依赖:分析一段真实硬件驱动代码(如读取ADC、控制GPIO),识别出对硬件寄存器的依赖

2) 引入Mock:使用CMock自动生成该硬件接口的Mock函数,在测试中模拟硬件返回值(如模拟ADC读取固定电压值)

3) 验证交互:学习验证被测函数是否以正确的参数、顺序调用了硬件接口(如验证I2C发送的数据帧格式正确)

4) 设计重构:讲解"依赖接口而非实现"的思想,演示如何将硬编码的寄存器访问重构为可注入的接口,从而提高可测试性

    2. 复杂场景与边界测试

1) 测试状态机:为一个UART通信协议的状态机编写测试,模拟各种字节接收序列

2) 测试中断与异步逻辑:策略性讲解如何通过将中断处理函数拆分为"状态记录""逻辑处理"来测试后者

3) 边界与异常:针对数据溢出、缓冲区满/空、错误码返回等场景设计健壮的测试用例

4) 实操:分组为一个带定时器和队列的模块设计测试方案

内容七:单元测试之中如何解耦依赖

    1. 解除依赖关系 - Stub方法

1) 反测试设计-外部依赖

2) 不确定性1-时间

3) 不确定性2-随机性

4) 不确定性3-外界第三方依赖

5) 利用Stub解除依赖关系

6) 使用存根Stub破除依赖

7) 依赖注入Stub的方式

8) 多种Stub的案例

9) 分析真实项目,如何使用Stub

    2. 通过Mock对象解除依赖

1) Mock模拟对象和Stub存根的区别

2) 手工Mock测试

3) 手工Mock模拟对象的简单示例

4) 同时使用Mock模拟对象和Stub存根

5) 每个测试方法仅有一个模拟对象

6) 伪对象链:用存根生成模拟对象或其他存根

7) 手工模拟对象和存根的问题

8) 分析真实项目,如何使用Mock, 以及相关问题

内容八:增强设计与代码的可测试性

    1. 可测试性设计与可测试问题

1) 什么是可测的设计

2) 模块化设计与SOLID设计原则

3) 实际开发之中的可测性的问题

4) 无法实例化某个类

5) 无法调用某个方法

6) 无法观察到输出

7) 无法替换某个协作者

8) 无法覆盖某个方法

9) 案例分析

内容九:持续集成和交付

    1. 测试集成、覆盖率与持续集成

1) 自动化测试脚本:编写MakefilePython脚本,实现一键运行所有单元测试并生成报告

2) 覆盖率分析:使用gcov/lcov工具生成代码覆盖率报告,解读报告含义(行覆盖、分支覆盖),并基于报告补充遗漏的测试用例

3) CI/CD初步:演示如何将上述流程接入Jenkins/GitLab CI,实现代码提交后自动测试

4) 资源考量:讨论在单片机内存受限时,测试代码的组织和运行策略(如在PC上运行大部分逻辑测试)

内容十:编写好的单元测试

    1. 好的单元测试测试标准-A-TRIP

1) 单元测试的自动化-Automatic

2) 单元测试彻底的-Thorough

3) 单元测试可重复-Repeatable

4) 单元测试独立的-Independent

5) 单元测试专业的-Professional

6) 通过案例分析,分析好的单元测试标准

    2. 如何编写好的单元测试测试

1) 优秀单元测试3条准则

2) 优秀单元测试-可读性

3) 优秀单元测试-可维护性

4) 优秀单元测试-可信赖性

5) 如何编写容易被看懂的模式

6) 结合多个案例项目进行分析,分析什么是好的单元测试

内容十一:综合实战与团队规范研讨

    1. 综合实战与团队规范研讨

1) 分组实战:各小组选取一段团队的真实代码(或提供的复杂案例),共同完成从分析、设计Mock到编写完整测试套件的全流程

2) 代码评审:各组展示测试代码,讲师引导讨论优缺点

3) 讨论团队规范:基于实战经验,共同研讨《团队单元测试编写指南》(需包含:目录结构、命名约定、Mock使用规范、覆盖率要求门槛等)

 

 




如果您想学习本课程,请预约报名
如果没找到合适的课程或有特殊培训需求,请订制培训
除培训外,同时提供相关技术咨询与技术支持服务,有需求请发需求表到邮箱soft@info-soft.cn,或致电4007991916
技术服务需求表下载请点击

服务优势:
丰富专家资源,精准匹配相关行业,相关项目技术精英,面向用户实际需求,针对性培训或咨询,互动式交流,案例教学,精品小班,实际工程项目经验分享,快捷高效,节省时间与金钱,少走弯路与错路。

专家力量:
中国科学院相关研究所高级研究人员
西门子,TI,vmware,MSC,Ansys,MDI,Mentor, candence,Altium,Atmel 、Freescale,达索,华为等
大型公司高级工程师,项目经理,技术支持专家
中科信软培训中心,资深专家或讲师
大多名牌大学,硕士以上学历,相关学历背景专业,理论素养高
多年实际项目实践,大型复杂项目实战案例分享,热情,乐于技术分享
针对客户实际需要,真实案例演示,互动式沟通,学有所值
报名表下载
联系我们 更多>>

咨询电话010-62883247

                4007991916

咨询邮箱:soft@info-soft.cn  

 

  微信咨询

随时听讲课

聚焦技术实践

订制培训 更多>>