《测试驱动开发与设计模式》- 为什么选择测试驱动开发?

1 攀岩的启示

  • 攀岩第一级:人工岩壁(休闲运动, 学习场地,有保护设施)
climb_basic.jpeg
  • 攀岩第二级:天然岩壁,顶绳攀登(极限运动, 野外场地,已有保护设施)
climb_protected_1.jpeg
  • 攀岩第三级:天然岩壁,先锋攀登(极限运动,野外场地,攀登过程中自己加入保护设施)
climb_protected_2.jpeg
  • 攀岩第四级:天然岩壁,徒手攀登(啥运动? 野外场地,无保护设施)
climb_unprotected.jpeg
  • 无保护徒手攀登之一,来自纪录片<<徒手攀岩>>。

无保护攀岩

  • 无保护徒手攀岩之二,来自电视剧<<北辙南辕>>。

无保护攀岩

问题:

  • 你想玩哪一级?是想玩最酷的, 还是想活着?还是两者都要?

2 攀岩与编程

攀岩与编程有很多共同点。

攀岩:

  • 攀岩需要掌握很多技术:转身,引体向上,腾挪,跳跃 ......
  • 攀岩需要辅助性装备:攀岩鞋、手套、镁粉 ......
  • 攀岩需要保护性装备:主绳,安全带,安全铁索,快挂,岩石塞、岩钉、膨胀钉、挂片 ......

编程:

  • 编程也需要掌握很多技术: OO、设计模式、模板
  • 编程也需要辅助性装备:编译器、调试器 ......
  • 编程也需要保护性装备:What?

类似的问题:

  • 你想玩哪一种编程?玩大而复杂的项目,还是想简单地活着?还是两者都要?
  • 如果攀岩需要保护性装备,为什么编程可以不关心?

答案:

  • 源代码测试框架是编程的保护性装备,测试驱动开发是有保护编程。

3 没有测试驱动开发的编程

开发阶段

  • 快点搞。因为开发不结束,测试不能排期,领导着急。使劲加班。
  • 写完了,等测试,这时啥也做不了。闲呆着。
  • 自己测一测?事倍功半不值得,大概搞一搞算了,反正后面还有集成测试。再说也没有那么多时间。

测试阶段前期

  • 免不了出问题。又是一顿狠催,被迫在巨大的压力下分析问题。又是使劲加班。
  • 是使用不当,还是功能缺陷?与测试工程师的关系尖锐对立。

测试阶段后期

  • 终于好像比较稳定了。还有没有问题呢?好像心里还是没底。
  • 有些地方似乎有更好的设计?改动比较大?算了,先就这样吧,别自找麻烦。

维护期

  • 看起来稳定了。要尝试新设计吗?搞好了别人看不到,搞出新问题要自己担。还要解释那么多工时花到哪去了。唉。

问题:

  • 不知道会出现什么样的问题?问题的数量收敛了吗?
  • 在这个过程中掌握了什么设计技巧了吗?

3 有了测试驱动开发呢?有保护编程

3.1 创建安全网

  • 源代码测试框架的一般使用方法:

    • 构造对象,
    • 设置对象属性/调用对象方法,
    • 检查对象状态
  • 这样写代码最自然的方式,就是基于对象(Object-Based)编程。

  • 有了自动化的单元测试,就可以开始评估代码的可靠性。哪些场景是测过的,一定程度上,心里有了底。在相当程度上减少了一开始的问题单数量。

  • 一边写代码,一边校验正确性。对开发期进度的估计会越来越精确。

  • 遇到了问题,就可以在脑子里过一遍,安全网已经兜住了哪些场景?在下手排查之前就排除了很多可能。

  • 问题解决了,就可以将新的测试加到测试用例集中去。

  • 测试工程师(或其他人)每发现一个问题,安全网就更完善一点。这样测试工程师成了开发工程师脑力的延伸,两方不再是对立关系了。

这里将源代码测试框架仅仅用作单元测试工具,这也是TDD最基础的使用方式。收益不够大。

3.2 在安全网中快速变更

  • 人的认识不断发展、完善,认识的深度和广度都会变化。TDD推动/激励变更,推动/激励更简单、更清晰的设计。

  • TDD推动变更的同时,也提供了快速变更的条件。有了自动化运行的测试用例,快速变更变得容易了,只需要调整部分测试实例就行。

  • 测试用例要简单直白。测试用例不够简单,写起来费劲,就说明对象的接口不够友好。

  • 一边写代码,一边检验接口。从优先考虑“怎么实现”,转变为优先考虑“怎么设计接口”。

  • 所以TDD激励对象的拆分和重组,以便表达清楚,干净利落。软件设计是一门“解释”的科学,表达得清楚、干净,就是设计得好。

  • 基于对象(Object-Based)编程,必然会自然过渡到面向对象(Object-Oriented)编程,也必然会应用设计模式。因为世界原本就是这样的。

  • 很多问题,在尝试解决时,会发现前人已经解决过了,也总结过了。或者会发现,原来自己思考思考,也能赶上前辈大师了。常常会觉得,至少在当前的问题上,自己在逼近人类认识的极限,在完成一个作品,而不仅仅是完成一个功能集合。

3.3 团队开发中的TDD

  • 敏捷开发/迭代式开发,以模块的快速变更为基础,实际上是以个人的TDD为基础。
  • TDD首先是个人开发模式,不在敏捷团队中也可以从中受益,在敏捷开发团队中更可以游刃有余。

4 攀岩与编程再比较

项目 能力/技术 保护性装备 保护设施
攀岩 转身,引体向上,腾挪,跳跃... 主绳,安全带,安全铁索,快挂,岩石塞、岩钉、膨胀钉、挂片... 你的岩钉嵌入到哪里?
编程 OO、设计模式、模板... 源代码测试框架 你的自动化测试用例集嵌入到哪里?
  • 只是纸上谈兵,锻炼不了技术;没有保护,容易挂掉,也没有机会锻炼技术。所以要在有保护条件下,反复练习。无论是攀岩还是编程。
  • 有保护攀岩是安全攀岩,有保护编程是安全编程。

相关链接

测试驱动开发与设计模式 - 为什么使用测试驱动开发
测试驱动开发与设计模式 - 从入门到精通
测试驱动开发与设计模式 - C++书籍及网站
测试驱动开发与设计模式 - 适应并改进软件设计过程
测试驱动开发与设计模式 - 让“理想结构”与“快速变更”并行
测试驱动开发与设计模式 - 提速 — 在纸上做细节设计
测试驱动开发与设计模式 - 开发实例一 DVR-POS库
测试驱动开发与设计模式 - 开发实例二 JSON过滤库
测试驱动开发与设计模式 - 开发实例三 rs_driver库

你可能感兴趣的:(《测试驱动开发与设计模式》- 为什么选择测试驱动开发?)