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

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

我们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性能仍然略胜一筹(依据是我的快速测试)

来源: 原文链接

利用chrome_remote_interface实现程序化、自动化Web安全测试

如果要问有哪些抓包神器或者流量分析工具?以下几款工具是必须要提的,burpsuite(跨平台)、fiddler(windows下抓包神器)、wireshark(经典网络抓包工具)、justniffer

Js中for、for...of 、for...in 等 iteration 效率测试

由于不同浏览器,不同版本性能不一,且控制台本质是是套用了一大堆eval,沙盒化程度高,所以需使用node环境测试来提高准确性

js断言测试

断言一词来自逻辑学,在逻辑学中,断言是断定一个特定前提为真的陈述,在软件测试中也是类似的含义。测试中断言语句的一般形式为assert 表达式,其中的表达式就是逻辑学中的陈述

vue-cli3 配置开发-测试环境

首先介绍一下本项目的背景,是基于 vue-cli3.1.1 的单页应用,目前测试环境和生产环境都在线上,并且都在同一个域名下,其中生产环境部署在根目录下,测试环境部署在名为 test 的子目录下,根据生产环境和测试环境的不同

使用Fiddler进行Web接口测试

抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark。为什么使用fiddler?原因如下:

web测试流程及注意事项

界面对不懂技术的客户来说那相当关键,慢慢体会就会明白的。Web界面设计中,对各种元素(如按钮、单选框、复选框、列表框、超连接、输入框等等)的设计是非常重要的。

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

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

node.js 断言的使用

assert模块提供了一组简单的断言测试,分严格模式(strict)和遗留模式(legacy),严格模式下,对比的方式比较严格,但在遗留模式下是可以通过的。官方推荐使用严格模式, 所以本文基于strict模式下学习。

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

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

webdriver定位元素

在UI层面的自动化测试开发中,元素的定位与操作是基础。webdriver提供了很多种定位方法,以下总结了6种:万能法:find_element_by_xpath()、id定位:find_element_by_id(\"id\"),id属性是唯一的、class定位

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

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

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