jest (让人愉悦的测试框架)

1 什么是 Jest

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

2 安装

使用 yarn 安装 Jest

yarn add --dev jest
复制代码

或 npm:

npm install --save-dev jest
复制代码

3 简单试用

首先来编写第一个求和函数 sum.js

function sum(a, b){return a + b;
}
module.exports = sum;
复制代码

接下来创建测试用例:

const sum = require('./sum');test('adds 1 + 2 to equal 3', () => {expect(sum(1, 2)).toBe(3);
})
复制代码

在 package.json 中配置测试启动脚本:

{"scripts": {"test": "jest"}
}
复制代码

最后,运行 yarn test 或 npm run test ,Jest 将打印下面这个消息:

PASS ./sum.test.js
✓ adds 1 + 2 to equal 3 (5ms)
复制代码

4 匹配器

普通匹配器

最简单的测试方法是比较是否精确匹配

test(`two plus tow is four`, () => {expect(2 + 2).toBe(4);
})
复制代码

Truthiness

在测试中,有时需要精准区分 undefined 、null 和 false,有时 又不需要区分,jest 都满足。

  • toBeNull 只匹配 null
  • toBeUndefined 只匹配 undefined
  • toBeDefined 与 toBeUndefined 相反
  • toBeTruthy 匹配任何 if 语句为真
  • toBeFalsy 匹配任何 if 语句为假
test('null', () => {const n = null;expect(n).toBeNull();expect(n).toBeDefined();expect(n).not.toBeUndefined();expect(n).not.toBeTruthy();expect(n).toBeFalsy();
});test('zero', () => {const z = 0;expect(z).not.toBeNull();expect(z).toBeDefined();expect(z).not.toBeUndefined();expect(z).not.toBeTruthy();expect(z).toBeFalsy();
});
复制代码

数字

大多数的比较数字有等价的匹配器。

test('two plus two', () => {const value = 2 + 2;expect(value).toBeGreaterThan(3);expect(value).toBeGreaterThanOrEqual(3.5);expect(value).toBeLessThan(5);expect(value).toBeLessThanOrEqual(4.5);// toBe and toEqual are equivalent for numbersexpect(value).toBe(4);expect(value).toEqual(4);
});
复制代码

对于比较浮点数相等,使用 toBeCloseTo 而不是 toEqual,因为你不希望测试取决于一个小小的舍入误差。

test('两个浮点数字相加', () => {const value = 0.1 + 0.2;//expect(value).toBe(0.3);           这句会报错,因为浮点数有舍入误差expect(value).toBeCloseTo(0.3); // 这句可以运行
});
复制代码

字符串

toMatch 正则表达式的字符串︰

test('there is no I in team', () => {expect('team').not.toMatch(/I/);
});test('but there is a "stop" in Christoph', () => {expect('Christoph').toMatch(/stop/);
});
复制代码

Arrays and iterables

你可以通过 toContain 来检查一个数组或可迭代对象是否包含某个特定项:

const shoppingList = ['diapers','kleenex','trash bags','paper towels','beer',
];test('the shopping list has beer on it', () => {expect(shoppingList).toContain('beer');expect(new Set(shoppingList)).toContain('beer');
});
复制代码

例外

测试的特定函数抛出一个错误,在它调用时,使用 toThrow。

function compileAndroidCode() {throw new ConfigError('you are using the wrong JDK');
}test('compiling android goes as expected', () => {expect(compileAndroidCode).toThrow();expect(compileAndroidCode).toThrow(ConfigError);// You can also use the exact error message or a regexpexpect(compileAndroidCode).toThrow('you are using the wrong JDK');expect(compileAndroidCode).toThrow(/JDK/);
});
复制代码

5 测试异步代码

回调

test('the data is peanut butter', done => {function callback(data) {expect(data).toBe('peanut butter');done();}fetchData(callback);
});
复制代码

Promises

test('the data is peanut butter', () => {return fetchData().then(data => {expect(data).toBe('peanut butter');});
});
复制代码

.resloves/.rejects

test('the data is peanut butter', () => {return expect(fetchData()).resolves.toBe('peanut butter');
});
复制代码
test('the fetch fails with an error', () => {return expect(fetchData()).rejects.toMatch('error');
});
复制代码

Async/Await

test('the data is peanut butter', async () => {const data = await fetchData();expect(data).toBe('peanut butter');
});test('the fetch fails with an error', async () => {expect.assertions(1);try {await fetchData();} catch (e) {expect(e).toMatch('error');}
});
复制代码

6 挂载与卸载(Setup and Teardown)

用于在写测试的时候 需要运行测试前做的一些 准备工作,和在运行测试后进行的一些整理工作。

为多次测试重复设置

beforeEach(() => {initializeCityDatabase();
});afterEach(() => {clearCityDatabase();
});test('city database has Vienna', () => {expect(isCity('Vienna')).toBeTruthy();
});test('city database has San Juan', () => {expect(isCity('San Juan')).toBeTruthy();
});
复制代码

一次性设置

beforeAll(() => {return initializeCityDatabase();
});afterAll(() => {return clearCityDatabase();
});test('city database has Vienna', () => {expect(isCity('Vienna')).toBeTruthy();
});test('city database has San Juan', () => {expect(isCity('San Juan')).toBeTruthy();
});
复制代码

作用域

默认情况下,before 和 after 的块可以应用到文件中的每个测试。 此外可以通过 describe 块来将测试分组。 当 before 和 after 的块在 describe 块内部时,则其只适用于该 describe 块内的测试。

// Applies to all tests in this file
beforeEach(() => {return initializeCityDatabase();
});test('city database has Vienna', () => {expect(isCity('Vienna')).toBeTruthy();
});test('city database has San Juan', () => {expect(isCity('San Juan')).toBeTruthy();
});describe('matching cities to foods', () => {// Applies only to tests in this describe blockbeforeEach(() => {return initializeFoodDatabase();});test('Vienna <3 sausage', () => {expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true);});test('San Juan <3 plantains', () => {expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true);});
});复制代码

6 函数测试(mockFunction)

使用 mock 函数

function forEach(items, callback) {for (let index = 0; index < items.length; index++) {callback(items[index]);}
}const mockCallback = jest.fn(x => 42 + x);
forEach([0, 1], mockCallback);// The mock function is called twice
expect(mockCallback.mock.calls.length).toBe(2);// The first argument of the first call to the function was 0
expect(mockCallback.mock.calls[0][0]).toBe(0);// The first argument of the second call to the function was 1
expect(mockCallback.mock.calls[1][0]).toBe(1);// The return value of the first call to the function was 42
expect(mockCallback.mock.results[0].value).toBe(42);
复制代码

mock 的返回值

const myMock = jest.fn();
console.log(myMock());
// > undefinedmyMock.mockReturnValueOnce(10).mockReturnValueOnce('x').mockReturnValue(true);console.log(myMock(), myMock(), myMock(), myMock());
// > 10, 'x', true, true
复制代码

7 快照(snapshot)

使用快照功能给组件做快照,方便后面调整后与快照对比

使用 React 的 test renderer 和 Jest 的快照特性来和组件交互,获得渲染结果和生成快照文件:

import React from 'react';
import Link from '../Link.react';
import renderer from 'react-test-renderer';test('Link changes the class when hovered', () => {const component = renderer.create(<Link page="http://www.facebook.com">Facebook</Link>,);let tree = component.toJSON();expect(tree).toMatchSnapshot();// manually trigger the callbacktree.props.onMouseEnter();// re-renderingtree = component.toJSON();expect(tree).toMatchSnapshot();// manually trigger the callbacktree.props.onMouseLeave();// re-renderingtree = component.toJSON();expect(tree).toMatchSnapshot();
});
复制代码

转载于:https://juejin.im/post/5d072e136fb9a07ecd3d5c73

jest (让人愉悦的测试框架)相关推荐

  1. Jest测试框架学习(一)

    前言 jest是针对JavaScript的测试框架.如果遵循TDD原则,在任何功能开发之前都需要先写测试.而测试分为单元测试,集成测试和系统测试. 单元测试 单元测试可以理解为对于单个函数(单一功能) ...

  2. 测试框架 Jest 实例教程

    Jest 是由 Facebook 开源出来的一个测试框架,它集成了断言库.mock.快照测试.覆盖率报告等功能.它非常适合用来测试 React 代码,但不仅仅如此,所有的 js 代码都可以使用 Jes ...

  3. 前端测试框架—jest基本使用

    前端测试框架-jest基本使用 前言 jest 常见匹配器 基本类型 boolean Number String Array,Set 异常 取反 命令行工具使用 异步代码测试方法 钩子函数 分组(钩子 ...

  4. 顶级测试框架Jest指南:跑通一个完美的程序,就是教出一群像样的学生

    facebook三大项目:yarn jest metro,有横扫宇宙之势. 而jest项目的宗旨为:减少测试一个项目所花费的时间成本和认知成本. --其实,它在让你当一个好老师. jest文档非常简略 ...

  5. 前端测试框架Jest系列教程 -- Expect(验证)

    写在前面 在编写测试时,我们通常需要检查值是否满足某些条件,Jest中提供的expect允许你访问很多"Matchers",这些"匹配器"允许您验证不同的东西. ...

  6. 前端测试框架Jest——语法篇

    使用匹配器 使用不同匹配器可以测试输入输出的值是否符合预期.下面介绍一些常见的匹配器. 普通匹配器 最简单的测试值的方法就是看是否精确匹配.首先是toBe() test('two plus two i ...

  7. 自动化测试(一)基本介绍——测试框架的分类 单元测试工具 E2E测试工具

    自动化测试(一)基本介绍--测试框架的分类 & 单元测试工具 & E2E测试工具 5-3 自动化测试 课程介绍 在前端界,浏览器兼容性是让工程师们头疼的问题,对于经验丰富的人来说,很清 ...

  8. 自动化测试框架cucumber_BDD测试框架之Cucumber使用入门

    ▼ 关注测试局| 会上瘾 1什么是Cucumber cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像 ...

  9. hapi lab测试框架简单使用

    1. 依赖安装 yarn init yarn add lab code 2. 基本模式 const Lab = require('lab'); const Code = require('code') ...

  10. 为什么有如此多的C++测试框架 - from Google Testing Blog

    Why Are There So Many C++ Testing Frameworks? by Zhanyong Wan (Software Engineer) 最近貌似有很多人正在开发他们自己的C ...

最新文章

  1. 作为一名合格的JAVA程序员需要点亮那些技能树?
  2. pythonclass全局变量_Python-多处理全局变量更新未返回给父级
  3. C/C++中的指针变量可以相互赋值,使得它们指向同一块地址空间
  4. 百度搜索,你画了好大一张饼,你还打算欺骗多少人呢?有图为证
  5. 4.day11_包和权限修饰符-1
  6. 四步获取微信登录所需的openid和session_key
  7. 【Kafka】kafka Current offset xxx for partition xxx out range
  8. 三十六亿票房的《哪吒》,如何利用 AI 成为国漫界的黑马?
  9. JenkinsDay18-查看服务器有哪些JOB
  10. 手动计算均值,方差,协方差,皮尔逊系数
  11. 使用QFIL升级高通芯片的Android系统
  12. php用pkcs1还是pkcs8,PKCS1与PKCS8的小知识
  13. java 对战平台-魔兽版
  14. 【英语阅读】纽约时报 | “杀死我们的将是饥饿,而不是新冠病毒”
  15. 七千年来被国人误解的七句古话
  16. linux rm、rm -f、rm -r的区别
  17. 3年风雨兼程-编程程软件测试终打破测试培训行业乱象
  18. 项目训练营模块学习---Oled屏幕
  19. python语言-实现半自动爬虫爬取小说《遮天》评论
  20. 面向服务的WCF编程(三)

热门文章

  1. 投稿期刊:机械人机交互图形图象交叉学科
  2. Atitit 提升扩展性 自由化理念 参数 第一章 前瞻性设计 第二章  自由化理念 自由化参数 json map等半结构化参数,dsl等全功能参数 自由化功能接口 dsl 自由化返回
  3. Atitit 数据库映射到redis存储的模式 1. 常规 每条db记录映射一个redis记录 1 1.1. 表名:主键为key ,记录序列化为json为val 1 2. 每个字段映射一个redi
  4. Atitit 数据join 的原理与java实现 Atitit join表连接的原理与实现 13、SQL Server 表连接的三种方式   (1) Merge Join   (2) Nested
  5. Atititi.名字 姓名 name 起名naming spec 的构成结构规范v2 qc2.docx
  6. paip.web service技术在 JAVA与.NET中的应用流程方案
  7. paip.提升安全性------登录地区变换后进行验证
  8. Blue Prism如何成为RPA领域魔力象限领袖
  9. 2019中国软件业务收入前百家企业名单公布
  10. 关于Libra的6个核心问题及其监管原则