NodeJS编写单元测试

目录

  1. 测试框架
  2. 断言框架
  3. Mock 构建虚拟方法
  4. Rewire 暴露内部方法
  5. API 接口测试
  6. 代码覆盖率

测试框架

框架可以使用 Mocha (http://mochajs.org/)

安装

npm install mocha -g

测试语句

  • describe() 定义一个区块
  • it() 区块内的各个小目标
  • before() 在执行所有 it 前的一系列操作
  • after() 在执行所有 it 后的一系列操作
  • beforeEach() 在执行每个 it 之前的操作
  • afterEach() 在执行每个 it 之后的操作

目录结构

  • lib 存放模块代码的地方
  • test 存放单元测试代码的地方
  • index.js 向外导出模块的地方(在 package.json 中指定)
  • package.json 包描述文件

断言框架

  • should.js
  • expect.js
  • 推荐 chai

const Should = require(‘chai’).should();

直接断言

xx.should.be.equal(yy)

异步结束断言

使用 done() 结束断言.

超时时间

默认 2s 超时时间, 可以使用 mocha -t 10000 进行设置, 或者非箭头函数的 describe 中使用 this.timeout(10000);

Promise

使用插件 chai-as-promised

1
2
3
4
5
6
7
8
var chai = require('chai');
var chaiAsPromised = require('chai-as-promised');

chai.use(chaiAsPromised);

var expect = chai.expect;
var assert = chai.assert;
chai.should();
  • eventually .have.property() | .equal() | .deep.equal()
  • become(sth) 替代 .eventually.deep.equal()
  • fulfilled 断言成功(执行了 resolve), 一般后面要有 then 再具体判断
  • rejected 断言失败(执行了 reject)
  • rejectedWith(str) 断言失败, 判断错误内容( new Error(str) )
  • then

参考资料:

在 Nodejs 中贯彻单元测试

chai-as-promised 插件

Mock 框架

为了在测试过程中, 模拟成功/失败的多种情况, 可以使用 Mock 框架.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var fs = require('fs');
var muk = require('muk');

before(function() {
muk(fs, 'readFile', function(path, encoding, callback) {
process.nextTick(function() {
callback(new Error('mock readFile error'));
});
});
});
// it();
after(function() {
muk.restore();
});

内部接口外部化 - rewire

如何测试没有 exports 出来的一些内部的方法, 或者希望 Mock 内部方法进行行为进行测试

1
2
3
4
5
6
7
8
9
10
11
const rewire = require('rewire')
const lib = rewire('../lib/index.js')

// 获得内部的方法进行测试
const litmit = lib.__get__('limit')
litmit(10)

// 改变内部的全局 const / let / var 常变量
lib.__set__('LOOP_TIMES', 10)
// 改变内部的方法为 Mock 方法
lib.__set__('readFileSync', () => {return '123'})

API 接口测试

supertest 启动服务器, 模拟客户端请求

代码覆盖率

istanbul 对代码的行覆盖, 函数覆盖, 分支覆盖和语句覆盖进行统计.

yarn global add istanbul

进行覆盖率测试: istanbul cover _mocha

参考学习文档: https://www.jianshu.com/p/3bcac18945a3

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.