什么是TDD
本文所说的 TDD 指狭义上的 TDD,也就是「单元测试驱动开发」。
TDD 是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD 是 XP(Extreme Programming)的核心实践。它的主要推动者是 Kent Beck。
为什么要TDD
传统编码方式 VS TDD 编码方式
传统编码方式
1.需求分析,想不清楚细节,直接开始写
2.发现需求细节不明确,去跟业务人员确认
3.确认好几次终于写完所有逻辑
4.运行起来测试一下,不工作,调试
5.调试好久终于工作了
6.转测试,QA 测出 bug,debug, 打补丁
7.终于,代码可以工作了
8.代码很差,却不敢动,动了还得手工测试,还得让 QA 测试,还得加班...
TDD 编码方式
1.先分解任务,分离关注点(后面有演示)
2.列 Example,用实例化需求,澄清需求细节
3.写测试,只关注需求,程序的输入输出,不关心中间过程
4.写实现,不考虑别的需求,用最简单的方式满足当前这个小需求即可
5.重构,用手法消除代码里的坏味道
6.写完,手动测试一下,基本没什么问题,有问题补个用例,修复
7.转测试,小问题,补用例,修复
8.代码整洁且用例齐全,信心满满地提交
优点
效率
1.提前确认需求,减少开发中的中断和等待
2.小步快走,节省调试时间
质量
1.高测试覆盖率
2.自动回归测试
怎么做
流程
1.快速新增一个测试
2.运行所有的测试(有时候只需要运行一部分),发现新增的测试失败
3.做一些小小的改动,尽快使测试程序可以运行,可以使用不合理的方法
4.运行所有的测试,并且全部通过
5.重构代码,以消除重复设计,优化结构
如何学习
- RED write a test that fails
1.Tasking
2.有效的测试单元 - GREEN make the code work
1.Obvious Implement
2.Fake
3.Traingulate - REFACTOR eliminate redundancy
1.Clean code
2.Smell
3.手法
FAQ
明知道失败,为什么还要运行?
失败有很多原因,运行是为了保证失败是自己想要的失败;
避免由于别的原因导致失败。
小步好,但真的要小到这个程度吗?
练习的时候,尽可能小步;
实际的时候当大步遇到问题可以尽快切换到小步。
测试覆盖率多少合适?
刚开始的时候尽量保证100%覆盖率。锻炼自己写测试的能力;
追求100%可以比较出有价值的测试。