单元测试

单元测试

单元测试是指对软件中最小可测试单元进行检查验证,也称作模块测试。在nodeJs中通常是指对某个函数或者API进行正确验证,以保证代码的可用性。

单元测试有很多种,常见的有:行为驱动开发(BDD)和 测试驱动开发(TDD)。

  • 行为驱动开发(BDD):行为驱动开发关注的是整个系统的最终实现是否和用户期望一致。
  • 测试驱动开发(TDD):测试驱动开发的目的是取得快速反馈,使所有功能都是可用的。

Mocha

Mocha是现在最流行的一种单元测试框架。Mocha功能比较丰富,支持BDD、TDD

风格的测试,而且支持异步、同步的测试。

安装:

npm install -g mocha

or

npm install -S mocha

简单使用

创建一个demo01.js文件,文件中包含一个求和函数:

function add(...rest){
    return rest.reduce((a,b) => {
        return a + b
    })
}

module.exports = {
    add
}

再创建一个test的文件夹,进行测试:

let lib = require('../demo01.js');
let assert = require('assert');
let should = require('should');

describe('Math',() => {
    describe('#add',() => {
        it('add(0,0) should return 0',() => {
                //使用assert断言库
            // assert.strictEqual(0,lib.add(0,0));

            //使用should.js断言库进行测试
            lib.add(0,0).should.be.equal(0);
        });
        it('add(1,-1) should return 0',() => {
            // assert.strictEqual(0,lib.add(1,-1))
            lib.add(1,-1).should.be.equal(0);
        });
        it('add(1,1) should return 2',() => {
            // assert.strictEqual(2,lib.add(1,1))
            lib.add(1,1).should.be.equal(2)
        });
    })
})

describe(moduleName,testDetail):描述将要测试的模块。

it(info,function()):测试语句放在回调函数中:

  • info 是正确输出时的简单语句描述
  • 一个it对应一个实际的可能情况

关于assets的更多的API,可参考node.js官网

关于should.js的更多的API,可参考should.js官网

然后,在package.json中写一下命令:

"scripts": {
  "test": "mocha"
}

执行命令,mocha即可自动执行test文件夹下所有的测试脚本。

异步测试

使用Mocha进行异步测试,只需要在测试完成之后回调一个回调函数即可,例如:

//异步测试
function asyncFn(callback){
    setTimeout(() => {
        console.log('async');
        callback && callback()
    },1000)
};
module.exports = {
    asyncFn
}

测试:

const lib = require('../demo03.js');

describe('async.js',() => {
    describe('async',() => {
        it('should wait 1000ms',(done) => {
            lib.asyncFn(done);
        })
    })
})

路由测试

需要借用supertest库对后端的API接口进行测试.

安装:

npm install --save-dev supertest

supertest支持各种框架。本例以Express为例:

//测试路由
const express = require('express');
const app = express();

app.get('/user',(req,res) => {
    res.status(200).json({
        name:'ykx',
        age:24
    })
});

module.exports = app;

express设置了一个返回json格式的/user路由,通过get请求,返回用户名和年龄。

测试:

const request = require('supertest');
const app = require('../demo04.js');

describe('GET /user',() => {
    it('should an name with age',(done) => {
        request(app)
        .get('/user')
        .expect('Content-Type','application/json;charset=utf-8')
        .expect(200,{
            name:'ykx',
            age:24
        },done)
    })
})

测试覆盖率

测试覆盖率一般包含四个维度:

  • 行覆盖率:是否每一行都执行了
  • 函数覆盖率:是否每一个函数都执行了
  • 分支覆盖率:是否每个if代码块都执行了
  • 语句覆盖率。是否每个语句都执行了

在NodeJs中可以使用Istanbul代码覆盖率工具。

安装:

npm install -g istanbul

然后在package.json中去配置命令:

"scripts": {
  "test": "mocha",
  "cover":"istanbul cover node_modules/mocha/bin/_mocha test/"
}

执行npm run cover命令,会在根目录下生成coverage文件夹,里面包含所有的测试数据。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!