【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

阅读者(五):测试驱动开发的艺术

  • 2011-02-09
  • 本文字数:3296 字

    阅读完需:约 11 分钟

【编者按】时至今日,作为敏捷开发核心实践之一的 TDD(测试驱动开发),对大多数软件从业者来说应该已经不是什么新鲜事物了。即便你再孤陋寡闻,面对各大技术媒体、论坛和出版商的轮番轰炸,要想完全不知道,恐怕也非易事。若情况真是如此,请将你的经验共享出来,好让我也学习一下,自动屏蔽那些令人厌烦的信息。好了,玩笑话就说到这里,现在还是回到本系列的正题:书评,本篇的主角就是这本《测试驱动开发的艺术》。


严格的讲,这是一本面向 Java 开发者的 TDD 书籍,书中的大量示例以及言及的工具无一例外都是针对 Java 领域的,而且主要针对的是企业开发领域。虽然我相信使用其他工具和处于其他领域的开发者同样也能从中受益,但相关的工具和信息就只能靠自己去寻找和摸索了。若是你所在的公司主营业务并非是企业开发,需要自己领悟和转化的内容就更多,而且对于阅读者本身的要求也相应的会提高。话虽如此,但正因为它把读者群限定为一个特定的范围,反而更凸显了其自身的价值,加之如今 Java 开发者人数众多,其影响力也自然是水涨船高。

本书对于那些有意了解和采纳 TDD 的 Java 开发者,尤其是企业开发者,无疑相当于一本福音书。为什么这样讲?我在这里列出了三个理由,对不对可以由你自己判断:

  • TDD 绝非是掌握使用 JUnit 编写单元测试这么简单。相信很多读者都读过一些介绍 TDD 的材料,而且对于 JUnit 也都有一定的基础,可到了真正要完全从测试开始写出一个完整应用来的时候,总觉得束手束脚,不得要领。甚至可能会觉得以前读过的书都白读了,挫败感是此时唯一的感受。本书的第 2、 3 章就是这时你最需要的指导!这两章的内容是我看过的最具价值的介绍如何采用 TDD 的素材,而且相比起来也是最真实的内容。

  • 如果说第一部分是在广度上对 TDD 进行了介绍的话,那第二部分则是对于 TDD 的深度历险。短短四章内容,你可以了解如何使用 TDD 开发典型的功能组件:

    • 第 5 章:Web 开发,重点谈到了 MVC 中的 V 和 C 的 TDD。
    • 第 6 章:数据访问,涉及 JDBC/Hibernate,同时也谈到了集成测试。
    • 第 7 章:时间和多线程。
    • 第 8 章:Swing。

也许你在其他地方多少还能看到第 5、6 和 8 章的内容,但专门讨论如何对难以预测的行为进行 TDD 的内容就并不多见了。个人认为第 7 章可以算得上是本书的一个亮点。

  • ATDD 是本书最后一部分内容的主角,在这一部分,你可以真正看到采用敏捷方法开发项目的全貌。当然,工具介绍是避免不了的。但让我觉得更有价值的是对于相关策略的介绍,不论是执行 ATDD 的策略,还是推广 TDD 的策略。

本书适合各种层次的读者,内容的 3 个部分大致可以粗略的对应低、中、高三个层次的读者;书中介绍的大量工具更是节省了自己去寻找的时间和麻烦;至于书中穿插的作者自己的经验之谈,恐怕就只有靠读者自己在实践中去体会和领悟了。

让我想想,是否还漏掉了什么?哦,对了,翻译。作为一本引进书籍,自然不能不谈其翻译的质量。正如你不想为一本劣质的翻译作品掏冤枉钱一样,我也不想为一本翻译得磕巴,说的话不像中文的书籍进行评论!一言以蔽之:翻译质量过硬。对于一本能让我从头一气读到尾的翻译作品,实在不用再多说些什么了!

如果你的目标是要提高 TDD 的技能,学习别人的经验,那这本书就是你必读的书籍,我在这里假定你是一名 Java 开发者,主要从事企业开发。书中众多的知识点对于初涉 Java 领域的开发者来说,确实是设置了不低的门槛,可这并非就说明初学者不能从中获益。在此,我建议精读第一部分,对于其余部分略读即可。在实践过程中,采用书中介绍的 TDD 方式学习新知识,在接到相应的任务时,再去细读相关部分。就国内公司的现状,我相信你很快就会用到第二部分乃至第三部分的知识。

——InfoQ 中文站 SOA 社区编辑 胡键

读罢《测试驱动开发的艺术》,忽然想起中国传统文化中的“道器之辩”。《易经》曰:形而上者谓之道,形而下者谓之器。中国的传统文化常常是重道轻器,认为道本器末,即道是根本,其他一切是道的外在表现,器是道的从生与从属。这就导致我们常常喜欢把“道”与“器”割裂开来,一味地重视过度抽象的“道”,进而形成一种形而上学的玄幻,使得“道”高高在上,未能落于实处。重道轻器给传统文化带来的缺失告诉我们,“道”与“器”应该是统一的,道是本质,却又必须依赖于器,受制于器。

从软件开发的角度来看,TDD 的本质思想即为“道”,这其中包括按照意图编程的思想,提高可测试性的设计原则,以及测试的模式与面向对象的基本思想。而“器”则包含对 TDD 的合理运用,针对不同的用例场景做出的测试手法,以及对测试工具的使用。

本书第一部分《TDD 入门》阐述的正是 TDD 之道。虽然是入门知识,却高屋建瓴地阐明了 TDD 的真谛。例如本书写道:

在 TDD 周期中的第一步中,我们会写测试,实际上这并不只是写测试而已,而是在做设计。我们是在设计 API,即用来访问新功能的接口。编码之前写测试,我们会自然地考虑新代码的调用方式。……测试先行的编码方式会促使我们站在代码用户(开发人员)的角度考虑,设计出更易用的 API。

很多开发人员并不愿意接受 TDD 的开发方式,认为这种先写测试后编码的方式既别扭而又浪费时间,原因就在于他们没有真正体会这种测试驱动设计的好处。TDD 最重要的一个字眼儿就是 drive(驱动),事实上,这种驱动力正是所谓“按照意图编程”的重要思想。

意图编程,顾名思义,就是说写代码时先假设其他部分代码都已经存在了(即使事实并非如此)。使用这种编程方法时,我们可以把注意力集中在能有的,而不是已经有的东西上。使用意图编程,我们能让代码读起来更流畅,容易理解和使用,也能使代码清晰地表达出自己的本意,而不会过于强调实现细节。

个人认为,本书第一部分给出的邮件模板子系统的范例更贴近开发真实,却又不至于晦涩难懂。作者在选择范例上的匠心独运,使得本书既具有很强的实践指导意义,又不至于陷入复杂的业务需求和技术细节中。范例给出的第一个测试、伪实现以及重构的手法,都是自然而然的 TDD 过程,而不是为了写作本书生拉硬拽,东拼西凑,有着强烈地雕琢痕迹。若能在阅读过程中,比照着这样的过程动手实验,相信能够获得更大的提高。

从本书的第二部分开始,就迈入了 TDD“器”的部分。之所以说是 TDD 之“器”,在于它介绍了针对特定技术应用 TDD 的内容,这其中包括对 Web 组件、数据访问、多线程、Swing 代码的测试驱动开发。在讲解的过程中,作者还介绍了大量用于这些特定技术应用 TDD 的工具或框架,例如 JspTest、 EasyMock、MockObjects、HSQLDB、Jemmy、Abbot 等。这些都是 Java 平台下常用的支持 TDD 的有力工具。本书的第三部分则着重介绍了 ATDD(验收测试驱动开发),包括对用户故事的介绍,验收测试的特征与实现,ATDD 的过程以及相关工具 Fit。这在许多介绍 TDD 的书籍中都是不多见的内容。

这两部分内容给出了许多贴近开发真实的例子,提出了许多卓有成效的测试方法。这些内容如此地实用,涵盖的知识如此地全面,基本上可以解决我们在企业开发中进行 TDD 可能遇到的问题。事实上,这些内容大多数都可以说是 TDD 实践过程中的拦路虎,尤其是针对表现层和多线程技术的 TDD 方法,大多数开发人员都缺乏这方面的知识,甚至因为这样而放弃 TDD。本书极具实践指导意义的阐述弥补了这一空白。遗憾的是,本书介绍的内容主要针对 Java 开发人员,因而提及的工具也都基于 Java 平台,对于其他平台下的开发人员而言,无疑削弱了几分价值。

本书还有一点不足就是“道”与“器”的不统一。前面提到,本书的第一部分开篇名义,用极简洁的语言道明了 TDD 的本质。然而本书的第二部分与第三部分,几乎只停留在 TDD 方法和工具的使用上,而忽略了测试对于设计的驱动力。书中的例子仅仅给出了如何完成测试用例,如果建立 Mock 对象,却不再介绍为何要这样编写测试用例,驱动我们进行设计的意图何在。换言之,后面的例子省略了驱动对设计进行推导的过程。这种驱动设计的能力恰好是很多程序员所不具备的。 “器”固然重要,但它必须遵循“道”的要义,在其指引下实施。本书内容“道”与“器”兼顾,却将二者割裂开来,未能形成统一的整体,不能不说白璧微暇,略有遗憾。

——InfoQ 中文站架构社区编辑 张逸

2011-02-09 20:194682
用户头像

发布了 255 篇内容, 共 54.4 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

Jetpack Compose 1,阿里P8架构师Android大厂面试题总结

android 程序员 移动开发

JNI 与 NDK 入门(一),设计思想与代码质量优化+程序性能优化+开发效率优化

android 程序员 移动开发

Kotlin 协程和 Android SQLite API 中的线程模型,嵌入式系统工程师面试

android 程序员 移动开发

Kotlin-源码里成吨的-noinline-和-crossinline-是干嘛的?

android 程序员 移动开发

Jetpack 之 LifeCycle 组件使用详解,android开发书籍

android 程序员 移动开发

Kotlin + 协程 + Retrofit ,携程Android面试题

android 程序员 移动开发

Kotlin(1) lambda表达式和高阶函数操作符,android软件开发基础

android 程序员 移动开发

Kotlin学习手记——注解(1),2021年字节跳动74道高级程序员面试

android 程序员 移动开发

Kotlin系列三:空指针检查,万字长文总结Android多进程

android 程序员 移动开发

Kotlin(五)深入理解Kotlin类与接口,androidndk开发视频

android 程序员 移动开发

入选《2021爱分析·区域性银行数字化厂商全景报告》,网易云信助力南京银行打造转型标杆

网易云信

人工智能 金融行业

最新消息!旺链科技加入庙行镇“乐创助企联盟”

旺链科技

区块链 产业区块链

Kotlin-编程核心基石—高阶函数,androidrom定制

android 程序员 移动开发

Kotlin学习手记--泛型、泛型约束、泛型型变,天呐

android 程序员 移动开发

Kotlin的自定义View,实现带弧形的进度条,androidjetpack详解

android 程序员 移动开发

Jetpack-在数据变化时如何优雅更新Views数据,ffmpeg音视频开发实战6下载

android 程序员 移动开发

Jetpack组件---ViewModel 概览,android高级面试2020

android 程序员 移动开发

Kotlin写一个解释器(2)---语法分析,安卓项目开发范例大全

android 程序员 移动开发

Kotlin协程它不香吗?,kotlin开发游戏

android 程序员 移动开发

lambda表达式(3)-shawn,挑战大厂重燃激情

android 程序员 移动开发

LeakCanary源码学习二:LeakCanary,sw实战营文件下载

android 程序员 移动开发

博睿数据“智能体验运营,释放商业潜能”催化剂项目获TM Forum创新方案最佳实施奖

博睿数据

Kotlin 的协程用力瞥一眼,大厂架构师经验分享

android 程序员 移动开发

Kotlin下的5种单例模式,一招教你看懂Netty

android 程序员 移动开发

Kotlin学习手记——注解,flutter下拉加载

android 程序员 移动开发

Jetpact Compose状态管理简单理解,android设计模式的应用场景

android 程序员 移动开发

贝壳Flutter瘦身实践

贝壳大前端技术团队

flutter 瘦身 for web

Jetpack Compose和View的互操作性,这个回答让我错失offer

android 程序员 移动开发

Kotlin 插件的落幕,ViewBinding 的崛起,音视频开发工程师

android 程序员 移动开发

Kotlin-新版来了,支持跨平台!,android热修复实现

android 程序员 移动开发

LeakCanary源码分析以及ContentProvider的优化方案,android移动开发

android 程序员 移动开发

阅读者(五):测试驱动开发的艺术_Java_胡键_InfoQ精选文章