软件研发

单元测试和重构改进软件质量

2022-04-29 10:53:28 | 来源:中培企业IT培训网
  • 课程背景
在每个现代软件的构造阶段,测试这一实践都扮演着中心角色。过去那种先编写代码,然后有空的时候再测试(或者根本不测试)的日子已经一去不返,因为大多数开发人员现在认识到需要采用编码和测试彼此交织、同步推进的软件方法论,以便尽早发现 bug,在开发过程开始的时候就识别出主要的风险。
本课程系统全面地介绍了单元测试技术、方法以及原则,同时通过静态分析Java/C#/C++/C语言程序常见代码发现隐形Bug,而如何采用工具提高单元测试效率,则由讲解使用XUnit等单元测试工具实现,最后使用代码重构改进代码质量和可测性。
  • 课程目标
持续交付
TDD-测试驱动开发
单元测试概念
单元测试用例设计
应用单元测试框架实践单元测试
多种技术平台编程语言单元测试实战
单元测试效率
单元测试最佳实践经验
实现代码质量的度量
 代码覆盖率分析
Code review
面向对象设计原理与原则
重构实践
重构代码到模式。
  • 培训时长
3天(18课时)
  • 课程安排
应用单元测试和重构改进软件质量
时间 课程内容



持续交付
  • 软件研发交付面临的挑战
  • 持续交付的研发流程
  • 使用高质量的单元测试提高开发期质量的反馈
  • 应用CI进行每日构建以频繁地交付可工作的软件
  • 基本脚本的自动化部署缩短系统部署时间
  • 自动化的回归功能测试加速UAT测试
单元测试概述
  • 什么叫单元测试?
  • 为什么要做单元测试
  • 单元测试实施流程
  • 单元测试代码的编写规范
  • 单元测试策略
  • 单元测试用例设计
  • 单元测试覆盖率分析
  • 单元测试报告模板
 
基于单元测试的开发习惯
  • 开发过程是否需要单元测试
  • 是先代码开发,还是先单元测试
  • 进行Debug是否可以替代单元测试
  • 什么时间展开单元测试
  • 单元测试的粒度(函数级别吗?)
  • 单元测试与代码开发的时间比例关系
  • XP中的TDD实施过程
 
TDD-测试驱动开发
  • TDD开发优势、价值
  • TDD开发过程
  • TDD开发模式
  • TDD实践过程的问题、难点解决方案
 
单元测试代码结构
  • 实现代码结构与单元测试代码结构对比
  • 单元测试代码结构的可复用性
  • 单元调用接口替身代码结构
  • 集成单元测试代码结构
 
实现代码结构分析
  • 实现代码语句分析
  • 实现代分支、循环分析
  • 实现代码路径分析
  • 实现代码条件分析
  • 标识测试点
 
单元测试用例设计
  • 单元测试点之测试技术选择
  • 单元测试点之断言标准设计
  • 单元测试点之测试数据设计
  • 单元测试点集成测试场景设计
  • 基于设计模式实现代码的单元测试设计(创建、结构与行为)
 
应用单元测试框架实践单元测试
  • 单元测试框架概述
  • 编译单元测试框架源代码
  • 使用断言编写单元测试用例
  • 使用Fixture机制灵活支持单元测试
  • 使用参数化批量定义单元测试用例
  • 使用运行参数控制测试用例执行
  • 使用工具生成单元测试覆盖率报告



多种技术平台编程语言单元测试实战
  • 使用JSUnit、JSMock实践Javascript单元测试
  • Java语言单元测试实践:
    • 使用JUnit/TestNG框架实施Java代码的单元测试
    • 使用MockIto框架实施隔离测试
    • 使用Spring Test API实践Spring框架单元测试
    • 使用DBUnit框架实施基于数据库的单元测试
  • C#语言单元测试实践
    • 使用MSTest实施C#代码的单元测试
    • 使用RhinoMock框架实施隔离测试
  • C++语言单元测试实践
    • 使用Google Test框架实施C++代码的单元测试
    • 使用Google Mock框架实施隔离测试
  • C语言单元测试实践:使用Cmockery框架
  • 使用SQLUnit实践数据库存储过程单元测试
案例:使用单元测试框架进行单元测试案例实践
 
单元测试效率(缩短单元测试时间)
  • 测试的全面性与测试效率
  • 函数级别单元测试与测试效率
  • 简单且可运行实现代码的测试效率
  • 将单元测试代码集成到CI过程中
 
使用Mock实现测试隔离
  • Mock对象的设计和应用原则
  • 如何编写Mock和Stub
  • 使用Mock框架实现测试隔离
  • Mock和Stub的最佳实践
 
单元测试最佳实践经验
  • 根据架构设计分析单元测试策略
  • 基于软件需求、技术设计单元测试用例
  • 自动化回归单元测试用例
  • 生成、分析单元测试覆盖率报告
 
Test Review技巧
  • 如何Review已有单元测试代码
  • 分析单元测试覆盖率报告以发现问题
  • 分类测试问题以实现单元测试的可读性和可维护性
  • 案例分析开源项目的单元测试方案
 
遗留代码的单元测试导入与改进
  • 设计解耦分离解决方案
  • 测试已有代码的方法和策略
  • 通过重新设计改进代码可测性
  • 针对不可测代码的解决方案



静态测试
  • 静态测试的目的
  • 静态测试的原则
  • 静态测试实战
  • 案例:使用CheckStyle,PMD,Findbugs进行校验代码规则 , 发现重复代码,检查代码注释率
 
实现代码质量的度量
  • 代码质量的度量
  • Chidamber & Kemerer度量,
  • Depth of Inheritance Tree(DIT)
  • Number of Childre(NOC)
  • Response for a Class(RFC)
  • Afferent/Efferent Couplings(CA/CE)
  • Lack of cohesion in methods(LCOM)
  • 业界其他度量标准
 
Code review
  • Code review的原则
  • Code review前期准备
  • Code review的代码量
  • Code review的缺陷检查表
  • Code review实战
  • 案例:使用Eclipse插件执行Code review活动
 
代码覆盖率分析
  • 代码覆盖率的意义
  • 代码覆盖率工具介绍
  • 代码覆盖率实战
  • 代码覆盖率分析
  • 案例:使用 CodePro进行覆盖测试
 
使用重构提高代码可测试性
面向对象设计原理与原则
  • 开-闭原则(Open-Closed Principle)
  • 里氏代换原则(Liskov Substitution Principle)
  • 依赖倒换原则(Dependence Inversion Principle)
  • 接口隔离原则(Interface Segregation Principle)
  • 合成、聚合复用原则(Composite Aggregate Reuse Principle)
  • 迪米特法则(Law of Demeter)
 
重构实践
  • 分析并初步重构一个案例
  • 重构原则
  • 代码的坏味道
  • 构筑测试体系
  • 重构工具
  • 优秀程序结构的风格
  • 如何观察代码
  • 重构名录
  • 重新组织函数与属性
  • 重新组织对象关系
  • 简化表达式
  • 组织继承体系
  • 如何让重构成为习惯
  • 重构案例实践与分析
  • 重构工具
  • 案例:使用Eclipse/VS.NET工具进行重构实战



 
使用重构提高代码可测试性
重构到模式
  • 设计模式概述
  • 设计模式历史,描述,分类,应用
  • 使用模式的预先设计
  • 过度使用设计模式后果分析
  • 通过重构实现、趋向和去除滥用模式
  • 代码的坏味道:过度设计、设计不足
  • 构筑测试体系
  • 演进式设计
 
案例---重点介绍重构基本类型依赖和对应模式
  • 通过案例学习以下重构到模式手段
  • 以State取代状态改变条件语句
  • 以Strategy取代条件逻辑
  • 以Composite取代隐含树
  • 以Interpreter取代隐式语言
  • 转移装饰功能到Decorator
  • 用Builder封装Composite
 
案例---重点介绍重构代码重复和对应模式
  • 通过案例学习以下重构到模式手段
  • 构造Template Method
  • 以Composite取代一/多之分
  • 引入Null Object
  • 用Adapter统一接口
  • 用Fatory Method引入多态创建
 
案例---重点介绍重构代码过长/过大的类/方法和对应模式
  • 转移聚集操作到Vistor
  • 以Strategy取代条件逻辑
  • 以Command取代条件调度程序
  • 转移聚集操作到Collecting Parameter
 
案例---重点介绍条件逻辑过度复杂和对应模式
  • 以Strategy取代条件逻辑
  • 以State取代状态改变条件语句
  • 转移装饰功能到Decorator
  • 引入Null Object
  • 以Command替换条件调度程序
  • 转移聚集操作到Visitor