单元测试的艺术
0. 总结
1~2章介绍的是单元测试的基本概念
3~6在教你如何测试
7~8教你怎么写好代码
9: 鸡汤
10: 对付遗留代码
11: 好好设计代码吧
1. 入门
优秀单元测试的特性
- 自动化,可重复执行
- 很容易实现
- 以后还有意义
- 任何人都能一键运行
- 速度很快
- 独立于其他测试的运行
- 如果它失败了,能快速定位问题
什么是集成测试
依赖到一个或多个真实依赖物,例如真实的系统时间,真实的文件系统,真实的数据库.
单元测试和集成测试的区别
集成测试会使用真实依赖物,而单元测试则把被测试单元和其以来无隔离开.
单元测试要点
- 测试的命名 测试的可维护性 测试的可读性
- 该成果的时候成果,该失败的时候失败
2 第一个单元测试
测试的命名
- UnitOfWork_Scenario_ExpectedBehavior
- UnitOfWork: 被测试的方法、一组方法或者一组类
- Scenario: 测试进行的假设条件
- ExpectedBehavior: 在测试场景指定的条件下,你对呗测试方法行为的预期
单元测试主要的三个行为
- 准备(Arrange)对象,创建对象,进行必要的设置
- 操作(Act)对象
- 断言(Assert) 某件事情的预期
3 使用存根破除依赖
存根跟模拟对象的区别是: 两者类似,但是我们需要对模拟对象进行断言,而不会对存根进行断言
这里主要是为了烂代码去写更多的代码去实现测试,感觉会本末倒置
使用IOC可优好的测试.
同意赞同重构代码,使其易于测试
4 使用模拟对象进行交互测试
4.1 基于值测试,基于状态测试,和交互测试
伪对象、存根、模拟对象的区别
- 伪对象指模拟对象/存根
- 如果伪对象用于检测一个交互,这个伪对象为模拟对象,否则为存根
4.2 模拟对象和存根的区别
模拟对象和存根的根本区别: 存根永远不会导致测试失败,而模拟对象可以
这个作者也是醉了..
第三、四章说完就说这两有缺陷,,这抛砖引玉...好啊......擦..
5 隔离(模拟)框架
麻鸡...
6 深入了解隔离框架
6.2 优秀隔离框架的价值
提高测试健壮性的功能
- 递归伪对象
- 对行为和验证默认忽略参数
- 非严格验证和行为
- 大范围伪造
7. 测试层次和组织
7.4将测试类映射到源代码
- 集成测试和单元测试必须分块
- 将每个待测试类对应一个测试类
- 当某个方法需要特别多的测试,新建对应的一个测试类
7.6 为应用程序构建测试API
7.6.3 把你的API介绍给开发人员
- 偶尔结对编程,一带一
- 准备小文档/速查表
- 在团队会议上讨论API变更
- 新人入职带过文档
- 进行测试审查
8 优秀单元测试的支柱
优秀测试
- 可靠
- 可维护
- 可读
8.1编写可靠测试
8.1.2避免测试中的逻辑
单元测试不应该有任何 switch if else for等语句
如果第一个断言失败了,你还会关心下一个断言的结果吗?如果会,就把它分为两个单元测试
8.2 编写可维护的测试
8.2.4 实施测试隔离
测试中的臭味道
- 强制的测试顺序
- 隐藏的测试调用
- 共享状态损坏: 测试共享内存里的状态,却没有状态回滚
- 外部共享状态损坏: 集成测试共享资源,却没有回滚资源
9 在组织中引入单元测试
这里一看就是一碗鸡汤,就看你干不干
9.1 变成倡导者
9.1.1 准备面对质疑
回答自己最难的问题
9.1.2 找到支持者和反对者
支持者: 教他们回答问题
反对者: 请他们参与其中的一些细节,切记不要告诉他们,他们哪里做得不好
9.1.3 找到可能的切入点
- 选择较少团队
- 经验少的一般愿意接受变革,经验多且墨守成规的,你很难改变他们,所以找一个技术经理愿意变革,且团队成员经验较浅的团队
- 经常性代码审查,要面对面的审查
- 自下而上
9.2 成功之道
9.2.4 使进度可见
9.2.5 设置具体目标
9.3 失败原因
9.3.3 不好的实现和第一印象
你自己要把整体的布局想好了,才开始实施,自己必须要牛逼,不然自己也不咋懂,就开始瞎弄,可能会丢掉以后的机会
9.3.4 缺少团队的支持
你应该逐个交谈,并回答他们的尖锐问题
这章主要讲心理学和人际交往学
主要考虑一下6个影响因素
- 个人能力: 你真正掌握这门技术吗
- 个人动机: 这个人把事情做对了吗,遇到困难能坚持吗
- 社会能力: 你是否给这个人提供帮组,在关键时刻
- 社会动机: 这个人周围的人是否鼓励正确的行为,反对你的人能否体现出其正确的行为
- 组织能力: 是否存在坏境因素,使其方便的提供帮助
- 组织动机: 如果你做了正确/错误的事情,能得到预期的回报吗
9.5 质疑和回答
9.5.6 我们有大量没有测试的代码: 应该从哪里开始
20%的代码包含80%的bug,从这里开始吧
10. 遗留代码
10.3 在重构前编写集成测试
有些代码无法单元测试
- 进行集成测试
- 重构
- 逐一单元测试
10.5 总结
要了解各个组件的依赖书和逻辑量,初学者可以先对最简单的进行测试
11.设计与可测试性
好的代码是可以测试的