问题:TDD、BDD、验收测试驱动开发(ATDD),测试优先等等这些,对不同的人都意味着不同的东西,也容易让人搞浑。我们是否需要一种通用的语言,用以描述我们的软件开发方法并培养一种可达成共识的内容驱动的好实践呢?

  JB:不,我不这样认为。我想对每个实践,我们都有足够多的术语来描述。我发现,当我停止担心如何去定义它们、去分享我是如何理解、并鼓励人们分享他们的理解的时候,反而会有意想不到的收获。我还记得,我有影响力的一次关于TDD和BDD的定义、意义和目的的讨论,发生在临晨4点半的一家旅馆的房间里。那次讨论,我言辞激励地与人争论Dan North和Chris Matts。如果我们只是推动大家在社区网站上发布某些定义集,而抵制形式上更生动的、有点疯狂的、激烈的辩论,这将是非常遗憾的事情。

  Dan:这只是我们对这块领域发展的理解的一个征兆。我起初建议把BDD用作辅助传授TDD的目的。我喜欢Gojko Adzic的名言“将规格说明书实例化”,只因它很清晰,没有歧义。很长一段时间中,我在“测试”、“实例”和“规格说明书”这些专用词汇中挣扎,我无法做出我的选择。有个短语“通用语言”本身是有误导。“通用”指的是在边界之内的世界。换句话说,我们依据内容对同样的事物做出不同的描述。某人的测试是另一个实例,也是另一个规格说明书。这关乎你是否能将你的意图很好地传达到你的内容中。

  Gojko:我尝试用实例来定义规格说明书,将其变得更清晰、有内容边界并把范围缩小,是为了避免TDD、BDD、ATDD或其他概念的混乱。我认为这个命名对实践的探索很有意义;对我们从业务角度确定要开发的系统并运用实例和搭建在线文档作为支持,也很有意义。某些建议和实践对此是有用的,有别于当我们用技术测试来驱动设计时所用的那些实践与建议,他们有自身的价值。

  我不喜欢ATDD或验收TDD这个命名,因为这给人们一种错误的印象,让大家觉得是因为关注在错误的事情上所以才造成失败。我希望人们不要这样思考,但不幸的是近期出版的书籍已经使用了这个名称。

  我理解的BDD是,包括了很多不仅仅是规格的实例,并以单元测试驱动技术设计。例如,我考虑特征注入(Feature Injection)、拉动需求、外围设计、定义商业价值的模式以及诸如此类的BDD事件。这些才是Liz Keogh所做的激动人心的事情。当然,除了这些实例化的规格说明书或单元测试,还是有很多其他事情可以做。例如,效果映射(Effect Mapping)是又一项令人激动的、全新的计划与路演的技术。这与整个BDD的系统价值完美地符合,将测试驱动拔高到业务对象的层面,并对任何形式的自动化都没有关联,也无需去做。

  Ron:好吧,我认为这是人类沟通的方式。这个世界上并不存在一种每个人听到都能理解的、清晰的语言。在我们边学边成长的商业世界,差异是不可避免的。在我眼中,重要的差异是人们花很少或不花力气去理解这是些什么东西。相反,他们要么没有理解开始诋毁这些建议;要么是没有真正地去运用这些建议或没有理解地去运用这些建议,只是宣称他们在做这些。

  这样做有两个严重的后果:第一,许多项目和个人不去做他们可以做的。这将导致人员对工作的不满、失败的项目以及糟糕的结果。第二,误解通常会减缓大家对这些好建议的运用。

  Steve:当我们拥有完美的准则时,能把它归纳成术语 我认为现在讨论什么技术该运用在什么地方还为时过早。我还认为不同的“领域“该有更宽泛的范围,用来获知他们的不同,但不至于弄个底朝天。

  问题:关于这些主题有什么后寄语?

  JB:没什么特别的。多多地实践那些技术吧,因为你希望它们能指导你改进工作。去做吧,因为这能给你“个人成功”。去做吧,只因它能帮助你更好地享受你的工作。总之,无论什么原因,去做吧!

  Dan:我在这里讲的每个主题,今后我将分享更多我的感受。

  Ron:尽管我会在项目中运用其他方法,但在半个世纪里,我所用的所有方法中,这些是我见过好的方法,虽然我不会强迫每个人都去使用。

  然而,我将做的是,我会建议关心这方面专业的每个人都能学习如何去运用这些技术……到一个“很好的程度”,然后拥有能够决定何时、何处使用它们的能力。在能够对某种技术进行客观的评测前,你不该去回避这种技术。

  因此我将要做的是,展示给大家我所要做的软件开发,让大家放心、大胆地去尝试这些技术。并且能够让人们对此类技术有较好的口碑,愿意花足够长的时间去做出一个好的决定。

  对我而言,好的决定是指能够在正确的时间正确地使用这些实践。我希望大家能发现这些技术的价值,并从中获益。

  Steve:较常见的是,我所看到的关于TDD的主要问题,都不是测试难题,而是基本设计技巧的缺憾;人们之所以对测试比较纠结,是因为代码有着错误的结构。类似地,我看到过代码不能表现清楚。我越来越觉得,程序员的面试应该包括一个测试预选者编写一段可读性强的段落的测验。