速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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:012892
用户头像

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

关注

评论

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

如何构建高效可信的持续交付能力,华为云有绝活!

华为云开发者联盟

软件 DevOps 持续交付 华为云

Spring 源码学习 15:finishBeanFactoryInitialization(重点)

程序员小航

spring 源码

产品经理训练营-第一章作业

泡面加煎蛋

个人选择理财产品有哪些好方法

v16629866266

这样提问,大牛才会为你解答(提问的智慧)

yes

一字一句的让你彻底掌握JavaScript中的回调函数

华为云开发者联盟

JavaScript 大前端 同步 回调函数

Soul学习笔记---运行 soul-examples-http(二)

fightingting

Soul网关

IO系列专题分享 - 概览

公众号:程序猿成神之路

io

开发实战:Float如何保留2位小数

worry

《原神》运维自动化的探索与实践

OpsMind

运维 运维自动化

作业-week1

赝品

第一次作业提交

涅米丶

干货丨深度迁移学习方法的基本思路

博文视点Broadview

经验说丨华为云视频Cloud Native架构下实践

华为云开发者联盟

架构 微服务 华为云 CloudNative

Soul 学习笔记---soul 数据同步的浅显分析(四)

fightingting

Soul网关

产品0期-第一周作业

曾烧麦

产品训练营

场外OTC交易APP系统软件开发

系统开发

开发实战:LocalDateTime转RFC3339格式

worry

一种分表平滑扩容方案

非著名架构师

当前岗位的理想岗位模型

白生

AI无人机出手,让输电线路巡检更“聪明”!

华为云开发者联盟

华为云 modelarts 视觉处理

产品经理训练营-第一周作业

羽室

【并发编程】- 内存模型篇

双木之林

并发编程

6道tomcat面试题,最后两道难倒我了

田维常

面试

产品经理训练营第一周作业

Empty

产品经理训练营 极客大学产品经理训练营

Java 程序经验小结:消除GC触及不到的过期对象引用

后台技术汇

28天写作

4K高清视频下载(4K视频素材下载)图文教程

科技猫

下载器 4k高清视频下载 4k视频素材下载 8k视频下载 高清视频下载

雪天专注行路思考一则

石君

冥想 28天写作

产品经理训练营 学习起点

DB

量化交易自动炒币软件开发系统

产品经理训练营

纳豆卡玛

求职 岗位要求 职能描述

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