写点什么

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

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

关注

评论

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

用品质提升品味,贾斯特里尼&布鲁克斯葡萄酒

联营汇聚

【大屏设计】数据大屏间距那点事-距离产生美

搞大屏的小北

大屏布局 报表布局 看板布局排版

线上GC故障:CMSGC太频繁,你知道这是什么鬼?

Java永远的神

程序员 性能优化 JVM java面试 GC

MySQL 慢查询日志分析(Filebeat+Elasticsearch+DataEase)

搞大屏的小北

MySQL慢查询 MySQL日志分析 MySQL日志可视化

大数据培训机构怎么选择

小谷哥

破解加密的LastPass数据库

神锁离线版

数据安全 密码 密码管理器 Lastpass 密码安全

自学数据分析——数据分析方法和模型

搞大屏的小北

数据分析方法 自学数据分析

一招搞定小白最头疼的数据大屏配色问题!

搞大屏的小北

色彩匹配 大屏配色

葡萄酒越贵越好?贾斯特里尼&布鲁克斯刷新你的认知

联营汇聚

国内外开源数据可视化工具对比:DataEase 与 MetaBase 对比

搞大屏的小北

DataEase Metabase 开源数据可视化

自学数据分析——重新认识数据分析

搞大屏的小北

数据分析 数据分析可视化

自学web前端开发能找到好工作吗?

小谷哥

玩转OpenHarmony智能家居:如何实现树莓派“碰一碰”设备控制

OpenHarmony开发者

OpenHarmony

微信开放小程序运行SDK,自己的app也能运行小程序

Onegun

微信小程序 小程序容器

实践GoF的23种设计模式:命令模式

华为云开发者联盟

Go 开发 华为云 12 月 PK 榜

中美顶级AI首次对话 送给人类的忠告引发关注

硬科技星球

端到端流程打通企业经脉

元年技术洞察

数字化转型 流程 趋势研究 PaaS平台 方舟平台

美团餐饮SaaS基于StarRocks构建商家数据中台的探索

StarRocks

数据分析 零售

web前端培训班怎么学习?

小谷哥

【年度评选】让我们为即将过去的 2022 划上圆满的句号

InfoQ写作社区官方

热门活动

YonBuilder开发之后端函数

YonBuilder低代码开发平台

后端 数据 开发 扩展 软件研发

华为应用市场公布2022年度榜单 原子化服务、车载应用首次上榜

最新动态

选择大数据培训学习技术之前有哪些准备

小谷哥

使用DataEase分析销售数据有多方便?

搞大屏的小北

数据可视化 销售数据分析 数据展示

MySQL进阶:Innodb的RR到底有没有解决幻读?

程序员小毕

MySQL 数据库 程序员 后端 java面试

论文复现丨基于ModelArts实现Text2SQL

华为云开发者联盟

人工智能 华为云 12 月 PK 榜

InfoQ 写作社区 2022 年度优质企业号评选正式开启!

InfoQ写作社区官方

热门活动

让数据说话-中国农业经济发展情况

搞大屏的小北

数据可视化 经济可视化 经济发展

分布式系统关键路径延迟分析实践

百度Geek说

12 月 PK 榜 延时分析 关键路径 大型分布式系统延时优化

跨越速运运单分析系统入选2022中国数据智能最佳实践案例

StarRocks

数据分析 物流

隐私集合求交(PSI)协议研究综述

京东科技开发者

安全 密码学 安全多方计算 隐私集合求交 不经意传输

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