1 什么是 Jest?

Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言、JSDom、覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架。并且它对同样是 Facebook 的开源前端框架 React 的测试十分友好。

2 安装Jest

2.1 初始化package.json

shell中输入以下命令,初始化前端项目并生成package.json

npm init -y

2.2 安装Jest及相关依赖

shell中输入以下命令,安装测试所需要的依赖:

npm install -D jest babel-jest babel-core babel-preset-env regenerator-runtime

babel-jestbabel-coreregenerator-runtimebabel-preset-env这几个依赖是为了让我们可以使用ES6的语法特性进行单元测试,ES6提供的 import 来导入模块的方式,Jest本身是不支持的。

2.3 添加.babelrc文件

在项目的根目录下添加.babelrc文件,并在文件复制如下内容:

{"presets": ["env"]
}

2.4 修改package.json中的test脚本

打开package.json文件,将script下的test的值修改为jest

"scripts": {"test": "jest"
}

3. 编写你的第一个Jest测试

创建srctest目录及相关文件

  • 在项目根目录下创建src目录,并在src目录下添加functions.js文件
  • 在项目根目录下创建test目录,并在test目录下创建functions.test.js文件

Jest会自动找到项目中所有使用.spec.js.test.js文件命名的测试文件并执行,通常我们在编写测试文件时遵循的命名规范:测试文件的文件名 = 被测试模块名 + .test.js,例如被测试模块为functions.js,那么对应的测试文件命名为functions.test.js

src/functions.js中创建被测试的模块

export default {sum(a, b) {return a + b;}
}

test/functions.test.js文件中创建测试用例

import functions  from '../src/functions';test('sum(2 + 2) 等于 4', () => {expect(functions.sum(2, 2)).toBe(4);
})

运行npm run test, Jest会在shell中打印出以下消息:

 PASS  test/functions.test.js√ sum(2 + 2) 等于 4 (7ms)Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.8s

4.常用的几个Jest断言

上面测试用例中的expect(functions.sum(2, 2)).toBe(4)为一句断言,Jest为我们提供了expect函数用来包装被测试的方法并返回一个对象,该对象中包含一系列的匹配器来让我们更方便的进行断言,上面的toBe函数即为一个匹配器。我们来介绍几种常用的Jest断言,其中会涉及多个匹配器。

.not

//functions.test.js
import functions  from '../src/functions'test('sum(2, 2) 不等于 5', () => {expect(functions.sum(2, 2)).not.toBe(5);
})

.not修饰符允许你测试结果不等于某个值的情况,这和英语的语法几乎完全一样,很好理解。

.toEqual()

// functions.js
export default {getAuthor() {return {name: 'LITANGHUI',age: 24,}}
}
// functions.test.js
import functions  from '../src/functions';test('getAuthor()返回的对象深度相等', () => {expect(functions.getAuthor()).toEqual(functions.getAuthor());
})test('getAuthor()返回的对象内存地址不同', () => {expect(functions.getAuthor()).not.toBe(functions.getAuthor());
})

.toEqual匹配器会递归的检查对象所有属性和属性值是否相等,所以如果要进行应用类型的比较时,请使用.toEqual匹配器而不是.toBe

.toHaveLength

// functions.js
export default {getIntArray(num) {if (!Number.isInteger(num)) {throw Error('"getIntArray"只接受整数类型的参数');}let result = [];for (let i = 0, len = num; i < len; i++) {result.push(i);}return result;}
}
// functions.test.js
import functions  from '../src/functions';test('getIntArray(3)返回的数组长度应该为3', () => {expect(functions.getIntArray(3)).toHaveLength(3);
})

.toHaveLength可以很方便的用来测试字符串和数组类型的长度是否满足预期。

.toThrow

// functions.test.js
import functions  from '../src/functions';test('getIntArray(3.3)应该抛出错误', () => {function getIntArrayWrapFn() {functions.getIntArray(3.3);}expect(getIntArrayWrapFn).toThrow('"getIntArray"只接受整数类型的参数');
})

.toThorw可能够让我们测试被测试方法是否按照预期抛出异常,但是在使用时需要注意的是:我们必须使用一个函数将将被测试的函数做一个包装,正如上面getIntArrayWrapFn所做的那样,否则会因为函数抛出导致该断言失败。

.toMatch

// functions.test.js
import functions  from '../src/functions';test('getAuthor().name应该包含"li"这个姓氏', () => {expect(functions.getAuthor().name).toMatch(/li/i);
})

.toMatch传入一个正则表达式,它允许我们用来进行字符串类型的正则匹配。

5 测试异步函数

安装axios
这里我们使用最常用的http请求库axios来进行请求处理

npm install axios

编写http请求函数
我们将请求http://jsonplaceholder.typicode.com/users/1,这是由JSONPlaceholder提供的mock请求地址

// functions.js
import axios from 'axios';export default {fetchUser() {return axios.get('http://jsonplaceholder.typicode.com/users/1').then(res => res.data).catch(error => console.log(error));}
}
// functions.test.js
import functions  from '../src/functions';test('fetchUser() 可以请求到一个含有name属性值为Leanne Graham的对象', () => {expect.assertions(1);return functions.fetchUser().then(data => {expect(data.name).toBe('Leanne Graham');});
})

上面我们调用了expect.assertions(1),它能确保在异步的测试用例中,有一个断言会在回调函数中被执行。这在进行异步代码的测试中十分有效。

使用asyncawait精简异步代码

test('fetchUser() 可以请求到一个用户名字为Leanne Graham', async () => {expect.assertions(1);const data =  await functions.fetchUser();expect(data.name).toBe('Leanne Graham')
})

当然我们既然安装了Babel,为何不使用asyncawait的语法来精简我们的异步测试代码呢? 但是别忘记都需要调用expect.assertions方法

参考资料

【1】 Jest官方文档(https://jestjs.io/zh-Hans/)
【2】 Jest Crash Course - Unit Testing in JavaScript(https://www.youtube.com/watch...

使用Jest测试JavaScript (入门篇)相关推荐

  1. 使用Jest测试JavaScript (入门篇) 1

    1 什么是 Jest? Jest Jest是 Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言.JSDom.覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的 ...

  2. JavaScript—入门篇

    JavaScript-入门(笔记) 第一章 请做好准备 1-1 为什么学习JavaScript 1-2 新朋友你在哪里(如何插入JS) 1-3 我也可以独立(引用JS外部文件) 1-4 找到你的位置( ...

  3. Jest测试框架入门之Mock

    说到mock,大家第一个想到的肯定是项目里经常用来模拟接口返回值的 mockjs库 ,Jest里的mock有所不同,下面会举一些例子来分别讲一讲 jest.fn().jest.mock().jest. ...

  4. JavaScript入门篇 - DOM操作

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法. DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代 ...

  5. 第一章: HTML、CSS、JavaScript入门篇

    文章目录 第一章 基本标签及使用 前端简介 web服务端 简易服务端 HTTP协议 HTML简介 web服务的本质 HTML语法结构 HTML注释 标签的分类01 head内常用标签 body内基本标 ...

  6. Jest测试框架入门之匹配器与测试异步代码

    一.匹配器 1.对于一般的数字与字符串类型使用 toBe test('adds 1 + 2 to equal 3', () => {expect(1 + 2).toBe(3); });test( ...

  7. jmeter并发测试教程_JMeter压力测试并发测试(入门篇)

    jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...

  8. JavaScript入门篇

    javascript介绍 JavaScript代码写在`<script></script>`之间.`<script type="text/javascript& ...

  9. JavaScript的入门篇

    快速认识JavaScript 熟悉JavaScript基本语法 窗口交互方法 通过DOM进行网页元素的操作 学会如何编写JS代码 运用JavaScript去操作HTML元素和CSS样式 <!DO ...

最新文章

  1. handlebars 基础
  2. php如何获取js文本框内的内容,js获取input标签的输入值(实例代码)
  3. 利用状态图实现词法分析
  4. dns服务器在电脑上有什么作用,DNS服务器是什么 DNS服务器的作用有哪些【详解】...
  5. spring 中单利模式的理解
  6. leetcode 81 Search in Rotated Sorted Array II ----- java
  7. TCP的几个状态(SYN/FIN/ACK/PSH/RST)
  8. docker ps命令详解 列出运行中的容器
  9. 总结 一下UML 类图的关系
  10. MySQL添加新用户、为用户创建数据库、为新用户分配权限
  11. 阿里HBase高可用8年抗战回忆录
  12. 字节跳动入局外卖赛道 美团饿了么怕了吗?
  13. 笔记本vm系统的分辨率不好调整_苹果笔记本电脑怎么设置使用今声优盒
  14. html只能输入两位小数,JQuery控制input只能输入数字和两位小数(有关金额)代码...
  15. ubuntu上的翻译软件,看论文神器
  16. 厉害了,盘点那些改变世界的代码!
  17. 计算机一级幻灯片样式,PPT怎么设置单个幻灯片为背景样式4?网友:原来这么简单!...
  18. linux系统火狐浏览器升级,小菜鸡deepin系统手动更新火狐浏览器
  19. 【毕业设计】超声波红外自动调速风扇系统 - 单片机 嵌入式
  20. python在条件表达式中不允许使用_在条件表达式中不允许使用赋值运算符 = ,会提示语法错误。...

热门文章

  1. 初步了解Linux proc文件系统
  2. win32汇编定时器简单Demo
  3. MyEclipse的Add Libraries对话框
  4. Luogu P2982 [USACO10FEB]慢下来 Slowing down | dfs序、线段树
  5. Django层级模型定义及序列化嵌套的方法
  6. Redis系列四:redis支持的数据类型
  7. Linux 新api eventfd(转)
  8. iOS:app直播---采集篇
  9. 移动前端html5 head 头标签
  10. ubuntu多节点安装kubernetes