课程简介
在该课程之中,我们将揭开这些问题的背后的原因。本课程不单单是单元测试基本概念的技能讲解,而是把技能和问题的场景结合,关注如何应用单元测试解决问题,尤其关注需要通过经验积累的高级技能。课程中的理论和经验来自于对大量开发人员常犯错误与所遇问题的归纳、分析与总结,有针对性的给出解决方法,课程将重现这些问题的经典案例,通过实例讲解,并对应到学员的实际工作问题,使学员能够把传授的经验和自己的问题结合起来,有效的启发思路、激发兴趣、并掌握解决问题的基本方法。
目标收益
培训对象
各类软件研发机构的软件研发管理者、架构师,软件设计师、程序员。对于怀有设计疑问和问题,需要梳理解答的团队和个人,效果最佳。
单元测试的初级人员:通过课程的学习可以了解测试的基本概念,测试框架的使用,基础的单元测试用例如何设计
单元测试中级人员:通过课程可以学习,对象依赖如何通过stub/mock等解除依赖,mock框架的学习,什么好的单元测坏死,如何提高单元测试的可读性, 可维护性,稳定可靠性
单元测试高级人员:通过课程可以学习到如何提高设计与代码的可测试性, 测试覆盖率的设计,复杂企业应用系统如何测试不同的层(UI/controller/Service/DB层),如何使用测试驱动开发
课程大纲
TDD测试驱动入门 |
内容一:TDD测试驱动开发核心概念 1.为何要使用TDD 2.理解TDD 3.红灯绿灯重构 4.速度是关键 5.TDD并非测试方法 6.测试-黑盒测试和白盒测试 7.质量检查和质量保证的差别 8.更好的测试 9. 一个简单的胜利,TDD的简化示例 10. TDD的光芒 11. TDD带给开发人员什么 12. TDD带给管理者什么 内容二:TDD测试驱动开发案例- 1.编写一个测试 2.运行所有测试并确认最后一个未通过 3.编写实现代码 4.运行所有测试 5.重构 6.重复 7.案例分析 |
TDD测试驱动开发最佳实践 |
内容一:TDD测试驱动开发 1.TDD的节奏 2.TDD的两个原则和TDD的目标 3.TDD与行为驱动开发(Behaviour Driven Development) 4.TDD与验收测试驱动开发(Acceptance Test Driven Development) 5.识别代码中的坏味道 6.重构工具及使用 7.常用重构技巧 8.重构与预先设计的区别 通过案例分析,TDD的最佳实践技巧,重构的技巧,坏味道等 |
TDD测试驱动开发最佳实践 -重构 |
内容一:重构 1.重构概述 2.何时重构 3.重构的误区 4.重构是持续进行的,不要先编写烂代码,再抽出重构 5.如何发现哪些地方需要重构 6.如何保证重构的正确 7.如何测试重构 1.通过一个小案例演示重构的基本思想(什么时间重构,如何发现重构点,如何保证重构的正确性,最后如何验收) 内容二:案例—通过实际项目演示重构 1.介绍项目需求情况,进行设计 2.阅读代码指出代码坏症状 3.通过重构逐步改善代码质量 1.通过该案例演示重构的过程,我们遇到的难处,如何解决? 内容三:重构关键—代码的坏味道 1.代码坏味道概述 2.代码坏味道的分类 3.识别代码坏味道,是重构的最重要一步 4.所谓重构,无非就是嗅到坏味道,然后,一小步一小步的改了它。问题是,很多人对坏味道的容忍度让他们嗅不到坏味道 1.案例分析—通过真实项目的代码,分析代码坏味道 |
单元测试基础 |
内容一:理解单元测试 1.什么是单元测试? 2.为什么要写单元测试,为什么不写单元测试 3.理解单元测试--第一个单元测试案例 4.好的测试是什么样子的,为什么要写"好"的单元测试 5.单元测试的维护成本 6.单元测试与自动化测试 7.分析真实项目,如何做单元测试 8.通过案例分析,了解基本的单元测试 内容二:敏捷测试 -实际开发中的测试区别和实践 1.敏捷测试 2.测试金字塔 3.单元测试 4.组件测试 5.集成测试 6.软件开发之中各种测试的区别 |
理解单元测试框架—XUnit工具 |
内容一:理解单元测试XUnit 框架使用—(以Junit为案例介绍,其他简单介绍) 1.Junit设计目标 2.探索JUnit核心 3.参数化测试 4.测试异常 5.超时测试 6.引入Hamcrest匹配器 7.JUnit的测试运行器 8.用Suite来组合测试 9.Junit与IDE,Ant,Maven集成运行 10.JUnit与持续集成工具结合 11.通过案例分析,Junit的最佳实践 内容二:Junit5新特性 1.Junit5架构 2.Junit5新特性 3.JUnit 5 架构演进 4.JUnit 5 新注解 5.JUnit 5新的断言 6.超时操作的测试:assertTimeoutPreemptively 7.异常测试:assertThrows 8.JUnit 5 参数化测试 9.JUnit 5 中的前置条件(assumptions) 10.JUnit 5 嵌套测试 11.JUnit 5 动态测试 12.JUnit 5 依赖注入 13.Junit5和Junit4 区别 从Junit4升级到Junit5 |
解析验收测试驱动开发 |
内容一:解析验收测试驱动开发 1.用户故事介绍 2.验收测试 3.理解过程 4.作为团队活动的ATDD 5.ATDD的好处 6.我们究竟要测试什么 |
单元测试设计 |
内容一:构思单元测试 1.单元测试模型的设计 2.单元测试用例设计 3.为系统运行起来而设计 4.为正向测试而设计用例 5.为逆向测试而设计用例 6.为满足特殊需求而设计用例 7.为代码覆盖而设计用例 8.通过案例分析单元测试编程前的测试用例的设计 内容二:单元测试设计与构建-基于路径的白盒测试 1.单元测试白盒设计 2.标识单元测试点 3.语句覆盖 4.判定覆盖 5.基本路径测试法 6.白盒测试综合策略 7.测试覆盖准则 8.通过大量案例分析,如何应用各种白盒测试设计技术,进行设计单元测试 内容三:单元测试设计与构建—基于测试数据的黑盒测试 1.单元测试黑盒设计 2.等价类设计法 3.边界值分析法 4.判定表(决策表)驱动化 5.状态转移测试设计 6.用例/场景测试 7.动态分析法 9.通过大量案例分析,如何应用各种黑盒测试设计技术,进行设计单元测试 内容四:单元测试设计最佳实践 1.单元测试的私有方法的测试 2.测试私有方法是错误的! 3.私有方法重构-将私有方法变成公共方法 4.私有方法重构-抽取方法,形成新类 5.测试私有方法的例外情况 6.基于交互的测试最佳实践 7.基于状态的测试最佳实践 8.基于状态的测试利用对象内部状态验证执行结果的正确性。 9.利用协作对象的完成状态测试 内容五:单元测试设计SPIFFy原则 1.单元测试粒度 2.单元测试依赖 3.单元测试原则-SPIFFy: 4.Small: 10 lines or less, ideally 5.Precise: Checks one behavior of one class 6.Isolated: Doesn't affect other tests 7.Fast: Takes milliseconds to run 8.Frequently Run: Every time you make a change |
单元测试坏味道 |
内容一:测试代码坏味道 1.模糊测试(也称为长测试、复杂测试、冗长测试) 2.条件测试逻辑(也称为缩排的测试码) 3.难以测试的代码 4.测试码复制 5.产品中的测试逻辑 6.通过案例分析测试代码的坏味道,症状,原因,重构等 内容二:测试行为的坏味道 1.断言滚轮 2.不稳定测试 3.脆弱性测试 4.手工干预测试(指必须手工设置测试环境,调整测试代码) 5.缓慢测试 6.通过案例分析以上每种行为坏味道,症状,原因,重构等 内容三:测试项目的坏味道 1.缺陷测试坏味道 2.开发人员没有写测试 3.高维护成本的单元测试 4.通过案例分析以上每种行为坏味道,症状,原因,重构等 |
测试覆盖 |
内容一:逻辑覆盖 1.实施逻辑覆盖的原因 2.语句覆盖 3.判定覆盖 4.条件覆盖 5.条件覆盖 6.条件判定组合覆盖 7.多条件覆盖 8.修正条件判定覆盖 9.结合案例分析,逻辑覆盖的度量 内容二:统计测试覆盖--(以Junit为案例分析) 1.使用clover为junit单元测试做覆盖率分析 2.使用Cobertura统计JUnit测试覆盖率 3.结合案例分析,通过测试覆盖率工具,分析覆盖率 |
单元测试模式 |
内容一:单元测试结果验证模式 1.状态验证模式-基于状态的测试 2.行为验证模式-交互测试 3.自定义断言—预约断言 4.Delta断言 5.哨兵断言 6.根据案例分析结果的验证模式 内容二:单元测试替身模式 1.Test Stub模式 2.Test Spy模式 3.Mock Object模式 4.Fake Object模式 |
单元测试之中如何解耦依赖 |
内容一:解除依赖关系 - Extract and Override 和 Stub方法 1.反测试设计-外部依赖 2.不确定性1-时间 3.不确定性2-随机性 4.不确定性3-外界第三方依赖 5.Extract and Override: The Universal Pliers 6. Isolate And Test Around 7.How Much Code To Extract? 8.Why You Should NOT Use Extract And Override 9.Why You SHOULD Use Extract And Override 10.利用Stub解除依赖关系 11.使用存根Stub破除依赖 12.依赖注入Stub的方式 13.多种Stub的案例 14.分析真实项目,如何使用Stub 内容二:通过Mock对象解除依赖 1.Mock模拟对象和Stub存根的区别 2.手工Mock测试 3.手工Mock模拟对象的简单示例 4.同时使用Mock模拟对象和Stub存根 5.每个测试方法仅有一个模拟对象 6.伪对象链:用存根生成模拟对象或其他存根 7.手工模拟对象和存根的问题 8.分析真实项目,如何使用Mock, 以及相关问题 内容三:Mock隔离框架 1.Mock与Stub的区别 2.为什么要使用隔离框架 3.动态生成伪对象 4.动态生成模拟值 5.现有的隔离框架 6.隔离框架的优缺点 7.隔离框架设计反模式 8.结合多个案例项目进行分析,什么时间使用Mock ,什么时间使用Stub, 如何权衡 内容三:Mock隔离框架(Mockito) 1.Mockito 介绍 2.Mockito实现原理与架构 3.Mockito资源 4.Mockito验证行为 5.Mockito模拟我们所期望的结果 6.参数匹配和自定义参数匹配 7.连续调用和验证确切的调用次数 8.验证执行顺序 9.使用方法预期回调接口生成期望值(Answer结构) 10.修改对未预设的调用返回默认期望 11.Mockito如何实现Mock |
增强设计与代码的可测试性 |
内容一:可测试性设计与可测试问题 1.什么是可测的设计 2.模块化设计与SOLID设计原则 3.实际开发之中的可测性的问题 4.无法实例化某个类 5.无法调用某个方法 6.无法观察到输出 7.无法替换某个协作者 8.无法覆盖某个方法 9.案例分析 内容二:可测试性设计最佳实践 1.可测的设计的指南 2.抽取接口,容许替换底层实现 3.在被测类中注入桩对象 4.避免复杂的私有方法 5.避免final方法 6.避免static方法 7.使用new时要当心 8.避免在构造函数中包含逻辑 9.避免单例 10.组合优于继承 11.封装外部库 12.避免服务查找 13.结合多个大型案例项目进行分析,如何通过重构代码,实现可测试性 |
编写好的单元测试 |
内容一:好的单元测试测试标准-A-TRIP 1.单元测试的自动化-Automatic 2.单元测试彻底的-Thorough 3.单元测试可重复-Repeatable 4.单元测试独立的-Independent 5.单元测试专业的-Professional 6.通过案例分析,分析好的单元测试标准 内容二:如何编写好的单元测试测试 1.单元测试中的坏味道 2.如何编写容易被看懂的模式 3.如何编写容易维护的模式 4.如何编写信得过的模式 5.重构单元测试,改进代码设计 6.结合多个案例项目进行分析,分析什么是好的单元测试 内容三:如何编写好的单元测试测试 1.优秀单元测试3条准则 2.优秀单元测试-可读性 3.优秀单元测试-可维护性 4.优秀单元测试-可信赖性 5.如何编写容易被看懂的模式 6.结合多个案例项目进行分析,分析什么是好的单元测试 |
历史遗留系统如何编写单元测试 |
内容一:遗留系统代码环境下如何编写单元测试 1.从哪里开始添加单元测试 2.确定抉择策略1-容易优先测类的优缺点 3.确定抉择策略2-困难优先测类的优缺点 4.遗留代码改动准则 5.重构前写集成测试 6.遗留代码整洁测试的常用工具 7.为第三方代码做学习测试 8.复杂遗留系统之中,如何增加单元测试以及遇到的问题 9.通过真实案例分析,在遗留系统的的难度和最佳实践 |
TDD测试驱动入门 内容一:TDD测试驱动开发核心概念 1.为何要使用TDD 2.理解TDD 3.红灯绿灯重构 4.速度是关键 5.TDD并非测试方法 6.测试-黑盒测试和白盒测试 7.质量检查和质量保证的差别 8.更好的测试 9. 一个简单的胜利,TDD的简化示例 10. TDD的光芒 11. TDD带给开发人员什么 12. TDD带给管理者什么 内容二:TDD测试驱动开发案例- 1.编写一个测试 2.运行所有测试并确认最后一个未通过 3.编写实现代码 4.运行所有测试 5.重构 6.重复 7.案例分析 |
TDD测试驱动开发最佳实践 内容一:TDD测试驱动开发 1.TDD的节奏 2.TDD的两个原则和TDD的目标 3.TDD与行为驱动开发(Behaviour Driven Development) 4.TDD与验收测试驱动开发(Acceptance Test Driven Development) 5.识别代码中的坏味道 6.重构工具及使用 7.常用重构技巧 8.重构与预先设计的区别 通过案例分析,TDD的最佳实践技巧,重构的技巧,坏味道等 |
TDD测试驱动开发最佳实践 -重构 内容一:重构 1.重构概述 2.何时重构 3.重构的误区 4.重构是持续进行的,不要先编写烂代码,再抽出重构 5.如何发现哪些地方需要重构 6.如何保证重构的正确 7.如何测试重构 1.通过一个小案例演示重构的基本思想(什么时间重构,如何发现重构点,如何保证重构的正确性,最后如何验收) 内容二:案例—通过实际项目演示重构 1.介绍项目需求情况,进行设计 2.阅读代码指出代码坏症状 3.通过重构逐步改善代码质量 1.通过该案例演示重构的过程,我们遇到的难处,如何解决? 内容三:重构关键—代码的坏味道 1.代码坏味道概述 2.代码坏味道的分类 3.识别代码坏味道,是重构的最重要一步 4.所谓重构,无非就是嗅到坏味道,然后,一小步一小步的改了它。问题是,很多人对坏味道的容忍度让他们嗅不到坏味道 1.案例分析—通过真实项目的代码,分析代码坏味道 |
单元测试基础 内容一:理解单元测试 1.什么是单元测试? 2.为什么要写单元测试,为什么不写单元测试 3.理解单元测试--第一个单元测试案例 4.好的测试是什么样子的,为什么要写"好"的单元测试 5.单元测试的维护成本 6.单元测试与自动化测试 7.分析真实项目,如何做单元测试 8.通过案例分析,了解基本的单元测试 内容二:敏捷测试 -实际开发中的测试区别和实践 1.敏捷测试 2.测试金字塔 3.单元测试 4.组件测试 5.集成测试 6.软件开发之中各种测试的区别 |
理解单元测试框架—XUnit工具 内容一:理解单元测试XUnit 框架使用—(以Junit为案例介绍,其他简单介绍) 1.Junit设计目标 2.探索JUnit核心 3.参数化测试 4.测试异常 5.超时测试 6.引入Hamcrest匹配器 7.JUnit的测试运行器 8.用Suite来组合测试 9.Junit与IDE,Ant,Maven集成运行 10.JUnit与持续集成工具结合 11.通过案例分析,Junit的最佳实践 内容二:Junit5新特性 1.Junit5架构 2.Junit5新特性 3.JUnit 5 架构演进 4.JUnit 5 新注解 5.JUnit 5新的断言 6.超时操作的测试:assertTimeoutPreemptively 7.异常测试:assertThrows 8.JUnit 5 参数化测试 9.JUnit 5 中的前置条件(assumptions) 10.JUnit 5 嵌套测试 11.JUnit 5 动态测试 12.JUnit 5 依赖注入 13.Junit5和Junit4 区别 从Junit4升级到Junit5 |
解析验收测试驱动开发 内容一:解析验收测试驱动开发 1.用户故事介绍 2.验收测试 3.理解过程 4.作为团队活动的ATDD 5.ATDD的好处 6.我们究竟要测试什么 |
单元测试设计 内容一:构思单元测试 1.单元测试模型的设计 2.单元测试用例设计 3.为系统运行起来而设计 4.为正向测试而设计用例 5.为逆向测试而设计用例 6.为满足特殊需求而设计用例 7.为代码覆盖而设计用例 8.通过案例分析单元测试编程前的测试用例的设计 内容二:单元测试设计与构建-基于路径的白盒测试 1.单元测试白盒设计 2.标识单元测试点 3.语句覆盖 4.判定覆盖 5.基本路径测试法 6.白盒测试综合策略 7.测试覆盖准则 8.通过大量案例分析,如何应用各种白盒测试设计技术,进行设计单元测试 内容三:单元测试设计与构建—基于测试数据的黑盒测试 1.单元测试黑盒设计 2.等价类设计法 3.边界值分析法 4.判定表(决策表)驱动化 5.状态转移测试设计 6.用例/场景测试 7.动态分析法 9.通过大量案例分析,如何应用各种黑盒测试设计技术,进行设计单元测试 内容四:单元测试设计最佳实践 1.单元测试的私有方法的测试 2.测试私有方法是错误的! 3.私有方法重构-将私有方法变成公共方法 4.私有方法重构-抽取方法,形成新类 5.测试私有方法的例外情况 6.基于交互的测试最佳实践 7.基于状态的测试最佳实践 8.基于状态的测试利用对象内部状态验证执行结果的正确性。 9.利用协作对象的完成状态测试 内容五:单元测试设计SPIFFy原则 1.单元测试粒度 2.单元测试依赖 3.单元测试原则-SPIFFy: 4.Small: 10 lines or less, ideally 5.Precise: Checks one behavior of one class 6.Isolated: Doesn't affect other tests 7.Fast: Takes milliseconds to run 8.Frequently Run: Every time you make a change |
单元测试坏味道 内容一:测试代码坏味道 1.模糊测试(也称为长测试、复杂测试、冗长测试) 2.条件测试逻辑(也称为缩排的测试码) 3.难以测试的代码 4.测试码复制 5.产品中的测试逻辑 6.通过案例分析测试代码的坏味道,症状,原因,重构等 内容二:测试行为的坏味道 1.断言滚轮 2.不稳定测试 3.脆弱性测试 4.手工干预测试(指必须手工设置测试环境,调整测试代码) 5.缓慢测试 6.通过案例分析以上每种行为坏味道,症状,原因,重构等 内容三:测试项目的坏味道 1.缺陷测试坏味道 2.开发人员没有写测试 3.高维护成本的单元测试 4.通过案例分析以上每种行为坏味道,症状,原因,重构等 |
测试覆盖 内容一:逻辑覆盖 1.实施逻辑覆盖的原因 2.语句覆盖 3.判定覆盖 4.条件覆盖 5.条件覆盖 6.条件判定组合覆盖 7.多条件覆盖 8.修正条件判定覆盖 9.结合案例分析,逻辑覆盖的度量 内容二:统计测试覆盖--(以Junit为案例分析) 1.使用clover为junit单元测试做覆盖率分析 2.使用Cobertura统计JUnit测试覆盖率 3.结合案例分析,通过测试覆盖率工具,分析覆盖率 |
单元测试模式 内容一:单元测试结果验证模式 1.状态验证模式-基于状态的测试 2.行为验证模式-交互测试 3.自定义断言—预约断言 4.Delta断言 5.哨兵断言 6.根据案例分析结果的验证模式 内容二:单元测试替身模式 1.Test Stub模式 2.Test Spy模式 3.Mock Object模式 4.Fake Object模式 |
单元测试之中如何解耦依赖 内容一:解除依赖关系 - Extract and Override 和 Stub方法 1.反测试设计-外部依赖 2.不确定性1-时间 3.不确定性2-随机性 4.不确定性3-外界第三方依赖 5.Extract and Override: The Universal Pliers 6. Isolate And Test Around 7.How Much Code To Extract? 8.Why You Should NOT Use Extract And Override 9.Why You SHOULD Use Extract And Override 10.利用Stub解除依赖关系 11.使用存根Stub破除依赖 12.依赖注入Stub的方式 13.多种Stub的案例 14.分析真实项目,如何使用Stub 内容二:通过Mock对象解除依赖 1.Mock模拟对象和Stub存根的区别 2.手工Mock测试 3.手工Mock模拟对象的简单示例 4.同时使用Mock模拟对象和Stub存根 5.每个测试方法仅有一个模拟对象 6.伪对象链:用存根生成模拟对象或其他存根 7.手工模拟对象和存根的问题 8.分析真实项目,如何使用Mock, 以及相关问题 内容三:Mock隔离框架 1.Mock与Stub的区别 2.为什么要使用隔离框架 3.动态生成伪对象 4.动态生成模拟值 5.现有的隔离框架 6.隔离框架的优缺点 7.隔离框架设计反模式 8.结合多个案例项目进行分析,什么时间使用Mock ,什么时间使用Stub, 如何权衡 内容三:Mock隔离框架(Mockito) 1.Mockito 介绍 2.Mockito实现原理与架构 3.Mockito资源 4.Mockito验证行为 5.Mockito模拟我们所期望的结果 6.参数匹配和自定义参数匹配 7.连续调用和验证确切的调用次数 8.验证执行顺序 9.使用方法预期回调接口生成期望值(Answer结构) 10.修改对未预设的调用返回默认期望 11.Mockito如何实现Mock |
增强设计与代码的可测试性 内容一:可测试性设计与可测试问题 1.什么是可测的设计 2.模块化设计与SOLID设计原则 3.实际开发之中的可测性的问题 4.无法实例化某个类 5.无法调用某个方法 6.无法观察到输出 7.无法替换某个协作者 8.无法覆盖某个方法 9.案例分析 内容二:可测试性设计最佳实践 1.可测的设计的指南 2.抽取接口,容许替换底层实现 3.在被测类中注入桩对象 4.避免复杂的私有方法 5.避免final方法 6.避免static方法 7.使用new时要当心 8.避免在构造函数中包含逻辑 9.避免单例 10.组合优于继承 11.封装外部库 12.避免服务查找 13.结合多个大型案例项目进行分析,如何通过重构代码,实现可测试性 |
编写好的单元测试 内容一:好的单元测试测试标准-A-TRIP 1.单元测试的自动化-Automatic 2.单元测试彻底的-Thorough 3.单元测试可重复-Repeatable 4.单元测试独立的-Independent 5.单元测试专业的-Professional 6.通过案例分析,分析好的单元测试标准 内容二:如何编写好的单元测试测试 1.单元测试中的坏味道 2.如何编写容易被看懂的模式 3.如何编写容易维护的模式 4.如何编写信得过的模式 5.重构单元测试,改进代码设计 6.结合多个案例项目进行分析,分析什么是好的单元测试 内容三:如何编写好的单元测试测试 1.优秀单元测试3条准则 2.优秀单元测试-可读性 3.优秀单元测试-可维护性 4.优秀单元测试-可信赖性 5.如何编写容易被看懂的模式 6.结合多个案例项目进行分析,分析什么是好的单元测试 |
历史遗留系统如何编写单元测试 内容一:遗留系统代码环境下如何编写单元测试 1.从哪里开始添加单元测试 2.确定抉择策略1-容易优先测类的优缺点 3.确定抉择策略2-困难优先测类的优缺点 4.遗留代码改动准则 5.重构前写集成测试 6.遗留代码整洁测试的常用工具 7.为第三方代码做学习测试 8.复杂遗留系统之中,如何增加单元测试以及遇到的问题 9.通过真实案例分析,在遗留系统的的难度和最佳实践 |