前端单元测试框架-Mocha

引言

随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是‘急剧上升’,所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React、Vue,因为有自己的语法规则,及时每个开发人员的编码风格规范各不相同,但最终的产出都大同小异,代码质量差距不是很大;但对于一些基础类库或方法的开发,我们就要谨慎又谨慎,代码质量一定要高,尽量避免出现Bug。

那我们如何做到产出高质量代码呢?单元测试才是正解,俗话说‘跳过单元测试和不仔细过冒烟就交由QA测试的,就是在耍流氓’(这句话是我自己编的);Mocha是针对Javascript的单元测试工具,下面我们就来看看如何使用它

概念

Mocha: Javascript测试框架

chai:断言库,需配合Mocha使用

最简单的用法

步骤一:安装

假设我们是在已有项目中进行单元测试

安装Mocha

/*全局安装*/$ npm install --global mocha  

/*局部安装*/$ npm install --save-dev mocha

安装chai

/*局部安装*/$ npm install --save-dev chai

全局与局部的区别:若是局部安装,依赖就会写入package.json的dependencies或devDependencies中,这样当别人从你的Github上克隆代码时,就不需要注意‘依赖包全不全啊’?‘还需不要安装其他依赖啊?’等等这类的问题,因为‘npm install‘会将所有依赖下载到本地

步骤二:编写Js源文件与测试文件

源文件

// add.js1 function add(x, y) {
2   return x + y;
3 }
4
5 module.exports = add;

测试文件

 // add.test.js 1 var add = require(‘./add.js‘);
 2 var expect = require(‘chai‘).expect;
 3
 4 describe(‘加法函数的测试‘, function() {
 5   it(‘1 加 1 应该等于 2‘, function() {
 6     expect(add(1, 1)).to.be.equal(2);
 7   });
 8   it(‘1 加 -1 应该等于 0‘, function() {
 9     expect(add(1, -1)).to.be.equal(0);
10   });
11 });

步骤三:运行测试文件

$ mocha add.test.js

运行截图:

以上就是Mocha最简单的使用方式,细不细很简单啊O(∩_∩)O哈哈~,下面我们再看点进阶的

进阶之路

进阶一:describe和it是什么?

describe:"测试组",也称测试块,表示我要进行一系列测试,相当于一个group

it:"测试项",也称测试用例,表示这是"一系列测试"中的一项,相当于item,如何测试?测试逻辑?都是在it的回调函数中实现的

进阶二:什么?describe也有"生命周期"?

每个测试块(describe)有4个周期,分别是:

 1 describe(‘test‘, function() {
 2   // 在本测试块的所有测试用例之前执行且仅执行一次
 3   before(function() {
 4
 5   });
 6   // 在本测试块的所有测试用例之后执行且仅执行一次
 7   after(function() {
 8
 9   });
10
11   // 在测试块的每个测试用例之前执行(有几个测试用例it,就执行几次)
12   beforeEach(function() {
13
14   });
15   // 在测试块的每个测试用例之后执行(同上)
16   afterEach(function() {
17
18   });
19
20   // 测试用例
21   it(‘test item1‘, function () {
22
23   })
24 });

进阶三:在进阶二中周期代码是ES6风格,需要安装babel模块转码

这里分两种情况:1.全局安装   2.局部安装

如果是全局方式安装的babel,那么我们也要使用全局的Mocha来调用babel-core模块

$ npm install -g babel-core babel-preset-es2015$ mocha --compilers js:babel-core/register

但如果是局部方式安装的babel,那么我们就要使用局部的Mocha来调用babel-core模块

$ npm install --save-dev babel-core babel-preset-es2015
$ ../node_modules/mocha/bin/mocha --compilers js:babel-core/register

为什么呢?因为Mocha是根据自身的路径来寻找babel模块的,所以要全局对应全局,局部对应局部

这里少了很重要的一步:在测试之前,需要配置babel转码规则,在项目根目录,记住‘一定要是根目录’,新建.babelrc文件,这个文件是供babel使用的

// .babelrc
{
  "presets": [ "es2015" ] //这里制定使用es2015规则转码
}

进阶四:测试还可以是异步的?

异步测试与普通测试有什么不同:测试用例的回调函数中多了一个参数done

 1 var add = require(‘../src/add.js‘);
 2 var expect = require(‘chai‘).expect;
 3
 4 describe(‘加法函数的测试‘, function() {
 5   // 异步测试
 6   it(‘1 加 1 应该等于 2‘, function(done) {
 7     var clock = setTimeout(function () {
 8       expect(add(1, 1)).to.be.equal(2);
 9       done(); // 通知Mocha测试结束
10     },1000);
11   });
12
13   // 同步测试
14   it(‘1 加 0 应该等于 1‘, function() {
15     expect(add(1, 0)).to.be.equal(1);
16   });
17 });

异步测试需要注意一点:必须手动调用done,否则该异步测试就会失败,见下方代码与运行截图:

代码:

 1 var add = require(‘../src/add.js‘);
 2 var expect = require(‘chai‘).expect;
 3
 4 describe(‘加法函数的测试‘, function() {
 5   // 异步测试
 6   it(‘1 加 1 应该等于 2‘, function(done) {
 7     var clock = setTimeout(function () {
 8       expect(add(1, 1)).to.be.equal(2);
 9       //done();我们不主动调用done,看看会发生什么?
10     },1000);
11   });
12
13   // 同步测试
14   it(‘1 加 0 应该等于 1‘, function() {
15     expect(add(1, 0)).to.be.equal(1);
16   });
17 });

运行截图:

从运行结果不难看出,测试用例1失败了,而且Mocha提示我们:如果是异步测试或钩子,那么一定要确保done方法被调用,否则测试就会失败,但并不会影响其他用例

那么,异步测试有哪些应用场景呢?那就是测试数据接口,我们可以这样:

1 it(‘异步请求测试‘, function() {
2   return fetch(‘https://api.github.com‘)
3     .then(function(res) {
4       return res.json();
5     }).then(function(json) {
6       expect(json).to.be.an(‘object‘); // 测试接口返回的是否为对象类型的数据,也就是json格式
7     });
8 });

进阶五:如果我们想只执行某个测试用例呢?或者除了某个用例,其他的都执行

Mocha有两个用例管理api:only和skip

1.如果只想执行某个用例,我们就用only方式调用它:

 1 var add = require(‘../src/add.js‘);
 2 var expect = require(‘chai‘).expect;
 3
 4 describe(‘加法函数的测试‘, function() {
 5   // 一个测试组中不是只能有一个only,可以有多个only方式执行的用例
 6   it.only(‘1 加 1 应该等于 2‘, function() {
 7     expect(add(1, 1)).to.be.equal(2);
 8   });
 9
10
11   it.only(‘1 加 0 应该等于 1‘, function() {
12     expect(add(1, 0)).to.be.equal(1);
13   });
14
15   // 但如果组内已经有了only,那么非only方式执行的用例就一定不会被执行,切记
16   it(‘1 加 -1 应该等于 0‘, function() {
17     expect(add(1, -1)).to.be.equal(0);
18   });
19
20 });

运行截图:

可以看出,第三个用例并没有被执行

2.如果想跳过某个用例,我们就用skip方式调用它:

 1 var add = require(‘../src/add.js‘);
 2 var expect = require(‘chai‘).expect;
 3
 4 describe(‘加法函数的测试‘, function() {
 5
 6   it(‘1 加 1 应该等于 2‘, function() {
 7     expect(add(1, 1)).to.be.equal(2);
 8   });
 9
10   // 同理,skip方式执行的用例在同一组内也可以有多个
11   it.skip(‘1 加 0 应该等于 1‘, function() {
12     expect(add(1, 0)).to.be.equal(1);
13   });
14
15
16   it.skip(‘1 加 -1 应该等于 0‘, function() {
17     expect(add(1, -1)).to.be.equal(0);
18   });
19
20 });

运行截图:

第2,3个用例被跳过了

结语

以上就是Mocha测试框架的简单介绍,测试api不只有文中的to.be.equal,文中只是"千牛一毛",还有很多api以及更高级的使用特性,详细可参照官方网站:http://mochajs.org/

本文章内容参照了阮一峰老师的文章《测试框架 Mocha 实例教程》,感兴趣的同学可以看一下

时间: 2024-10-16 09:46:43

前端单元测试框架-Mocha的相关文章

前端单元测试mocha、karma、travis-ci梳理

前言 本章是我学习前端单元测试的一个梳理和总结,进入主题: 1.什么是前端单元测试 测试是什么:为检测特定的目标是否符合标准而采用专用的工具或者方法进行验证,并最终得出特定的结果. 对于前端开发过程来说,这里的特定目标就是指我们写的代码,而工具就是我们需要用到的测试框架(库).测试用例等.检测处的结果就是展示测试是否通过或者给出测试报告,这样才能方便问题的排查和后期的修正. 2.为什么要做单元测试 某些库可能会被多个地方使用,需要保证它未来能够保持稳定性,这样以后在修改代码的时候不用大量去回归原

Mocha 单元测试框架简介

前言: mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行. 使用mocha,我们就只需要专注于编写单元测试本身,然后,让mocha去自动运行所有的测试,并给出测试结果. mocha的特点主要有: 既可以测试简单的JavaScript函数,又可以测试异步代码,因为异步是JavaScript的特性之一: 可以自动运行所有测试,也可以只运行特定的测试: 可以支持before.after.beforeEach和afterEach来编写初始化代

浅谈前端单元测试

前一段时间开始了解前端单元测试,前端测试自动化,记录下自己对前端测试的理解,帮助加深印象,和开始了解前端测试的同学. 注: 个人理解可能有所偏差,欢迎指正 下面要讲的内容主要分为以下几点: 1. 什么是单元测试 2. 为什么要进行单元测试 3. 单元测试可以测什么 4. 测试分类 ( TDD, BDD, DDD,  MDD) 5. 单元测试框架 ( Qunit, Sinon, Jasmine, phantomjs , totoro, mocha) --> 测试框架 ( JSTD, Karma,

了解前端的框架知识

构建工具(自动) Grunt.js:生态强大,发展速度快,有大量可选插件: Gulp.js:流式项目构建工具: Browserify.js:Node.js模块,主要用于改写现有的CommonJS模块,使得浏览器端也可以使用这些模块: Uglify.js:JavaScript解析器.压缩工具和代码美化库. 软件包管理工具 Homebrew (Mac OS):Apple Mac OS下的软件安装工具: Apt:Debian.Ubuntu等系列Linux系统的软件包管理工具,可用来安装.删除.升级软件

前端单元测试工具

单元测试Unit Test 很早就知道单元测试这样一个概念,但直到几个月前,我真正开始接触和使用它.究竟什么是单元测试?我想也许很多使用了很久的人也不一定能描述的十分清楚,所以写了这篇文章来尝试描述它的特征和原则,以帮助更多人. 一.什么是单元测试? 先来看看单元测试的定义,在维基百科英文版中可以找到Kolawa Adam在 Automated Defect Prevention: Best Practices in Software Management 一书中对单元测试的定义: In com

前端测试框架

一.为什么要进行测试? 一个 bug 被隐藏的时间越长,修复这个 bug 的代价就越大.大量的研究数据指出:最后才修改一个 bug 的代价是在 bug 产生时修改它的代价的10倍.所以要防患于未然. 从语言的角度讲 JavaScript 作为 web 端使用最广泛的编程语言,它是动态语言,缺乏静态类型检查,所以在代码编译期间,很难发现像变量名写错,调用不存在的方法, 赋值或传值的类型错误等错误. 例如下面的例子, 这种类型不符的情况在代码中非常容易发生 function foo(x) { ret

前端测试框架学习

做了一年多的前端,从没有认真写过单元测试,对于常说的各种框架并不能彻底的分清,这次做了一个认真的学习与总结. 单元测试框架:Mocha, Jasmine等,因测试框架不包含断言库,因此需要引入断言库,Jasmine带有断言库assertions(未使用过).断言库 assert, shouldjs, chai等,具体的单元测试用例中使用karma是一款自动化测试工具,通过使用配置文件自动检测单元测试文件并进行测试,输出测试结果travis ci 持续集成服务,实现对代码库的代码的检测,编译,发布

Python单元测试框架 —— unittest

文章转自 :https://blog.csdn.net/huilan_same/article/details/52944782 unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那你用unittest来应该是很轻松的,它们的工作方式都差不多. unittest核心工作原理 unittest中最核心的四个概念是:test case, test suite, test runner, test fixture 下面我们分别来解释这四个概念的意思,先来看一张unittes

Vue 单元测试 使用mocha+jest

目录 Vue 单元测试 mocha+jest jest 实例 mocha expect方法断言 示例代码 Vue 单元测试 官网:https://vue-test-utils.vuejs.org/zh 定义: 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 指令: package.json文件 "test:unit": "vue-cli-service test:unit" 测试驱动开发(TDD:Test-Driven Developmen