写点什么

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

  • 2014-04-22
  • 本文字数:3717 字

    阅读完需:约 12 分钟

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

2014-04-22 23:012769
用户头像

发布了 256 篇内容, 共 67.9 次阅读, 收获喜欢 10 次。

关注

评论

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

JavaScript 简介

InfoQ_34a83d636158

够开放吗?来,和一群开发者搞事情!

易观大数据

架构师训练营 week13

devfan

物联网为什么需要5G?

华为云开发者联盟

5G 物联网

微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!

刘早起😶

Python

JavaScript中的原型到底该如何理解?

Walker

Java 大前端 面向对象编程 原型

常用数据分析指标

纯纯

大数据解答(二)

dony.zhang

数据分析

第十三周作业

Linuxer

Centos7 IP、名字、防火墙配置

yuanhang

centos7 防火墙 静态IP

【架构师训练营】第 13周作业

花生无翼

淘宝服务端高并发分布式架构演进之路

简爱W

Java java架构师

Linux Shell编程

yuanhang

Shell

架构师训练营-第十二周作业

Geek_a327d3

搜索引擎如何推荐网页

dongge

week13 总结

雪涛公子

架构师训练营-第十一周作业

Geek_a327d3

架构师课程第十三周总结

dongge

区块链赋能数字经济,为知识和版权确权定价

CECBC

区块链 知识产权 数字经济

详解 Python 的二元算术运算,为什么说减法只是语法糖?

Python猫

Python 编程 翻译

你所在的行业,常用的数据分析指标有哪些?

李朋

架构师训练营 week13 - 学习总结

devfan

初露锋芒的AI战斗机,打开AI军备竞赛的潘多拉盒子

脑极体

大数据2学习总结

周冬辉

云栖大会倒计时8天,新一代CDN的技术突破和应用实践专场有什么看点?

阿里云Edge Plus

CDN CDN加速

架构师训练营第十三周作业

叮叮董董

捡到宝啦!阿里内部人手一本的Springboot进阶手册,先学为敬

Java架构师迁哥

北京或先行落地央行数字货币 人民币3.0时代将来临

CECBC

数字货币 银行 人民币

为什么说区块链是制造信任的机器?

CECBC

区块链 不可篡改

CommonMistakes

卓丁

打破Scrum的五个误区(译)

Bruce Talk

Scrum 敏捷开发 Agile

Julien Biezemans访谈:在JavaScript中使用Cucumber.js进行行为驱动开发_JavaScript_James Chesters_InfoQ精选文章