【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

开放原子开发者大会——操作系统大会2023成功举办

开放原子开源基金会

开源

软件测试/测试开发丨常见测试框架类型TDD、DDT、BDD、ATDD

测试人

软件测试 自动化测试 测试开发

上海三思立体育苗系统Vertical X打造“不见光”人工农场

电子信息发烧客

直播预告|国产化软硬件升级替换之路:可观测性建设之路

博睿数据

降人工简流程,人工智能助力企业打赢人力成本战

用友BIP

降本增效

商业&技术双轮驱动,企业数智化运营新力量

用友BIP

数智营销

重磅发布|2023年度中国可观测性现状调研报告发布

博睿数据

保姆级·从零搭建开发一个现代化体育赛事直播系统平台

软件开发-梦幻运营部

如何应对 RocketMQ 消息堆积

高端章鱼哥

RocketMQ 消息堆积处理

隧道LED照明技术见证大国交通发展,三思陶瓷散热技术强势突围

电子信息发烧客

来自前端面试官的吐槽:问CSS、DOM,还招不招人?KPI还要不要?

程序员改bug

编程 程序员 前端 前端面试 前端工程师

海外云手机-如何高效运营多个海外社媒账户?

Ogcloud

社交媒体 社媒

广告精准投放人群的实现:千万用户过滤指定人群

xfgg

Java

蓝戟英特尔锐炫A770评测:多款热门游戏性能提升,XeSS取得丰硕成果

E科讯

前端开发新趋势:Web3 与虚拟现实的技术融合

EquatorCoco

前端 Web 虚拟现实 web前端开发

lazada商品列表数据接口方法(lazada.item_search)

tbapi

lazada商品详情数据接口 lazada商品数据接口 lazada商品API接口 lazada API接口

直播预告 | 大模型时代,“应用变了”:政务办公,如何从大模型中巧借力?

京东科技开发者

直播 办公 政务 大模型

EndNote 21 for Mac(文献管理软件) v21.2永久激活版

mac

苹果mac Windows软件 EndNoter 参考文献管理软件

Databend 开源社区上榜 2023 年度 OSCHINA 优秀开源技术团队

Databend

网络安全 :保护数字世界的壁垒

快乐非自愿限量之名

网络安全 Web 数字世界

事务的实现方法:事务注解和编程式事务

xfgg

Java

PAM:完善的第三方应用

尚思卓越

网络安全

软件测试/测试开发丨分层测试体系、单元、UI 、接口、白盒测试

测试人

软件测试 测试开发

缓存:系统设计中至关重要的一环

互联网工科生

数据库 缓存 缓存技术

探索光伏单晶行业成本管理之业务场景分析

用友BIP

成本管理 光伏单晶行业

不黑不吹,低代码开发真的好用吗?

伤感汤姆布利柏

低代码 JNPF

Inscribe:应用非定向资产交易协议 布局巨大铭文赛道

威廉META

文档理解的新时代:LayOutLM模型的全方位解读

快乐非自愿限量之名

人工智能 机器学习 深度学习 大数据

中国自动驾驶行业:迈向无限可能

不在线第一只蜗牛

人工智能 自动驾驶 智能汽车

PON网络是什么?

小齐写代码

WhatsApp封号的原因以及如何避免?试试海外云手机!

Ogcloud

云计算 外贸管理 whatsapp

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