深度解读测试驱动开发(TDD)

作者/分享人:Seaborn Lee
一名会在 B 站直播写代码,会玩杂耍球、弹 Ukulele、极限健身、跑步、写段子、画画、翻译、写作、演讲、培训的程序员。喜欢用编程实现自己的想法,在 Android 市场上赚过钱,有多次创业经历。擅长学习,习惯养成,时间管理。身体力行地影响他人做出积极的改变!目前就职于 ThoughtWorks,致力于传播快乐高效的编程理念。业余创立软件匠艺社区 CodingStyle.cn,组织超过30场技术活动。个人公众号:SeabornLee。

你是否还在用如下这种方式编写代码?

  • 需求分析,想不清楚细节,管他呢,先开始写。
  • 发现需求细节不明确,去跟业务人员确认。
  • 确认好几次终于写完所有逻辑。
  • 运行起来测试一下,靠,果然不工作,调试。
  • 调试好久终于工作了。
  • 转测试,QA 测出 BUG,打补丁。
  • 终于,代码可以工作了。
  • 一看代码烂的像坨屎,不敢动,动了还得手工测试,还得让 QA 测试,还得加班。

我要介绍的 TDD 编码方式是这样的:

  • 先分解任务,分离关注点。
  • 列 Example,用实例化需求,澄清需求细节。
  • 写测试,只关注需求,程序的输入输出,不关心中间过程。
  • 写实现,不考虑别的需求,用最简单的方式满足当前这个小需求即可。
  • 重构,用手法消除代码里的坏味道。
  • 写完,手动测试一下,基本没什么问题,有问题补个用例,修复。
  • 转测试,小问题,补用例,修复。
  • 代码整洁且用例齐全,信心满满地提交。

本场Chat内容包括:

  1. TDD 的几层含义;
  2. TDD 的本质;
  3. TDD 的好处;
  4. 为什么大部分人 TDD 会失败;
  5. TDD 的正确练习路径。

实录提要:

  • 在一个团队中谁来写单元测试呢,开发还是测试?如何协作?
  • TDD 是否适合界面的开发?
  • 有关于怎样分解任务的策略,拿到一个任务,如何开始第一步?
  • 如何在紧张的工期和完善的单元测试之间进行权衡?
  • 两周一个版本迭代,适合用 TDD 吗?
  • 对于单元测试的 mock,应该针对外部接口进行 mock 吗?
已有137人预订
预订达标
文章出炉
交流日期
     
02月27日
03月13日
03月16日 20:30
查看文章评论/提问
旅行的猫
感谢分享,TDD的另一个优势是减化了文档工作,测试即文档,并且这份文档永远是最新的,不维护软件就无法工作。并且让开发专注于基于“业务“功能的代码测试,这样,不管底层代码怎样变动或重构,只要业务没变,测试代码就不需要改。 说到提前设计,一张纸就够了,写码前只需要很粗略的设计,好的设计会在coding过程中通过重构浮现出来,对重构的能力要求较高。
Seaborn Lee: 谢谢补充,测试作为活文档使用,读一读测试就可以了解最真实的业务👍
林从羽
在大型的项目中,原代码库基本不遵循单一职责原则,一个方法做四五件事情,可能还依赖全局的状态变量,而我们要实现的方法必须写在中间。而原代码的测试方法一个也有三十到四十行,基本都在准备测试数据,很复杂。我的问题是,在这种测试数据准备很困难的场景下,tdd该如何做?问题再推广一下,在一个项目组中,tdd的实施,与人员素养、团队结构、团队文化、代码库现有设施与设计这四五个因素,有什么样的影响及推广方式呢?
tangpeng
一直有一个疑问,tdd过程中是否需要及时重构,我觉得可以先消除怪味道不一定要求及时重构,比如不用着急提提取方法,如果过早提取方法不利于后面观察规律和重构。
tangpeng
单元测试中有mock和测试桩两种,推荐哪种方式呢?
晓文
超级棒的入门介绍,最近在尝试把测试流程引入 Laravel 开发流程
匿名
很不错的文章,喜欢用例子的方式讲解问题,直观。
gongzf
文章很好,很喜欢,TDD确实能提高开发代码的质量,希望我们也能用TDD,谢谢😜
高鹏程
谁来写单元测试呢?开发还是测试?开发测试如何协作呢?分开的方式会不会导致测试用例质量的下降?毕竟要实现的功能只有开发最清楚,会不会导致覆盖率降低?
林从羽
阅读了许多文章,也做过一些实践,一直想系统总结一下TDD理论和最佳实践,没想到作者已经捷足先登,产出了这样一篇系统全面的好文,从是什么,为什么,怎么做,实际例子和答疑几方面系统地总结了Tdd。 可能是限于主题或篇幅,任务分解那部分没有能够深入下去。好在仝健老师也已经写了一篇 编程的精进之道,也许可与此文相互补充。 文中关于“不会重构”这个问题解决方案的拆分让我印象深刻,受益很多。先学辨别坏味道,再学对应手法。赞
仰望星空
请问下,TDD是否适合界面的开发?应用的业务逻辑部分可以用TDD这个可以理解,不过,界面部分是否也适用?如果可以的话,大概是如何操作呢?比如安卓,是用安卓提供的测试框架么?那只能测试简单的界面切换之类的功能,有没有其他更好的方式? 谢谢!
tangpeng
总结的很好,以前tdd都是完全不做设计,边写边设计,发现规律最后重构。后面可以尝试下两种方法都做
旅行的猫
有关于怎样分解任务的策略,拿到一个任务,如何开始第一步。
gongzf
两周一个版本迭代,适合用TDD吗?
D调的暖冬🚀
我比较关心tdd优先级 robert 大叔说的那个 这个如何理解和应用 好像确实很容易写着就死胡同了
匿名
单元测试与集成测试,怎么权衡,开发应该注重单元测试还是集成测试,还是说都要关注?
匿名
如何在紧张的工期和完善的单元测试之间进行权衡?
gongzf
TDD测试驱动开发,有哪些注意事项,测试和开发应该注意哪些内容?
匿名
对于单元测试的mock,应该针对外部接口进行mock吗?那么,再提交测试之前,是否要关注外部接口的返回结果是否按照约定返回?
陈志伟
写单元测试好的实践,及各种单元测试优缺点(使用详解就更好了),望分享下
你可能还喜欢
Service Mesh 在华为公有云的实践
田晓亮
利用 OpenCV 和 Caffe,根据大合影构造“平均脸”
李烨
从零开始,搭建 AI 音箱 Alexa 语音服务
Mike
Web 安全恩仇录:再谈逻辑漏洞
肖志华
TensorFlow 分布式原理与应用实践
刘光聪
编程和数学基础不佳如何入门人工智能?
赵宁|Neal
微信扫描登录