测试工具比较:选Jest,不选Mocha

时间: 2017-11-27阅读: 7352标签: 测试

我们Automattic公司的WordPress.com是由Calypso项目推动的,而这个项目中所有的测试用的都是Mocha框架。项目中还包括端到端测试,都保存在自己独立的代码库里。这套设定我们已经用了三年多了,我觉得是时候该重新审查一下这个选择。我发现这篇[单元测试工具的比较]文章(https://mo.github.io/2017/06/05/javascript-unit-testing.html)非常有帮助,可以用来评估不同的选择。文中,作者**Martin Olsson**给我们分享了他的结论,我强烈赞同这个结论:

我觉得,要继续使用Javascript,就很难忽视Jest的势头。当然,如果这个编号#2059的问题能修好就太棒了。然后还是要说一下,对不少人来说,Mocha似乎已经够用了。

在这个贴子里,我想突出说明一下这个名叫Jest的测试工具的特色。这些特色使它成为一个很有吸引力的选择。我们有几次简单地内部讨论过Jest,主要集中在快照功能这一独特的测试方法上。在我看来,这个功能只不过是锦上添花,所以我更想讨论一下其它我认为更重要的优点。


Calypso项目的概念验证

我创建了两个合并请求,调查把测试从Mocha迁移到Jest需要花多少功夫。所有验证服务器代码执行的单元测试都要能在Jest里正常运行,要达到这个程度还是相当易的。我又重写了测试文件,用了Jest的API接口,和Mocha进行比较来说明其测试编写方法如何。这些基本层面以外,我甚至都已经可以把Jest和Circle CI持续集成,以及PhpStorm编辑器结合起来了,还有设置代码覆盖率(code coverage)和监控模式(watc也没花多少时间。想要更多细节的话,可以去看这个合并请求,已经快敲定了。

对于客户端运行的测试,我也做了试验。和之前服务器代码相同,多数情况下复制粘贴,再加上一些变动,就足以让测试协助开发了。可惜70

所有550多个通过的测试在Moc一a其中一位行的时间是10秒,但剩下的150多个测试却又花了40秒,这个情况比较有意思。在Jest里,通过的测试20秒,未通过的测试50秒。我觉得就算把mockery模拟模块换成Jest自己的模拟功能,再加上useFakeDom辅助函数和Jest浏览器环境选项,也很难说性能会怎么样,不过个人估计还是会有些提高的。

另外,我们这里还在说几秒几秒,别的公司转到Jest后已经能够将执行时间减少几分钟了,这也是挺有意思的。查一下爱彼迎的个案研究


Jest总述

我第一次听说Jest是在去年,但是Facebook的工程师已经使用了多年。目前它还是由Facebook开发并维护,但外部协助开发也越来越多。

要了解Jest,最好的方法就是听一听其中一位创作者怎么说的。我推荐去看一下由Chris Pojer作的演讲,创建高质量JavaScript工具,录于2017年欧洲JS大会

我们Automattic公司已经在使用Jest了,测试Delphin项目的代码。就是这个项目推动了https://get.blog博客功能,使是用户能注册.blog域名。还有Simplenote for Electron也是使用Jest验证代码的项目。


简化API

Jest既简单又强大,内置支持以下功能:

  • 灵活的配置:比如,可以用文件名通配符来检测测试文件。

  • 测试的事前步骤(Setup)和事后步骤(Teardown),同时也包括测试范围。

  • 匹配表达式(Matchers):能使用期望expect句法来验证不同的内容。

  • 测试异步代码:支持承诺(promise)数据类型和异步等待async / await功能。

  • 模拟函数:可以修改或监查某个函数的行为。

  • 手动模拟:测试代码时可以忽略模块的依存关系。

  • 虚拟计时:帮助控制时间推移。

还有更多的功能,有些我会在下面的部分里更宽泛地谈谈。


性能与隔离

Jest文档里写道:

Jest能运用所有的工作部分,并列运行测试,使性能最大化。终端上的信息经过缓冲,最后与测试结果一起打印出来。沙盒中生成的测试文件,以及自动全局状态在每个测试里都会得到重置,这样就不会出现两个测试冲突的情况。

Mocha用一个进程运行所有的测试,和它比较起来,Jest则完全不同。要在测试之间模拟出隔离效果,我们必须要引入几个测试辅助函数来妥善管理清除工作。这种做法虽然不怎么理想,但99%的情况都可以用,因为测试是按顺序进行的。


沉浸式监控模式

快速互动式监控模式可以监控到哪些测试文件有过改动,只运行与改动过的文件相关的测试,并且由于优化作用,能迅速放出监控信号。设置起来非常简单,而且还有一些别的选项,可以用文件名或测试名来过滤测试。我们用Mocha时也有监控模式,不过没有那么强大,要运行某个特定的测试文件夹或文件,就不得不自己创造解决方法,而这些功能Jest本身就已经提供了,不用花力气。


代码覆盖率

Jest内置有代码覆盖率报告功能,设置起来易如反掌。可以在整个项目范围里收集代码覆盖率信息,包括未经受测试的文件。同样的结果到目前为止我们还未能用Mocha实现过,当然也可能是因为我们没花太多时间尝试。


与IDE的整合

靠命令行和持续集成工具CircelCI上运行的配置文件,我把Jest和PhpStorm整合了起来,只要点击就能浏览并找到指定的测试,也可以只重新执行单个测试。这种事我的同事过去经常问我怎么做,过去也曾把Mocha和IDE整合起来过工作,但引入自主测试文件收集机制之后就无法使用了。


自定义报告整合

要使完善Circle CI整合,只需要一个自定义报告功能。有了Jest,用jest-junit-reporter就可以做到,其用法和Mocha几乎相同。


快照功能

第一次看到Jest快照功能操作时,我对这个概念有了一丝疑虑,因为这个概念不符合测试优先(test-first)方式。不过,第一次听到JSX和Redux时,我也是心情复杂。既然有了那种体会,那一旦用了这个快照功能,相信我也一定会成为它点赞的。最终结果是快照帮助我们确信界面的变化不是无法预测的。以下是Jest文档里对这个功能的描述:

快照测试的目的不是要替换现有的单元测试,而是要使之更有价值,让测试更轻松。在某些情况下,某些功能比如React组件功能,有了快照测试意味着无需再做单元测试,但同样这两者不是非此即彼。

要想更多了解Jest快照功能,可以看一下Rogelio Guzman2017年React大会上录制的演讲:


多重项目运行功能

目前我们设置了四个部分,每个部分都在不同的配置下运行测试。我们这么做是想能够同时运行整合测试与单元测试。单元测试需要接触位于服务器上、在浏览器中执行的代码,还要对一些测试辅助函数本身进行验证。Jest团队最近引进了一个方法能够同时运行多个项目,这将极大地简化监控模式和IDE整合。我还没能找到方法来把这个功能应用到我们的代码基上,但看起来很有前景。


新的测试框架

在Facebook公司,人们也在一直努力想换掉Jasmine框架,改用自己测试框架叫jest-circus。第一批改动已经完成,并进入Jest的软件库了:

用Jasmine,很难做得快点。因为代码基不是属于我们的,所以无论是引入新的功能、修复存在的错误、改变现有的设计还是光调试代码基都很困难。此外,Jasmine的代码基并不是流类型的,这样整合起来就更难了。

这个合并请求的目的是将Jasmine替换另一个框架,能够再现其功能,但同时又能尽量简化一切。

他们还把Jasmin 2.5版进行了分支,归入到了Jest自己的测试运行器中去,Jasmine中很大的几部分都重写了,并在最新的Jest 20版中发布了。


小结

Jest的未来看起来非常令人激动!看到Jest推陈出新如此快速,我感觉它将很快成为整个React生态系统中大部分项目的首选工具。

我建议,应该把测试迁移到Jest上去。要最终决定,以下几点应该考虑:

正面因素:

  • API更简单,样板代码更少。

  • 灵活且容易配置。

  • 测试文件彼此隔离执行。

  • 高级监控模式。

  • 快照支持,测试更容易上手。

  • 代码覆盖率。

负面因素:

  • 多一次迁移活动。

  • Mocha性能仍然略胜一筹(依据是我的快速测试)

来源: 原文链接
吐血推荐

1.站长广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入...

2.休闲娱乐: 直播/交友    优惠券领取   网页游戏   H5游戏

链接: http://www.fly63.com/article/detial/170

Js测试框架

Jest是Facebook团队构建和维护的JavaScript测试框架,基于Jasmine的JavaScript单元测试框架。Jest在2018年接受度非常高,今年在JavaScript社区更是如此,根据Github的数据,目前超过150万个项目在使用Jest

开发中的测试名词解释

Alpha测试是由用户在开发环境下进行的测试,也可以是开发机构内部的用户在模拟实际操作环境下进行的测试,测试环境受开发方控制,用户数量相对较少

API测试工具

越来越多的公司正在向DevOps的方向左转,以实现持续集成和持续部署开发。这意味着我们的反馈需要比以往更快,以便确定我们的应用程序是否准备好交付。这就是API测试如此重要的原因

Appium介绍

appium是一个自动化测试开源工具,支持IOS、Android平台上的原生应用、web应用和混合应用;原生应用:是指使用ios或者android编写的应用,Appium是Node.js写的http服务器,用来创建和控制webDriver的session。

Vuex 之单元测试[译]

通常来说 Vue 组件会在以下方面和 Vuex 发生交互:commit 一个 mutation、dispatch 一个 action、通过 $store.state 或 getters 访问 state

原生js逻辑测试题及答案

屏幕打印2000到3000之间的所有的数。求450到550之间所有奇数的和。找出200以内,既能整除3又能整除5的所有数。页面弹出输入框,只有当用户输入Alice和Bob这两个名字时,才会向用户问好“你好”。

引入 Enzyme 并测试 React 组件

使用 Enzyme 库测试 React。这样可以使你的程序将更加可靠,并且更加容易避免回归。我们在这里用了 Jest,不过 Enzyme 也可以与 Mocha 和 Chai 之类的库一起使用。

神奇的 Promise: 一次异步代码的单元测试

本文适用环境为 NodeJs v12 和 2019 年 11 月 19 日最新版 Chrome。写这篇文章的起因是在写单元测试时,做形如下测试时无法使用 await 将测试代码恰好阻塞到 catch 在 Event Loop 中被调用后的时机

网站建设敏捷开发是如何测试网站?

网站建设的过程是线性的,敏捷的开发方法更有灵活性和适应性,敏捷开发是一个迭代过程,在项目完成之前构建调整功能和需求,这种开发离不开站点的测试。选择专注于网站开发的公司采用敏捷开发方法

模拟 API 调用和模拟 React 组件交互

今天,我们进一步测试 React 组件。它涉及模拟组件交互和模拟 API 调用。你将学到两种方法,开始吧!对于我们的程序来说,从 API 获取一些数据是很常见的。但是它可能由于各种原因而失败,例如 API 被关闭

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全