(一)Jest测试入门
Jest的官网地址:https://jestjs.io/en/
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 Guzman在2017年React大会上录制的演讲:
多重项目运行功能
目前我们设置了四个部分,每个部分都在不同的配置下运行测试。我们这么做是想能够同时运行整合测试与单元测试。单元测试需要接触位于服务器上、在浏览器中执行的代码,还要对一些测试辅助函数本身进行验证。Jest团队最近引进了一个方法能够同时运行多个项目,这将极大地简化监控模式和IDE整合。我还没能找到方法来把这个功能应用到我们的代码基上,但看起来很有前景。对于Node.js 、Vue、Angular、Rect、Label等项目都可以使用
小结
Jest的未来看起来非常令人激动!看到Jest推陈出新如此快速,我感觉它将很快成为整个React生态系统中大部分项目的首选工具。
前端交流群:扫码加入