Julien Biezemans 访谈:在 JavaScript 中使用 Cucumber.js 进行行为驱动开发

  • James Chesters
  • 李彬

2014 年 4 月 22 日

话题:JavaScript语言 & 开发

Julien Biezemans 是 Cucumber 核心团队的成员以及Cucumber.js的作者,本文将针对 Cucumber.js 与其进行对话。

Cucumber.js 是 Cucumber 的一份 JavaScript 原生实现,作为一份严格模式 (Strict,Javascript 中的一种限制性更强的变种方式) 的移植版本,它可以运行在任何 JavaScript 环境中。

Cucumber.js 能够同时基于 Node.js 或在浏览器内运行,因此基本上它适用于任何能够产出 JavaScript 和 HTML 的语言 / 环境(Node.sj、Ruby on Rails、PHP、.NET 等等)。

InfoQ:Cucumber.js 是什么?开发者为何要关注它,它解决了哪些问题?

Biezemans:Cucumber.js 是著名的行为驱动开发(BDD)工具 Cucumber 的 JavaScript 版本。Cucumber 最初由Aslak Hellesøy使用 Ruby 编写,而现在已经有许多不同的实现版本,包括 Ruby、JVM、.NET、PHP、C++ 等等。

Cucumber 是一套自动化工具,能够将使用人类语言(如英语、法语)编写的(主要是关于软件开发的)规范,转换为一些计算机能够理解的代码,例如 JavaScript、Ruby 或 Java。接下来,这些转换后的代码将驱动可以被自动化处理的任何类型的软件。对于 Web 应用自动化来说,这套解决方案已经颇为流行;此外,它也已经被运用到许多其他领域,例如原生移动应用开发、嵌入式系统甚至硬件测试等方面。

行为驱动开发是由 Dan North 基于测试驱动开发而演化出的敏捷方法论。该方法论提倡项目中的每个人之间加强沟通、交流和紧密协作。行为驱动开发的根本目标之一,是在众所周知的业务与技术之间的隔阂上,架起沟通的桥梁——来自这两个不同世界的人们,往往很难良好地理解对方。

对此,使用自然语言撰写情景(或“例子”)的理念,提供了解决这种沟通问题的一个方法。在利益干系人之间进行讨论时,可以基于共享的词汇表,撰写这些自然语言撰写的规范,并将其作为参考。这些规范还将被用来驱动系统的实际开发:开发者们会在实现规范描绘的系统特性前,把这些规范自动化——它们将切实成为能够驱动编码进程的测试。而最终,在长期使用中,它们将同时被当作“活文档”和回归测试。

InfoQ:能否请你为我们介绍一些 Cucumber.js 的使用场景?

Biezemans:类似于大多数 Cucumber 分支,Cucumber.js 最显而易见的用途是 Web 自动化。它基于 Node.js 栈编写,但是可以在任何 JavaScript 环境中运行(考虑一下浏览器!)。这正是 Cucumber.js 与其他实现相比,比较有趣的地方:它适用的环境非常广泛。今天,在某种意义上 JavaScript 已经成为一门无处不在的语言,毫无疑问,它可以在所有浏览器中运行。而现在,感谢 Node.js 和 JVM,它的身影也出现在了服务器端。我知道有许多团队正在自动化 Web 应用——这些应用的构建中运用了许多不同的技术,例如 Node.js、Angular.js、Backbone、PHP、Java、Ruby/Rails 等等。

Cucumber.js 还有其他一些有趣的用途。借助于 Node.js,它与网络资源(例如 HTTP)的互动非常高效和顺畅。因此,使用 Cucumber.js 结合某些网络感知断言库(后端并非必须有 JavaScript 支持)测试 HTTP API 是一种很容易也很常见的做法。对此,我必须声明一个事实:对于 Web、HTTP、网络或 CLI,Cucumber 并非全知全能。它的作用是将自然语言编写的规范转换为可运行的计算机代码。至于开发者想把这些代码与什么东西关联起来,则与 Cucumber 无关。

Cucumber.js 还可以用于命令行应用的自动化(例如 Cucumber.js 有针对自身的测试套件,运行于命令行环境中)。

InfoQ:能否介绍一些问题,特别适合使用某一套工具去解决它们,而其他工具则不那么合适?什么情况下开发者会选择 Cucumber.js,什么时候他们最好选择其他工具?

Biezemans:现在市面上有许多 JavaScript 的 TDD/BDD 和其他测试工具,其中有一些非常优秀。Cucumber(ruby)在几年前曾经遇到过一波炒作风潮:每个人都投身其中,把它当作是银弹。然而在很多情况下,添加由 Cucumber 强制带来的额外层(也即用纯自然语言编写的规范)并不是那么有意义。

在当时,开发人员与其他利益干系人之间基本上不存在交流,因此也就并不需要用英语撰写情景——这样做只会给开发者带来阻碍,毫无缘由地增加维护成本。

这一现象在今天依旧存在。众所周知的是,我——作为技术人员——往往会被新兴的、有亮点的工具吸引,但直到我们使用该工具把自己弄得手忙脚乱之后,才会质疑其真正的适用性。对于任何考虑使用 Cucumber 的开发者,我的主要建议是向自己提出以下问题:“团队(任何人,不止是技术人员)是否能够从完全使用英语撰写情景中获益?这么做是否有可能帮助一些人更好地理解事物、更有效地沟通?”如果答案是肯定的,那么或许对当前的工作而言,Cucumber 是适用的工具。

不过,请不要误解,我并不是否定尝试它。我也见过一些成功的团队只针对“事物的技术部分” 使用 Cucumber。我想,其原因可能是因为这些情景帮助人们脱离开技术问题,从他们正在构建的系统的功能和表现的角度,来更深入地考虑自己的预期。

InfoQ:为我们讲讲 Cucumber.js 社区吧。你是否吸纳社区志愿者做出的贡献,InfoQ 读者是否也可以加入此行列?

Biezemans:Cucumber.js 从诞生至今已经差不多三岁了,在此期间社区一直伴随着它在成长。目前它还属于小型社区,与 Node.js 社区所遇到的境地有些类似:来自截然不同地方的人们正在加入其中。无处不在的 JavaScript,让许多开发者和测试者从不同社区走到这里。我认为这将极大增进社区的价值,因为我们将有机会分享相似问题的不同经验和理念,将见到与我们习惯使用的方式截然不同的解决之道。多样性是件好事儿。

同时,反过来也一样,JavaScript 也是一个非常好的媒介,来向那些从未联系在一起的社区,传播我们认为行之有效的准则和实践(例如 BDD!)

在社区中现在有常态化的贡献,以及一些大力提供支持的参与者。我们目前正在将所有的 Cucumber “子社区”整合在一起。这其实也正是今年CukeUp!大会的主题:一个欢快的 BDD 大家庭。我们力图避免社区碎片化(分裂成许多针对特定主题的子社区),这也正是为何现在只有一套 Cucumber 邮件列表。另外,在一些流行的 IDE(例如 Jetbrains Webstorm 8 和 Visual Studio)中,现在也增加了对 Cucumber.js 的支持。我认为对该工具的采用与推广来说,这是个良好的信号。

任何希望对 Cucumber.js 做出贡献的人可以访问Cucumber.js 的 GitHub 库,检出有待解决的问题,并且通过“pull request”申请代码合并。

InfoQ:当前正在进行的工作中,有哪些内容会体现在下一个主要版本中(版本号是否会冠以 0.4.4?),它会在什么时间发布?

Biezemans:Cucumber.js 需要拥有一套插件系统。现在就可以将结果格式化器和其他监听者关联到 Cucumber.js 上,但这么做有两个缺点:

  1. 必须处理某些内部对象;
  2. 当从终端调用 Cucumber.js 的时候,CLI 参数(parameter)解析器不够灵活,无法支持用户指定与插件相关的选项(option)

开发插件系统的目标,是让 Cucumber.js 更加模块化,让开发者们能够像使用 NPM 和 Bower 那样向代码库发布简单插件。我们或许会在 0.5 版本中引入一套插件 API,而且我们几乎肯定会基于该 API 增加对 Cucumber Pro(我们在 Cucumber 有限公司正在开发的协作平台)的支持。

另外,最近可能引入将一套用于并行运行的有趣代码。

我很愿意重新审视我们用在 Web 上的打包系统。像我之前说的那样,Cucumber.js 基于 Node.js 构建,因此要让它在浏览器中运行,就必须进行捆绑。目前实现这部分功能的代码相当晦涩——它基于 Browserify 的古旧版本,而且未经测试。

此外,就像任何其他项目一样,Cucumber.js 还存在一些问题——其中大部分与 JavaScript 回调和钩子有关——必须得以修正。

InfoQ:Cucumber.js 的长期计划是什么?

Biezemans:当我们找到更好的 Web 打包系统后,我希望能够让 Cucumber.js 面向仅浏览器的情景时更加轻松。现在它确实已经可以在浏览器中运行,但使用方法并不直观,因此这是件非常遗憾的事情。对此,我认为随着诸如 Angular.js 和 Ember.js 这样的框架的兴起,这方面将存在着一个完整的“市场”。

除此之外,之前还提到过,文档也应该得到完善。文档应该能对读者特别是新手提供帮助,应该增加更多的例子、教程,并展示如何在不同环境中使用 Cucumber.js。

另外,与其他 Cucumber 分支相比,Cucumber.js 现在还缺少一些辅助特性(详情请阅读开发状态表中的README文档)。在 1.0 版本发布前我们将会实现全部这些特性。

InfoQ:除了 Cucumber.js 方面的工作,以及一般性的 BDD 领域,能否为我们讲讲你还感兴趣哪些事情?

Biezemans:我对 SOA、事件来源(event sourcing)和领域驱动设计都很感兴趣。迄今为止我已经投入数年时间,来基于这些概念和模式构建系统。我还开源发布了一套名为Plutonium的实验性的 Node.js 库,用于领域驱动设计 / 事件来源——而且预计我会在未来对它投入更多关注。

个人来说我还希望成为一位设计师(并且正在努力!)。

在计算机之外,我非常乐于将时间花在家庭生活上。我的孩子们是我的快乐和探索的源泉。我一般会学习科学,特别是物理里和和天文感兴趣。另外,我的生命中也需要充满音乐,不过上次我亲手玩吉他已经是很久以前的事情了。

查看英文原文:Cucumber.js for BDD in JavaScript: An Interview with Julien Biezemans

JavaScript语言 & 开发