第一章
读书笔记:
传统定义
一个单元测试是一段代码(通常是一个方法),这段代码调用另一段代码,然后检验某些假设的正确性。如果这些假设是错误的,单元测试就失败了。
泛化
一个单元代表系统的”系统单元“或一个”用例“,从调用系统的一个公共方法
单元测试是否应该尽可能的小?
如果创建的工作单元更大,他的最终结果对这个接口的用户可见性更高,那么测试更容易维护。
如果测试单元缩小,最后不等不伪造一堆东西,这些东西并不是使用公共API的真实最终结果,而是生成结果过程中的一些中间状态,这是一种过渡指定
单元测试的特性:
自动化
可重复执行
很容易实现
未来仍然有意义
任何人都可以一键运行
速度快
结果稳定
能够完全控制被测试的单元
应该完全隔离
如果失败了,能够很容易的发现期待的结果,从而定位问题
集成测试定义:如果运行速度不快、结果不稳定、用到一个和多个依赖物,我们称之为集成测试
依赖物包括但不限于真实的系统时间、真实的文件系统、真实的数据库
差的单元测试没有任何的意义,最多只能是初次练习时候的产物,而且还增加了后续删除的工作量。我们需要的是优秀的单元测试。优秀的单元测试实在单元测试特征的基础上增加了三个特性:可靠、可读和可维护
TDD的意义:测试优先于开发
TDD的步骤:
第一步:编写一个会失败的测试,以证明产品中代码或者功能的缺陷
第二步:编写符合测试预期的蟾皮代码,是测试通过
第三步:重构代码(可选),重复到第一步。
成功TDD的三个核心技能:
知道如何编写优秀的测试
在编码前编写测试
良好的测试设计
误区:
仅仅做到先编写测试,并不能保证测试是可靠、可读和可维护
仅仅做到编写测试时可靠、可读和可维护并不能保证能够获得先编写测试的好处
仅仅做到先编写可靠、可读和可维护的测试,也不能保证能够得到一个设计完善的系统。
设计能力才是使代码优美,可维护的关键。
介绍优秀测试技能的书
kent beck的 《Test-Driven Development:by Example》
https://www.oreilly.com/library/view/test-driven-development/0321146530/
设计能力相关的书
《Growing Object-Oriented Software, Guided by Tests》
《程序员的职业修养》
思考:
之前一直在做的是集成测试
单元测试只关注与被测试对象的逻辑,而与外部依赖的数据无关