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

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

我们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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

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

在vue项目中使用单元测试

目前笔者负责的项目迭代十分频繁,前端需要处理业务逻辑日益增多,除了考虑如何保证开发速度之外,还必须考虑系统的稳定性,因此决定在项目引入单元测试。

针对web系统的常用测试方法

针对web系统的常用测试方法如下:页面链接检查、相关性检查、检查按钮的功能是否正确、字符串长度检查、字符类型检查、特殊字符检查

不用写代码,也能做好接口测试

本文你将了解到:1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试;2、接口测试用例设计,3、怎样不用写代码,也能快速的根据开发的API文档完成接口自动化测试脚本

Macaca自动化测试解决方案

Macaca 是一套面向用户端软件的测试解决方案,提供了自动化驱动,环境配套,周边工具,集成方案,旨在解决终端上的测试、自动化、性能等方面的问题。以及两大平台的混合运行时 Webview,也支持以往的桌面端浏览器。

Vuex 之单元测试[译]

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

Vue单元测试

单元测试,就是为了测试某一个类或者是某一个方法能否正常工作而写的测试代码。单元测试是针对 程序的最小单元 来进行正确性检验的测试工作。就是测试某一个页面或者是某一个方法来进行测试的代码单元。

Node.JS中回调嵌套和async/await执行空函数性能效率对比测试

asyn/await关键字可以让原来的回调嵌套和链式写法,改造成同步语法。util.promisify可以很方便地将回调函数Promise化,那么Promise函数的async/await执行和回调函数的嵌套执行或链式执行在性能上有差异吗?

在 Angular 中引入 Jest 进行单元测试

整体测试跑起来的时候难以定位测试出错的定位,怎么办呢,那就让跑整个测试的时候各个文件之间也没有依赖可以单独跑好了,所以就想到了 Jest。实践证明,在 Angular 中, Jest 大法也非常好使。

10 款最佳移动 App 安全测试工具

移动互联网时代,我们的生活和工作深受 App 影响。伴随移动 App 的广泛应用,App 安全日益重要。本文介绍了 App 开发所需的安全测试工具。TOP 10 移动 App 安全测试工具列表

API测试工具

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

点击更多...

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