前端单元测试框架梳理

栏目: 编程工具 · 发布时间: 6年前

内容简介:单元测试的核心就是node内置断言assert,以下图为最简单例子,如果错误会抛出异常

单元测试的核心就是 断言 ,通过断言来判断代码是否达到目的

node内置断言assert,以下图为最简单例子,如果错误会抛出异常

前端单元测试框架梳理

chai 这个断言库很全很强大,提供了常用的assert should expect断言关键字

前端单元测试框架梳理
各类的用法就不提了,方法比较简单,一查便知。 assert最简单,不过目前expect用得比较多,例如 expert(xxx).toBe(xxxx) 但是 egg官网

推荐assert,理由是简单,不用记一些复杂api。

前端单元测试框架梳理
前端单元测试框架梳理

Mocha

Mocha是老牌的库,简单全面易用,目前公司就在用Mocha+chai测试前端数据逻辑,用来测试node,util里面的函数都可以,测试组件需要搭配其他框架。

Mocha测试的钩子 Mocha在describe块之中,提供测试用例的四个钩子:before()、after()、beforeEach()和afterEach()。 可以用before钩子提前把测试环境和数据准备好,beforeEach钩子可以在每个测试用例前准备一个或多个新的对象,防止被前面的用例污染

describe('测试index.js',()=> {
  before(()=>console.info("在本区块的所有测试用例之前执行"))
  after(()=>console.info("在本区块的所有测试用例之后执行"))
  beforeEach(()=>console.info("在本区块的每个测试用例之前执行"))
  afterEach(()=>console.info("在本区块的每个测试用例之后执行"))
  describe('测试addNum函数', ()=> {
    it('两数相加结果为两个数字的和', ()=> {
      assert.equal(addNum(1,2),3)
    })
  })
})
复制代码

最后,Mocha默认每个测试用例最多执行2000毫秒,如果到时没有得到结果,就报错, 而且Mocha默认会高亮显示超过75毫秒的测试用例,可修改

sinon

sinon具有非常有特色的spies, stub, mock三个功能,有兴趣的可以尝试手写实现。

  • spies的概念

spies => 间谍函数,间谍函数是Sinon最简单的部分,其它的功能都是建立在spies之上的,spies的主要用途是收集有关函数调用的信息,例如是否调用了函数等。spies的实现监听的基础上是不会影响函数本身正常调用(被监听的函数的上下文关系不会被影响)。

  • stub的概念

stub完全取代了这个函数,而且拥有spies的所有功能。当使用stub时,函数将不具有原始的功能,而是替换后的函数。

  • mock的概念

mock与stub的功能一样都是用来替换指定的函数,如果你想替换掉一个对象中的多个方法,这时mock就可以发挥作用了,但是如果仅仅是替换对象中的一个函数,那么stub更加简单易用,当我们使用mock的时候应该十分小心,因为大量的替换原有代码逻辑,会导致test变的脆弱。

nock或者moxios

用来模拟发送网络请求,需要替代后台接口时使用。

Karma

非jsdom,提供真实浏览器环境,由于目前各类框架已经比较完善了,现在已经基本被排除在主流框架之外

redux-mock-store

顾名思义,用于模拟 redux 中的 store。由于工作中一直用mobx,这里不多做介绍了

jasmine

使用与jest类似,以前通常和karma配合,大而全的测试框架(jest)成为主流后,用的少了

jest

jest 是facebook推出的一款测试框架,集成了 Mocha,chai,jsdom,sinon 等功能。所以刚入门的同学如果想应用直接可以上jest。

react官方脚手架自带jest,vue-cli3.0中也集成了单元测试框架,选择的时候会问你选mocha+chai还是jest。

  • 运行命令 jest 后会自动运行项目下所有.test.js和.spec.js这种格式的文件。jest的配置默认只要在package.json中配置即可,如只测test文件夹下test.jsx文件
"jest": {
    "testRegex": "/test/*.test.jsx?$"
 }
复制代码
  • 集成expect断言

  • 异步处理 对于callback采用done()确保完成测试,对于promise自动处理,遇到reject自动抛出错误,async+await同理

  • Jest 中的 mock , 类似于sinon的 sinon,并且还可以模拟axios的网络请求

  • 快照snapshot 对组件或者数据生成一份快照,每次测试自动深比较,不一致就报错

  • 可以生成测试覆盖率报告,只需要在jest命令后加入 --coverage即可

jest --coverage
复制代码

enzyme && test-utils

airbnb公司推出的 enzyme ,专门用来测试react组件,相对应 vue 中也有test-utils包,基本是一样的功能,也是对组件挂载后进行事件触发、元素存在等判断。

这里以enzyme为例讲解,enzyme主要提供三种渲染方式: render、mount、shallow ,存在以下区别:

render渲染结果是普通的html结构,shallow和mount对组件的渲染结果是react树,如果你用过chrome的react devtool插件,他的渲染结果就是react devtool tab下查看的组件结构。

shallow和mount的返回结果是个被封装的ReactWrapper,可以进行多种类似JQ的链式操作,譬如find()、parents()、children()等选择器进行元素查找;state()、props()进行数据查找,setState()、setprops()操作数据;simulate()模拟事件触发。

shallow只渲染当前组件,只对当前组件做断言,不会产生子组件;mount会渲染当前组件以及所有子组件,对所有子组件也可以做上述操作。一般交互测试都会关心到子组件,我使用的都是mount。但是mount耗时更长,内存啥的也都占用的更多,如果没必要操作和断言子组件,一般使用shallow。

总结

单元测试属于需要投入,但是看不见产出的工作,所以直接选择最简洁的框架,节约时间,才是提升kpi的关键,现在的框架越来越趋向简单和人性化,所以如果工作中使用,直接选jest类集成框架就好。

我在的toB传统软件服务公司,前端的稳定性更加重要,在一个产品快速迭代期后,单元测试也会逐步进行覆盖util模块和model层(响应action的数据变化处理),其它则需要看迭代排期,经常重构的基础公共组件也会排上。每个公司需求不同,如果是上线就撤的项目,可以不用部署测试。考虑引进单元测试前,请灵活考虑成本和收益


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Flash ActionScript 3.0从入门到精通

Flash ActionScript 3.0从入门到精通

章精设、胡登涛 / 清华大学出版社 / 2008-10-1 / 69.00元

Flash ActionScript 3.0的出现,不仅从形式上改变了ActionScript,而且从本质上改变了ActionScript,使ActionScript 3.0成为了真正的面向对象编程语言。 本书从最简单的编程知识出发,带领读者走进编程的大门,是一本不可多得的ActionScript 3.0入门书。本书在注重基础的同时,从更高的层次来介绍ActionScript 3.0的面向对......一起来看看 《Flash ActionScript 3.0从入门到精通》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具