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、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
JS之相等操作符详解
2016/09/13 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python中的CURL PycURL使用例子
2014/06/01 Python
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
wxPython中listbox用法实例详解
2015/06/01 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
Python模块搜索路径代码详解
2018/01/29 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
python的pip有什么用
2020/06/17 Python
物流专业大学生的自我鉴定
2013/11/13 职场文书
计算机专业毕业生的自我评价
2013/11/18 职场文书
《自选商场》教学反思
2014/02/14 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
法制报告会主持词
2014/04/02 职场文书
《学会合作》教学反思
2014/04/12 职场文书
有关环保的标语
2014/06/13 职场文书
2014年统战工作总结
2014/12/09 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
Python之基础函数案例详解
2021/08/30 Python