BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 James Chesters 关注 2 他的粉丝 ,译者 李彬 关注 1 他的粉丝 发布于 2014年4月24日. 估计阅读时间: 12 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT