单元测试实战训练营课程
课程天数:2天
课程介绍
本课程不单单是单元测试基本概念的技能讲解,而是把技能和问题的场景结合,关注如何应用单元测试解决问题,尤其关注需要通过经验积累的高级技能。课程中的理论和经验来自于对大量开发人员常犯错误与所遇问题的归纳、分析与总结,有针对性的给出解决方法,课程将重现这些问题的经典案例,通过实例讲解,并对应到学员的实际工作问题,使学员能够把传授的经验和自己的问题结合起来,有效的启发思路、激发兴趣、并掌握解决问题的基本方法。
课程收益
单元测试的初级人员:通过课程的学习可以了解测试的基本概念,测试框架的使用,基础的单元测试用例如何设计。
单元测试中级人员:通过课程可以学习,对象依赖如何通过stub/mock等解除依赖,mock框架的学习,什么好的单元测坏死,如何提高单元测试的可读性, 可维护性,稳定可靠性。
单元测试高级人员:通过课程可以学习到如何提高设计与代码的可测试性, 测试覆盖率的设计,复杂企业应用系统如何测试不同的层(UI/controller/Service/DB层),如何使用测试驱动开发(TDD)?
软件研发的管理者:如何在组织里引入单元测试? 如何评价和考核开发人员的单元测试质量? 如何设计合适的测试覆盖率?复杂遗留系统如何引入单元测试? 单元测试与持续集成如何结合? 验收测试如何和单元测试结合?
培训对象
各类软件研发中心的软件设计师、架构师, 项目经理,技术总监,质量部门经理,开发人员,对单元测试怀有疑问和困惑,需要梳理解答的团队和个人,效果最佳。
课程大纲
第一单元:测试基础
内容一:理解单元测试
• 什么是单元测试?
• 为什么要写单元测试,为什么不写单元测试
• 理解单元测试--第一个单元测试案例
• 好的测试是什么样子的,为什么要写"好"的单元测试
• 单元测试的维护成本
• 单元测试与自动化测试
• 分析真实项目,如何做单元测试
• 通过案例分析,了解基本的单元测试
第二单元:理解单元测试框架—XUnit工具
内容一:理解单元测试XUnit 框架使用—(以Junit为案例介绍,其他简单介绍)
• Junit设计目标
• 探索JUnit核心
• 参数化测试
• 测试异常
• 超时测试
• 引入Hamcrest匹配器
• JUnit的测试运行器
• 用Suite来组合测试
• Junit与IDE,Ant,Maven集成运行
• JUnit与持续集成工具结合
• 通过案例分析,Junit的最佳实践
第三单元:单元测试设计
内容一:构思单元测试
• 单元测试模型的设计
• 单元测试用例设计
• 为系统运行起来而设计
• 为正向测试而设计用例
• 为逆向测试而设计用例
• 为满足特殊需求而设计用例
• 为代码覆盖而设计用例
• 通过案例分析单元测试编程前的测试用例的设计
内容二:单元测试设计—黑盒测试
• 单元测试黑盒设计
• 等价类设计法
• 边界值分析法
• 判定表(决策表)驱动化
• 状态转移测试设计
• 结对测试
• 分类树设计方法
• 用例/场景测试
• 动态分析法
• 通过大量案例分析,如何应用各种黑盒测试设计技术,进行设计单元测试
内容三:单元测试设计—白盒测试
• 单元测试白盒设计
• 标识单元测试点
• 语句覆盖
• 判定覆盖
• 基本路径测试法
• 白盒测试综合策略
• 测试覆盖准则
• 通过大量案例分析,如何应用各种白盒测试设计技术,进行设计单元测试
第四单元:测试坏味道
内容一:测试代码坏味道
• 模糊测试(也称为长测试、复杂测试、冗长测试)
• 条件测试逻辑(也称为缩排的测试码)
• 难以测试的代码
• 测试码复制
• 产品中的测试逻辑
• 通过案例分析测试代码的坏味道,症状,原因,重构等
内容二:测试行为的坏味道
• 断言滚轮
• 不稳定测试
• 脆弱性测试
• 手工干预测试(指必须手工设置测试环境,调整测试代码)
• 缓慢测试
• 通过案例分析以上每种行为坏味道,症状,原因,重构等
内容三:测试项目的坏味道
• 缺陷测试坏味道
• 开发人员没有写测试
• 高维护成本的单元测试
• 通过案例分析以上每种行为坏味道,症状,原因,重构等
第五单元:测试覆盖
内容一:逻辑覆盖
• 实施逻辑覆盖的原因
• 语句覆盖
• 判定覆盖
• 条件覆盖
• 条件覆盖
• 条件判定组合覆盖
• 多条件覆盖
• 修正条件判定覆盖
• 结合案例分析,逻辑覆盖的度量
内容二:统计测试覆盖--(以Junit为案例分析)
• 使用clover为junit单元测试做覆盖率分析
• 使用Cobertura统计JUnit测试覆盖率
• 结合案例分析,通过测试覆盖率工具,分析覆盖率
第六单元:测试之中如何解耦依赖
内容一:利用Stub解除依赖关系
• 利用Stub解除依赖关系
• Stub的案例
• Extract and Override: The Universal Pliers
• Isolate And Test Around
• How Much Code To Extract?
• Why You Should NOT Use Extract And Override
• Why You SHOULD Use Extract And Override
• 分析真实项目,如何使用Stub
内容二:通过Mock对象交互测试
• 基于状态的测试与交互测试
• 使用Mock的例子
• 手工Mock测试
• 自动化Mock测试
• 分析真实项目,如何使用Mock, 以及相关问题
内容三:Mock与Stub区别
• Mock与Stub的区别
• 同时使用Mock和Stub
• 每个测试只使用一个Mock
• 改进代码设计,利于应用Mock和Stub
• Mock和Stub的局限性
• 结合多个案例项目进行分析,什么时间使用Mock ,什么时间使用Stub, 如何权衡
第七单元:J2EE企业级系统的单元测试
内容一:企业级系统的单元测试最佳实践
• 企业应用系统特点
• 企业应用典型场景
• 系统分层架构与分层的单元测试
• 一个案例的分析
• 单元测试特点
• UI层单元测试测试
• Ctroller层单元测试
• Service层单元测试
• 数据库层单元测试
• 容器内的测试
• 通过企业应用案例项目进行分析单元测试的构建最佳实践
第八单元:编写好的单元测试
内容一:好的单元测试测试标准-A-TRIP
• 单元测试的自动化-Automatic
• 单元测试彻底的-Thorough
• 单元测试可重复-Repeatable
• 单元测试独立的-Independent
• 单元测试专业的-Professional
• 通过案例分析,分析好的单元测试标准
内容二:如何编写好的单元测试测试
• 单元测试中的坏味道
• 如何编写容易被看懂的模式
• 如何编写容易维护的模式
• 如何编写信得过的模式
• 重构单元测试,改进代码设计
• 结合多个案例项目进行分析,分析什么是好的单元测试
第九单元:历史遗留系统如何编写单元测试
内容一:遗留系统代码环境下如何编写单元测试
• 从哪里开始添加单元测试
• 确定抉择策略1-容易优先测类的优缺点
• 确定抉择策略2-困难优先测类的优缺点
• 遗留代码改动准则
• 重构前写集成测试
• 遗留代码整洁测试的常用工具
• 为第三方代码做学习测试
• 复杂遗留系统之中,如何增加单元测试以及遇到的问题
• 通过真实案例分析,在遗留系统的的难度和最佳实践
第十单元:单元测试组织和管理
内容一:组织和管理测试
• 通过自动构建脚本运行测试
• 将测试与代码做同源版本管理
• 根据速度和类型为测试分类
• 创建和维护项目的测试辅助设施
• 结合我们研发中心, 如何做单元测试管理, 已经如何组织,以及遇到的问题
第十一单元:在研发团队如何引入单元测试
内容一:将测试引入到你的组织中
• 如何成功在组织中引入单元测试
• 为什么在组织中引入单元测试的努力会失败
• 如何将测试集成到开发流程中 - 敏捷测试流程
• 常见的疑惑和解答?
• 通过多个研发中心咨询经验,分析单元测试引入的方式和最佳实践