标注:

首先这并不是一篇完整的关于Jest的教程,只是个人在接触jest学习的一点随手笔记,大部分内容都是对官方文档的一些翻译。

------------------------------------------------------------------------------------------------------------------------------------------

What's Jest

Jest是Facebook开发的一个对javascript进行单元测试的工具,之前仅在其内部使用,后开源,并且是在Jasmine测试框架上演变开发而来,使用了我们熟知的expect(value).toBe(other)这种断言格式。Jest提供零配置测试平台,即是一种即用型的工具。这将会使得工程师编写更多的测试,创建更稳定和更健康的代码库。

Getting Start

第一个Jest测试Demo

通过npm安装

$ npm install jest --save-dev

编辑一个待测试的sum.js文件如下:

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

编辑一个测试文件sum.test.js

注意:关于这个测试文件的位置,建议是对每个组件新建一个__test__文件夹,然后文件命名是name.test.js,用于存放测试文件。

const sum = require('./sum');

test('adds 1 + 2 to equal 3', ()=> {
expect(sum(1, 2)).toBe(3);
});

接着在package.json文件里添加测试命令

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

最后,运行 npm test命令后jest将会打印如下信息

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

至此,第一个测试Demo完成了。

Using Matchers

Jest使用matchers来使用不同的方式测试你的结果。

Common Matchers

最简单的测试方式就是测试一个值是否全等

test('2加2等于4', ()=> {
expect(2 + 2).toBe(4);
});

在上述代码中,expect(2+2)返回一个“期望”对象,通常我们不会对这个期望对象进行匹配,而是由matchers完成,在这里.toBe(4)便是这个matchers,当Jest运行时,它会跟踪所有失败的matchers以便打印正确的错误信息给我们。

toBe使用 === 来测试全等于,如果我们想检查一个对象object中的值,使用toEqual来替代,toEqual递归遍历检查对象或数组里的每一个领域。

"use strict";

test('object assigenment', ()=> {
let data = { one: 1};
data['two'] = 2;
expect(data).toEqual({ one: 1, two: 2 });
})

注意:官网的例子是没有使用的"use strict";,然后npm test的时候就会报出一条错误
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

使用not可以测试一个matchers的反向规则:

test('adding positive numbers is not zero', () => {
for (let a = 1; a < 10; a++) {
for (let b = 1; b < 10; b++) {
expect(a + b).not.toBe(0);
}
}
});

Truthiness

在测试的时候,有时候我们需要在undefinednullfalse进行区别,但是我们又不想去了解他们的不同点,Jest也会帮助我们得到我们想要的结果。

  • toBeNull 检查是否为null

  • toBeUndefined 检查是否为undefined

  • toBeDefined 与toBeUndefined的相反

  • toBeTruthy 检查任何通过if显示转换是否为true

  • toBeFalsy 检查任何通过if显示转换是否为false

如下:

test('null', () => {
let n = null;
expect(n).toBeNull();
expect(n).toBeDefined();
expect(n).not.toBeUndefined();
expect(n).not.toBeTruthy();
expect(n).toBeFalsy();
}); test('zero', () => {
let z = 0;
expect(z).not.toBeNull();
expect(z).toBeDefined();
expect(z).not.toBeUndefined();
expect(z).not.toBeTruthy();
expect(z).toBeFalsy();
});

Numbers

比较数字的大多数方法都有其对应的matchers

  • toBeGreaterThan 大于

  • toBeGreaterThanOrEqual 大于等于

  • toBeLessThan 小于

  • toBeLessThanOrEqual 小于等于

test('two plus two', () => {
let value = 2 + 2;
expect(value).toBeGreaterThan(3);
expect(value).toBeGreaterThanOrEqual(3.5);
expect(value).toBeLessThan(5);
expect(value).toBeLessThanOrEqual(4.5); // toBe and toEqual 对于number类型作用是一样的
expect(value).toBe(4);
expect(value).toEqual(4);
});

对于浮点数的测试,使用toBeCloseTo来替代toEqual,因为我们不会让一个测试依赖于一个微小的舍入型错误。

test('adding floating point numbers', () => {
let value = 0.1 + 0.2;
expect(value).not.toBe(0.3); // It isn't! Because rounding error
expect(value).toBeCloseTo(0.3); // This works.
});

Strings

使用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

使用toContain对数组内的特定项进行匹配测试

let shoppingList = ['diapers', 'kleenex', 'trash bags', 'paper towels', 'beer'];

test('the shopping list has beer on it', () => {
expect(shoppingList).toContain('beer');
});

Exceptions

使用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 regexp
expect(compileAndroidCode).toThrow('you are using the wrong JDK');
expect(compileAndroidCode).toThrow(/JDK/);
});

Testing Asynchronous Code

在javascript程序中,会经常见到一些异步执行的代码,当我们有这些异步执行的代码时,Jest需要知道当前这个代码测试是否已经完成,然后才能转向另一个测试。Jest提供了一些方法来处理这种问题。

Callbacks

最常用的异步测试模式便是callbacks

列如,我们有一个fetchData(callback)方法,当callback(data)方法调用的时候,我们会获取一些data数据,并且想测试返回的数据是否只是一个字符串uyun

默认情况下下,Jest在所有的代码执行完之后便会完成测试,这意味这些测试不再会按计划的工作下去。

// Don't do this!
test('the data is uyun', () => {
function callback(data) {
expect(data).toBe('uyun');
} fetchData(callback);
});

问题是,测试希望一旦fatchData成功后才能完成,并在其之前调用回调。

这里有另一种形式修复这个测试的问题,在这个测试方法里使用一个参数为done的回调参数,而不是放置一个空参数,Jest要等到done被调用后才会结束此次测试。

test('the data is uyun', done => {
function callback(data) {
expect(data).toBe('uyun');
done();
} fetchData(callback);
});

如果done()没被调用,测试即失败了,这时候我们也会得到我们想要的错误结果了。

Promises

如果我们的代码中使用到了Promises ,这里有一个简单的异步测试处理方法。只是我们的测试中返回一个promise,并且Jest会等待这个promise解析完成,如果rejected了,这个测试便会自动视为失败。如下:

test('the data is uyun', () => {
return fetchData().then(data => {
expect(data).toBe('uyun');
});
});

注意:一定要确保返回了Promise,如果省略了这步,你的测试将会在fetchData完成之前首先结束掉。

Async/Await

如果代码中使用到asyncawait,可以这样做。编写一个异步测试,仅需要在测试方法前面使用async关键词,然后传递给测试函数即可。如下:

test('the data is uyun', async () => {
const data = await fetchData();
expect(data).toBe('uyun');
});

在这个例子中,asyncawait等同于promises方法的一种语法糖实现方式。

Jest使用者:Jest被各种规模的团队用于测试Web应用程序,node.js服务,移动应用程序和API。

JavaScript单元测试工具-Jest的更多相关文章

  1. NodeJs和ReactJs单元测试工具——Jest

    Jest——Painless JavaScript UnitTesting 特点 适应性强 默认使用Jasmine断言 模块化的 可扩展的 可配置的 沙箱式且快速 虚拟化JS环境,模拟浏览器 并行运行 ...

  2. javascript单元测试工具

    单元测试关注的是验证一个模块或一段代码的执行效果是否和设计或预期一样.有些开发人员认为,编写测试用例浪费时间而宁愿去编写新的模块.然而,在处理大型应用程序时,单元测试实际上会节省时间:它能帮助您跟踪问 ...

  3. 前端自动化测试工具--使用karma进行javascript单元测试(转)

    Karma+Jasmine+PhantomJS组合的前端javascript单元测试工具. 1.介绍 Karma是由Google团队开发的一套前端测试运行框架,karma会启动一个web服务器,将js ...

  4. javascript单元测试(转)

    1.      什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...

  5. [转]javascript单元测试

    1.      什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...

  6. Jest 前端单元测试工具

    Jest和enzyme 前端单元测试工具 什么是Jest? Jest是一个令人愉悦的JavaScript测试框架,其重点是简单性. 它适用于使用以下项目的项目:Babel,TypeScript,Nod ...

  7. JavaScript测试工具

    大家都知道Javascript的测试比较麻烦,一般是开发使用一些浏览器的插件比如IE develop bar或是firebug来调试,而测试往往需要通过页面展示后的js错误提示来定位.那么还有其他比较 ...

  8. 关于JavaScript测试工具:QUnit, Jasmine, MoCha

    在进行前端开发过程中,在某些场景下,需要通过编写单元测试来提高代码质量.而JavaScript常用的单元测试框架有这几个:QUnit, Jasmine, MoCha.下面就基于这三个工具,简单做一比较 ...

  9. JavaScript 开发工具webstrom使用指南

    本文给大家推荐了一款非常热门的javascript开发工具webstrom,着重介绍了webstrom的特色功能.设置技巧.使用心得以及快捷键汇总,非常的全面. 看到网上一篇介绍webstrom的文章 ...

随机推荐

  1. js对象和json的区别

    他们两个没有什么关联只不过可以相互转换而已,就像json可以转化为java对象一样 注意:json只有字符串形式(就是我们常说的json字符串:key/value值和数组形式的字符串),没有什么jso ...

  2. go语言笔记——go环境变量goroot是安装了路径和gopath是三方包路径

    Go 环境变量 Go 开发环境依赖于一些操作系统环境变量,你最好在安装 Go 之间就已经设置好他们.如果你使用的是 Windows 的话,你完全不用进行手动设置,Go 将被默认安装在目录 c:/go  ...

  3. P1491 集合位置 次短路

    这个题是一个次短路的裸题,就是把最短路路径求出来之后依次删边,然后跑最短路,在这些情况里取最小值就行了. 题干: 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家 ...

  4. SQL service 自动解决依赖包 验证

    依赖关系解决 ============================================================================================= ...

  5. JS判断数组是否包含某元素

    我在学习ES6数组拓展时,发现了新增了不少了有趣的数组方法,突然想好工作中判断数组是否包含某个元素是非常常见的操作,那么这篇文章顺便做个整理. 1.for循环结合break 可能很多人第一会想到for ...

  6. DB2锁表或超时解决方案

    DB2锁表或超时 一.场景 对数据表进行更新(查询没问题),错误提示如下: SQLCODE=-911, SQLSTATE=40001, DRIVER=3.63.75SQL0911N The curre ...

  7. Android数据存储的5种方法

    --使用SharedPreferences存储数据 --文件存储数据 --SQLite数据库存储数据 --使用ContentProvider存储数据 --网络存储数据 Preference,File, ...

  8. 【Leetcode 220】 Contains Duplicate III

    问题描述:判断数组中是否存在<ai aj> abs(ai - aj)<=t  && abs(i - j) <=k: 问题分析:需要一个数据结构来维护满足条件k. ...

  9. drupal 8——打补丁(patch)

    druapl 的核心可能会有漏洞,这时就需要我们去打补丁.很多补丁都已经有人写好了,我这里讲的就是如何去打这些已经写好的补丁. 对于这个问题:drupal8 核心有bug导致了两个相同的错误提示的出现 ...

  10. node.js安装步骤

    首先这是node.js的官网:https://nodejs.org/en/ 截至2017年12月9日,node更新在8.9.3该版本,建议开发人员下载6.0以上版本,8以上不是很稳定!  如果有其他需 ...