单元测试和TDD实战训练营

单元测试和TDD实战训练营
    马上咨询


    刘捷  曾任BEA中國(guó)专业服務(wù)部 高级架构师顾问

    现任职Oracle架构咨询顾问,帮企业诊断架构性能(néng)问题,曾任职BEA(中國(guó))资深软件架构师,十余年的企业软件架构、开发和管理(lǐ)经验, 侧重于企业应用(yòng)软件架构设计.主要负责客户大型项目的架构设计和研发。
     作為(wèi)技术专家保证项目的成功实施,运行和维护。参加过全國(guó)/全省多(duō)个大型的计算机应用(yòng)项目,擅長(cháng)的领域包括電(diàn)信,金融、税務(wù),大型互联网web2.0应用(yòng)等。此前就职于IBM,任软件架构师。 在此之前曾任日本东京一家软件企业的资深技术顾问。

    技术能(néng)力:

    DB,UNIX,J2EE,SOA,WebLogic Server, WebLogic Integration, WebLogic Portal相关的架构设计。

    课程背景

    你是否有(yǒu)过这样的感觉:

    • 当你在浩如烟海的网页中企图搜索单元测试的文(wén)章时,发现满眼看到的却只是一些测试模板或空洞的测试理(lǐ)论
    • 当你期望能(néng)在大师的指点下找到单元测试的门道,然而看完他(tā)们的文(wén)章,你感到似乎懂了却又(yòu)感觉什么都没有(yǒu)學(xué)到
    • 当你希望能(néng)将单元测试技巧融入实战时,却发现周围的例子都还停留Calculator的原始时代
    • 当你希望在快速迭代的研发潮流之中找到单元测试如何引入到组织时,看到只是一些陈词滥调和老生常谈,而看不到实际的成功案例

    今天,大多(duō)数人都已经承认单元测试是开发者的职责,而不是QA职责. 比如Google就将单元测试推到上游的、以及内建质量的意识,优秀的自动化测试实践成為(wèi)我们的榜样。然而现在我们天天讨论单元测试,试图将单元测试引入组织流程时.却会面临一系列的问题? 单元测试价值究竟何在? 什么是好的单元测试? 如何设计单元测试用(yòng)例? 单元测试覆盖率到底应该多(duō)少? 这么多(duō)的依赖怎么才能(néng)编写单元测试? 怎样提高设计与代码的可(kě)测试性? 历史遗留系统代码还有(yǒu)必需去写单元测试吗?单元测试真是我们的银弹吗? 怎样才能(néng)坚持编写单元测试?

    在该课程之中,我们将揭开这些问题的背后的原因。本课程不单单是单元测试基本概念的技能(néng)讲解,而是把技能(néng)和问题的场景结合,关注如何应用(yòng)单元测试解决问题,尤其关注需要通过经验积累的高级技能(néng)。课程中的理(lǐ)论和经验来自于对大量开发人员常犯错误与所遇问题的归纳、分(fēn)析与总结,有(yǒu)针对性的给出解决方法,课程将重现这些问题的经典案例,通过实例讲解,并对应到學(xué)员的实际工作问题,使學(xué)员能(néng)够把传授的经验和自己的问题结合起来,有(yǒu)效的启发思路、激发兴趣、并掌握解决问题的基本方法。

    培训对象

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

    • 单元测试的初级人员:通过课程的學(xué)习可(kě)以了解测试的基本概念,测试框架的使用(yòng),基础的单元测试用(yòng)例如何设计
    • 单元测试中级人员:通过课程可(kě)以學(xué)习,对象依赖如何通过stub/mock等解除依赖,mock框架的學(xué)习,什么好的单元测坏死,如何提高单元测试的可(kě)读性, 可(kě)维护性,稳定可(kě)靠性
    • 单元测试高级人员:通过课程可(kě)以學(xué)习到如何提高设计与代码的可(kě)测试性, 测试覆盖率的设计,复杂企业应用(yòng)系统如何测试不同的层(UI/controller/Service/DB层),如何使用(yòng)测试驱动开发(TDD)?
    • 软件研发的管理(lǐ)者:如何在组织里引入单元测试? 如何评价和考核开发人员的单元测试质量? 如何设计合适的测试覆盖率?复杂遗留系统如何引入单元测试? 单元测试与持续集成如何结合? 验收测试如何和单元测试结合? 

    备注:传统的手工测试人员,和不写代码的测试工程师不建议参加,该课程主要面向开发人员而不是一般的测试工程师。

    學(xué)员基础

    學(xué)员學(xué)习本课程应具备下列基础知识:

    1) 了解Java/C#/C++/C语言(最好了解面向对象基本概念);

    2) 简单了解XUnit框架的任何一种;熟悉一种开发工具IDE下单元测试环境(比如JUnit/Nunit/MSTest/CppUnit/TestNG/GoogleTest等,我们课程不关注具體(tǐ)的工具的使用(yòng))。

    培训内容(标准课程内容较多(duō),上课时根据學(xué)员需求进行定制安排)

    授课内容

    单元测试基础

    内容一:理(lǐ)解单元测试 

    1. 什么是单元测试?
    2. 為(wèi)什么要写单元测试,為(wèi)什么不写单元测试
    3. 理(lǐ)解单元测试--第一个单元测试案例
    4. 好的测试是什么样子的,為(wèi)什么要写"好"的单元测试
    5. 单元测试的维护成本
    6. 单元测试与自动化测试
    7. 分(fēn)析真实项目,如何做单元测试
    8. 通过案例分(fēn)析,了解基本的单元测试
    理(lǐ)解单元测试框架—XUnit工具

    内容一:理(lǐ)解单元测试XUnit 框架使用(yòng)(以Junit為(wèi)案例介绍,其他(tā)简单介绍)

    1. Junit设计目标
    2. 探索JUnit核心
    3. 参数化测试
    4. 测试异常
    5. 超时测试
    6. 引入Hamcrest匹配器
    7. JUnit的测试运行器
    8. 用(yòng)Suite来组合测试
    9. Junit与IDE,Ant,Maven集成运行
    10. JUnit与持续集成工具结合
    11. 通过案例分(fēn)析,Junit的最佳实践


    单元测试设计

    内容一:构思单元测试

    1. 单元测试模型的设计
    2. 单元测试用(yòng)例设计
    3. 為(wèi)系统运行起来而设计
    4. 為(wèi)正向测试而设计用(yòng)例
    5. 為(wèi)逆向测试而设计用(yòng)例
    6. 為(wèi)满足特殊需求而设计用(yòng)例
    7. 為(wèi)代码覆盖而设计用(yòng)例
    8. 通过案例分(fēn)析单元测试编程前的测试用(yòng)例的设计


    内容二:单元测试设计黑盒测试

    1. 单元测试黑盒设计
    2. 等价类设计法
    3. 边界值分(fēn)析法
    4. 判定表(决策表)驱动化
    5. 状态转移测试设计
    6. 结对测试
    7. 分(fēn)类树设计方法
    8. 用(yòng)例/场景测试
    9. 动态分(fēn)析法
    10. 通过大量案例分(fēn)析,如何应用(yòng)各种黑盒测试设计技术,进行设计单元测试


    内容三:单元测试设计白盒测试

    1. 单元测试白盒设计
    2. 标识单元测试点
    3. 语句覆盖
    4. 判定覆盖
    5. 基本路径测试法
    6. 白盒测试综合策略
    7. 测试覆盖准则
    8. 通过大量案例分(fēn)析,如何应用(yòng)各种白盒测试设计技术,进行设计单元测试
    单元测试坏味道

    内容一:测试代码坏味道 

    1. 模糊测试(也称為(wèi)長(cháng)测试、复杂测试、冗長(cháng)测试)
    2. 条件测试逻辑(也称為(wèi)缩排的测试码)
    3. 难以测试的代码
    4. 测试码复制
    5. 产品中的测试逻辑
    6. 通过案例分(fēn)析测试代码的坏味道,症状,原因,重构等


    内容二:测试行為(wèi)的坏味道 

    1. 断言滚轮
    2. 不稳定测试
    3. 脆弱性测试
    4. 手工干预测试(指必须手工设置测试环境,调整测试代码)
    5. 缓慢测试
    6. 通过案例分(fēn)析以上每种行為(wèi)坏味道,症状,原因,重构等


    内容三:测试项目的坏味道 

    1. 缺陷测试坏味道
    2. 开发人员没有(yǒu)写测试
    3. 高维护成本的单元测试
    4. 通过案例分(fēn)析以上每种行為(wèi)坏味道,症状,原因,重构等
    测试覆盖

    内容一:逻辑覆盖 

    1. 实施逻辑覆盖的原因
    2. 语句覆盖
    3. 判定覆盖
    4. 条件覆盖
    5. 条件覆盖
    6. 条件判定组合覆盖
    7. 多(duō)条件覆盖
    8. 修正条件判定覆盖
    9. 结合案例分(fēn)析,逻辑覆盖的度量


    内容二:统计测试覆盖--(以Junit為(wèi)案例分(fēn)析)

    1. 使用(yòng)clover為(wèi)junit单元测试做覆盖率分(fēn)析
    2. 使用(yòng)Cobertura统计JUnit测试覆盖率
    3. 结合案例分(fēn)析,通过测试覆盖率工具,分(fēn)析覆盖率
    单元测试模式

    内容一:单元测试结果验证模式 

    1. 状态验证模式-基于状态的测试
    2. 行為(wèi)验证模式-交互测试
    3. 自定义断言—预约断言
    4. Delta断言
    5. 哨兵断言
    6. 根据案例分(fēn)析结果的验证模式


    内容二:单元测试替身模式 

    1. Test Stub模式
    2. Test Spy模式
    3. Mock Object模式
    4. Fake Object模式
    单元测试之中如何解耦依赖

    内容一:利用(yòng)Stub解除依赖关系 

    1. 利用(yòng)Stub解除依赖关系 
    2. Stub的案例
    3. Extract and Override: The Universal Pliers
    4.  Isolate And Test Around
    5. How Much Code To Extract?
    6. Why You Should NOT Use Extract And Override
    7. Why You SHOULD Use Extract And Override
    8. 分(fēn)析真实项目,如何使用(yòng)Stub


    内容二:通过Mock对象交互测试

    1. 基于状态的测试与交互测试
    2. 使用(yòng)Mock的例子
    3. 手工Mock测试
    4. 自动化Mock测试
    5. 分(fēn)析真实项目,如何使用(yòng)Mock 以及相关问题


    内容三:MockStub區(qū)别

    1. Mock与Stub的區(qū)别
    2. 同时使用(yòng)Mock和Stub
    3. 每个测试只使用(yòng)一个Mock
    4. 改进代码设计,利于应用(yòng)Mock和Stub
    5. Mock和Stub的局限性
    6. 结合多(duō)个案例项目进行分(fēn)析,什么时间使用(yòng)Mock ,什么时间使用(yòng)Stub 如何权衡
    增强设计与代码的可(kě)测试性

    内容一:设计和代码的可(kě)测试性

    1. 抽取接口,容许替换底层实现
    2. 在被测类中注入桩对象
    3. What’s testable design?
    4. Modular design
    5. SOLID design principles
    6. Modular design in context
    7. Test-driving toward modular design
    8. Testability issues 
    9. Can’t instantiate a class
    10. Can’t invoke a method 
    11. Can’t observe the outcome
    12. Can’t substitute a collaborator 
    13. Can’t override a method
    14. Guidelines for testable design 
    15. Avoid complex private methods
    16. Avoid final methods
    17. Avoid static methods
    18. Use new with care
    19. Avoid logic in constructors
    20. Avoid the Singleton
    21. Favor composition over inheritance
    22. Wrap external libraries 
    23. Avoid service lookups
    24. 结合多(duō)个大型案例项目进行分(fēn)析,如何通过重构代码,实现可(kě)测试性 
    企业级系统的单元测试

    内容一:企业级系统的单元测试最佳实践

    1. 企业应用(yòng)系统特点
    2. 企业应用(yòng)典型场景
    3. 系统分(fēn)层架构与分(fēn)层的单元测试
    4. 一个案例的分(fēn)析
    5. 单元测试特点
    6. UI层单元测试测试
    7. Ctroller层单元测试
    8. Service层单元测试
    9. 数据库层单元测试
    10. 容器内的测试
    11. 通过企业应用(yòng)案例项目进行分(fēn)析单元测试的构建最佳实践
    编写好的单元测试

    内容一:好的单元测试测试标准-A-TRIP

    1. 单元测试的自动化-Automatic
    2. 单元测试彻底的-Thorough
    3. 单元测试可(kě)重复-Repeatable
    4. 单元测试独立的-Independent
    5. 单元测试专业的-Professional
    6. 通过案例分(fēn)析,分(fēn)析好的单元测试标准


    内容二:如何编写好的单元测试测试

    1. 单元测试中的坏味道
    2. 如何编写容易被看懂的模式
    3. 如何编写容易维护的模式
    4. 如何编写信得过的模式
    5. 重构单元测试,改进代码设计
    6. 结合多(duō)个案例项目进行分(fēn)析,分(fēn)析什么是好的单元测试
    TDD测试驱动开发基础

    内容一:TDD测试驱动开发

    1. TDD的节奏
    2. TDD的两个原则和TDD的目标
    3. TDD与行為(wèi)驱动开发(Behaviour Driven Development)
    4. TDD与验收测试驱动开发(Acceptance Test Driven Development)
    5. 识别代码中的坏味道
    6. 重构工具及使用(yòng)
    7. 常用(yòng)重构技巧
    8. 重构与预先设计的區(qū)别
    9. 通过案例分(fēn)析,TDD的最佳实践技巧,重构的技巧,坏味道等
    历史遗留系统如何编写单元测试

    内容一:遗留系统代码环境下如何编写单元测试

    1. 从哪里开始添加单元测试
    2. 确定抉择策略1-容易优先测类的优缺点
    3. 确定抉择策略2-困难优先测类的优缺点
    4. 遗留代码改动准则
    5. 重构前写集成测试
    6. 遗留代码整洁测试的常用(yòng)工具
    7. 為(wèi)第三方代码做學(xué)习测试
    8. 复杂遗留系统之中,如何增加单元测试以及遇到的问题
    9. 通过真实案例分(fēn)析,在遗留系统的的难度和最佳实践
    单元测试组织和管理(lǐ)

    内容一:组织和管理(lǐ)测试

    1. 通过自动构建脚本运行测试
    2. 将测试与代码做同源版本管理(lǐ)
    3. 根据速度和类型為(wèi)测试分(fēn)类
    4. 创建和维护项目的测试辅助设施
    5. 结合我们研发中心, 如何做单元测试管理(lǐ), 已经如何组织,以及遇到的问题
    在研发团队如何引入单元测试

    内容一:将测试引入到你的组织中

    1. 如何成功在组织中引入单元测试
    2. 為(wèi)什么在组织中引入单元测试的努力会失败
    3. 如何将测试集成到开发流程中 - 敏捷测试流程
    4. 常见的疑惑和解答(dá)?
    5. 通过多(duō)个研发中心咨询经验,分(fēn)析单元测试引入的方式和最佳实践