前端单元测试JEST

1.为什么需要单元测试

正确性:测试可以验证代码的正确性,在上线前做到心里有底

自动化:当然手工也可以测试,通过console可以打印出内部信息,但是这是一次性的事情,下次测试还需要从头来过,效率不能得到保证。通过编写测试用例,可以做到一次编写,多次运行

解释性:测试用例用于测试接口、模块的重要性,那么在测试用例中就会涉及如何使用这些API。其他开发人员如果要使用这些API,那阅读测试用例是一种很好地途径,有时比文档说明更清晰

驱动开发,指导设计:代码被测试的前提是代码本身的可测试性,那么要保证代码的可测试性,就需要在开发中注意API的设计,TDD将测试前移就是起到这么一个作用

保证重构:互联网行业产品迭代速度很快,迭代后必然存在代码重构的过程,那怎么才能保证重构后代码的质量呢?有测试用例做后盾,就可以大胆的进行重构

2.前端相关的单元测试技术

2.1 测试框架

目前,前端的测试框架很多,像QUnit、jasmine、mocha、jest、intern等框架,这些框架各有特点,简单描述下,感兴趣的可以具体研究:

Qunit: 该框架诞生之初是为了jquery的单元测试,后来独立出来不再依赖于jquery本身,但是其身上还是脱离不开jquery的影子

jasmine: Behavior-Drive development(BDD)风格的测试框架,在业内较为流行,功能很全面,自带asssert、mock功能

mocha: node社区大神tj的作品,可以在node和browser端使用,具有很强的灵活性,可以选择自己喜欢的断言库,选择测试结果的report

intern: 看官方介绍该测试框架功能极其全面,似乎囊括了业内跟测试相关的所有功能

3.JEST

来自于facebook出品的通用测试框架

Jest是一个令人愉快的 JavaScript 测试框架,专注于简洁明快。

他适用但不局限于使用以下技术的项目:Babel, TypeScript, Node, React, Angular, Vue

优点:

Jest的目标是在大部分JavaScript项目上实现开箱即用,无需配置。

构建能够轻松追踪大Object的测试。快照可以独立于测试代码,也可以集成进代码行内。

测试程序在自己的进程并行运算以最大限度地提高性能。

从it 到 expect - Jest将整个工具包放在一个地方。好书写,好维护,非常方便。

4.开始使用

4.1.create-react-app 3.3.0以上版本

项目中已经集成了test框架,所以无需自己安装,直接使用即可:

testing library介绍:

你想为你的反应组件编写可维护的测试。作为这个目标的一部分,您希望您的测试避免包含组件的实现细节,而是专注于使您的测试为您提供它们所期望的信心。作为其中的一部分,您希望您的测试基础在长期运行中能够维护,这样您的组件的重构(对实现的更改而不是功能的更改)就不会破坏您的测试,从而减慢您和您的团队的速度。

测试越像你的软件的使用方式,他们就能给你更多的信心

这个库提供的实用程序可以像用户那样方便地查询 dom。通过标签文本查找表单元素(就像用户一样) ,从文本中查找链接和按钮(就像用户一样)。它还提供了一种推荐的方法,通过 data-tested 找到元素,作为一种“逃生出口” ,用于那些文本内容和标签没有意义或不实用的元素。这个库鼓励应用程序更易于访问,并允许您让测试更接近于用户使用组件的方式,这使您的测试能够给您更多信心,让您相信当真正的用户使用它时,您的应用程序将正常工作。虽然你可以使用酶本身来遵循这些指导方针,但是执行起来更加困难,因为酶提供了所有额外的实用工具(实用工具可以方便测试实现细节)。在常见问题解答中了解更多。

4.2.编写

create-react-app默认上述几种文件后缀的都为测试文件,创建文件直接编写即可;

以测试Antd的button组件为例:

import React from 'react'

import { render, fireEvent } from '@testing-library/react'

import Button, { ButtonProps } from './button'

const defaultProps = {

  onClick: jest.fn()

}

describe('test Button component', () => {

  it('should render the correct default button', () => {

    const wrapper = render(<Button {...defaultProps}>Nice</Button>)

    const element = wrapper.getByText('Nice') as HTMLButtonElement

    expect(element).toBeInTheDocument()

    expect(element.tagName).toEqual('BUTTON')

    expect(element).toHaveClass('btn btn-default')

    expect(element.disabled).toBeFalsy()

    fireEvent.click(element)

    expect(defaultProps.onClick).toHaveBeenCalled()

  })

})

运行npm run test

jest官方文档地址:https://jestjs.io/zh-Hans/

testing library地址:https://testing-library.com/docs/react-testing-library/intro

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269