NodeJs下的测试框架Mocha的简单介绍


Posted in NodeJs onFebruary 22, 2017

介绍和代码下载

Mocha在2011年发布,是目前最为流行的javascript框架之一,在本文我们重点介绍它在NodeJs上的使用。

如果你需要下载实例代码,可以通过去官网查找。https://mochajs.org/

下载代码后安装依赖:

$ cd DemoOfMocha
$ npm install

代码目录结构如图所示:

NodeJs下的测试框架Mocha的简单介绍

您可以按照代码目录结构在根目录新建lib文件夹和test文件夹,再在test文件夹中新建lib文件夹,然后通过npm init命令来生成package.json,也可以先将代码下载下来跑一下

第一个测试

现在在lib目录下新建一个sum.js文件

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

接下来测试这个脚本,在test目录下的lib文件夹中新建测试脚本:sum.js

//test/lib/sum.js

var sum = require('../../lib/sum')
var assert = require('assert')

describe('和函数的测试',function () {
 it('1加1应该等于2',function () {
 var expect=10;
 assert.equal(sum(1,1),expect);
 })
})

上面的代码是测试脚本,测试脚本可以独立执行,测试脚本里应该包含一个或者多个 describe 块,每个describe块也应该包含一个或者多个 it 块

describe 块是“ 测试套件”,表示一组相关的测试,是一个函数,第二个是实际可以执行的函数

It 块是“测试用例” 表示一个单独的测试,测试的最小单位,也是一个函数,第一参数是测试用例的名称或说明,第二个参数是实际可以执行的函数

assert 是断言包(断言包有很多种,这里我使用NodeJs自带的断言包),判断测试代码的执行结果和预期的结果是否一致,不一致的话抛出一个错误,在我们的测试脚本中,sum(1,1),结果应该等于2

我们在这里介绍一下Assert的断言模块的一些函数

assert.fail(actual, expected, message, operator)

使用指定操作符测试actual(真实值)是否和expected(期望值)一致。

assert.ok(value, [message])

测试实际值是否为true,和assert.equal(true, value, message);作用一致

assert.equal(actual, expected, [message])

使用等值比较操作符( == )测试真实值是否浅层地(shallow),强制性地(coercive)和预期值相等。

assert.notEqual(actual, expected, [message])

使用不等比较操作符( != )测试真实值是否浅层地(shallow),强制性地(coercive)和预期值不相等。

assert.deepEqual(actual, expected, [message])

测试真实值是否深层次地和预期值相等。

assert.notDeepEqual(actual, expected, [message])

测试真实值是否深层次地和预期值不相等。

assert.strictEqual(actual, expected, [message])

使用严格相等操作符 ( === )测试真实值是否严格地(strict)和预期值相等。

assert.notStrictEqual(actual, expected, [message])

使用严格不相等操作符 ( !== )测试真实值是否严格地(strict)和预期值不相等。

assert.throws(block, [error], [message])

预期block时抛出一个错误(error), error可以为构造函数,正则表达式或者其他验证器。

接下来我们在package.json中更新一下scripts字段

{
 "name": "DemoOfMocha",
 "version": "1.0.0",
 "description": "demo of mocha",
 "main": "index.js",
 "directories": {
 "test": "test"
 },
 "dependencies": {},
 "devDependencies": {},
 "scripts": {
 "test": "NODE_ENV=test mocha test/**/*.js"
 },
 "keywords": [
 "deom",
 "mocha"
 ],
 "author": "wjszxli",
 "license": "ISC"
}

我们通过npm命令去安装MochaJS

$ npm install mocha --save-dev

我们添加了运行测试的命令,接下来通过命令来获得测试报告

$ npm test

测试报告如下:

NodeJs下的测试框架Mocha的简单介绍

这样,我们第一个测试就成功了

让测试报告变得更漂亮

我们可以使用mochawesome模块,生成漂亮的HTML格式的报告,如图:

NodeJs下的测试框架Mocha的简单介绍

通过如下命令进行安装mochawesome

$ npm install --save-dev mochawesome

然后更新在package.json中的scripts字段

"name": "DemoOfMocha",
 "version": "1.0.0",
 "description": "demo of mocha",
 "main": "index.js",
 "directories": {
 "test": "test"
 },
 "dependencies": {},
 "devDependencies": {
 "mocha": "^3.2.0",
 "mochawesome": "^2.0.4"
 },
 "scripts": {
 "test": "NODE_ENV=test mocha test/**/*.js --reporter mochawesome"
 },
 "keywords": [
 "deom",
 "mocha"
 ],
 "author": "wjszxli",
 "license": "ISC”
}

运行测试命令,测试报表就在mochawesome-reports中生成了

NodeJs下的测试框架Mocha的简单介绍

用浏览器打开下的html页面,我们会看到漂亮的测试报告

NodeJs下的测试框架Mocha的简单介绍

异步测试

Mocha默认每个测试用例最多执行2000毫秒,2000毫秒之后没有得到结果,就会报错,如果涉及到异步操作的测试用例,2000毫秒是不够的,这个时候我们需要用 -t 或 —timeout 参数指定超时门槛

我们可以修改在package.json中的scripts字段(我们这里改成3000毫秒)

"scripts": {
 "test": "NODE_ENV=test mocha -t 3000 timeout test/**/*.js --reporter mochawesome”
},

写一个异步测试脚本

//test/lib/timeout.js


var assert = require('assert')

describe('测试应该3000毫秒后结束',function () {
 it('测试应该3000毫秒后结束',function (over) {
 var a=false;
 var b = function () {
  a=true;
  assert.ok(a);
  over();
 };
 setTimeout(b,2500);
 })
})

这个测试用例在执行 it 块的时候传入了一个参数 over,在测试结束的时候 必须显式的调用这个函数,告诉Mocha测试结束了,否则Mocha就会等到超时结束的时候报错。

输入命令运行测试用例

NodeJs下的测试框架Mocha的简单介绍

我们也可以测试异步请求内部地址或者外部的接口,这里我们请求内部地址为例子:

 在根目录新建:app.js

var express = require('express')
var app = express();

app.get('/api/test',function (req,res) {
 res.send({})
})

var port = process.env.PORT || 3000

if (process.env.NODE_ENV !== 'test') {
 app.listen(port);
 console.log('start from http://localhost:' + port)
} else {
 module.exports = app;
}

在test目录下的lib文件夹中新建 async.js

//test/lib/async.js

var http = require('http')
var assert = require('assert')
var request = require('superagent');

describe("测试异步请求",function () {
 it("测试异步请求返回一个对象",function (next) {
 request
  .get('http://localhost:3000/api/test')
  .end(function(err, res){
  //expect(res).to.be.an('object');
  console.log(res.body);
  assert.deepEqual(res.body,Object)
  next();
  });
 })
})

测试结果

NodeJs下的测试框架Mocha的简单介绍

Mocha支持对Promist的测试,允许直接返回Promise,等到他的状态发生变化之后,再执行断言

//test/lib/promise.js

var fetch = require('node-fetch');
var http = require('http')
var assert = require('assert')

describe('Promise 异步测试',function () {
 it('异步Promise返回一个对象',function () {
 return fetch('http://localhost:3000/api/test')
  .then(function(res) {
  return res.json();
  }).then(function(json) {
  console.log(json)
  assert.deepEqual(json,{});
  });
 })
})

执行测试

NodeJs下的测试框架Mocha的简单介绍

测试的钩子

在 describe 块之中,有四个测试用例的钩子:before()、after()、beforeEach()和afterEach()。它们会在指定时间执行。

describe('hooks', function() { 
 before(function() { 
 // 在当前区块的所有测试用例之前执行 
 }); 
 after(function() { 
 // 在当前区块的所有测试用例之后执行 
 }); 
 beforeEach(function() { 
 // 在当前区块的每个测试用例之前执行 
 }); 
 afterEach(function() { 
 // 在当前区块的每个测试用例之后执行 
 }); 
 //测试用例 
});

在test目录下的lib文件夹中新建 hooks.js

//test/lib/hooks.js
var assert = require('assert')

describe('hook示例', function() {
 var foo = false;

 beforeEach(function() {
 foo = true;
 });

 it('修改foo要成功', function() {
 assert.ok(foo)
 });
});

测试结果

NodeJs下的测试框架Mocha的简单介绍

测试用例管理

如果项目有很多测试用例,但有的时候只希望运行其中几个,这个时候可以用 only 方法,describe 块和 it 块都允许 only 方法,表示只允许运行带有 only 的测试用例

在test目录下的lib文件夹中新建 only.js

//test/lib/only.js

var sum = require('../../lib/sum')
var assert = require('assert')

describe('和函数的测试',function () {
 it('1加2应该等于3',function () {
 var expect=3;
 assert.equal(sum(1,2),expect);
 })

 it.only('3加4应该等于7',function () {
 var expect=7;
 assert.equal(sum(3,4),expect);
 })
})

测试结果:

NodeJs下的测试框架Mocha的简单介绍

还有 skip 方法,表示跳过指定的测试用例

在test目录下的lib文件夹中新建 skip.js

//test/lib/only.js

var sum = require('../../lib/sum')
var assert = require('assert')

describe('和函数的测试',function () {
 it('5加6应该等于11',function () {
 var expect=11;
 assert.equal(sum(5,6),expect);
 })

 it.skip('7加8应该等于15',function () {
 var expect=15;
 assert.equal(sum(7,8),expect);
 })
})

测试结果如下,跳过的用 - 号表示

NodeJs下的测试框架Mocha的简单介绍

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 #NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 #NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 #NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 #NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 #NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 #NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 #NodeJs
You might like
全国中波电台频率表
2020/03/11 无线电
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
php探针不显示内存解决方法
2019/09/17 PHP
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
js闭包的9个使用场景
2020/12/29 Javascript
[06:16]第十四期-国士无双绝地翻盘之撼地神牛
2014/06/24 DOTA
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
Python函数参数类型*、**的区别
2015/04/11 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
详解python配置虚拟环境
2019/04/08 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
Python try except else使用详解
2021/01/12 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
公司财务会计主管应聘求职信
2014/09/26 职场文书
2014年党总支工作总结
2014/12/18 职场文书
搬迁通知
2015/04/20 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
防止web项目中的SQL注入
2021/12/06 MySQL
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js