基于Mocha的单元测试实践

Mocha

前序

在日常开发中,我们常会遇到项目上线迫在眉睫,没有足够的测试时间或者在创业公司做敏捷开发,完全没有测试人员的情况,但我们又必须保证代码质量,尽量减少上线风险,这时我们应该怎么办呢?答案是我们采用测试驱动开发,简称TDD的开发模式。顾名思义,TDD就是 “Test Drive Develop”,在正式开发产品功能前先写单元测试用例,用这些测试用例去保证我们代码的质量,这样就算产品不经过正式测试,我们也对代码中的关键部分可以做到知根知底,将风险控制到一定范围内。那么在Javascript中有一款特别有名的测试框架:Mocha,下面我们就来通过一个例子简单介绍下Mocha的使用方法。

Mocha安装

Mocha可以全局安装也可以局部安装。

1
2
3
4
#全局安装
npm install -g mocha
#局部安装
npm install mocha --save-dev

使用

下面我们来编写单元测试用例。我们新建用于测试的js文件,并添加我们需要测试的函数:

1
2
3
4
function add (a,b ) {
return a+b;
}
module.exports = add;

下面我们先安装下断言库,我们使用chai:

1
2
#安装chai
npm install chai --save-dev

之后,我们编写单元测试用例:

1
2
3
4
5
6
7
8
9
const should = require("chai").should();
const add = (a,b)=>{
return a+b;
}
describe("function test",()=>{
it("test add function",()=>{
add(1,2).should.to.equal(3)
})
})

假设我们局部安装mocha,我们运行如下命令:

1
npx mocha test1.js

之后,我们会得到如下结果:

function test
✓ test add function

1 passing (22ms)

假如我们将上面的断言改成:

1
add(1,2).should.to.equal(2)

我们将得到如下结果:
function test
1) test add function

0 passing (22ms)
1 failing
第一个说明测试成功,第二个结果说明测试失败,这样也就验证了我们写的函数是否得到了正确的输出。但是这样还不够,因为我们虽然验证了函数的正确性,但是却不知道我们编写的测试用例覆盖了多少功能,所以我们必须得到覆盖率来保证我们所有的代码都正常运行。我们需要另外安装一个测试覆盖率检测工具:nyc

1
npm install nyc --save-dev

然后我们运行:

1
npx nyc mocha test1.js

我们会得到如下输出:

———-|———-|———-|———-|———-|——————-|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
———-|———-|———-|———-|———-|——————-|
All files | 100 | 100 | 100 | 100 | |
test1.js | 100 | 100 | 100 | 100 | |
———-|———-|———-|———-|———-|——————-|

好了,由于时间关系,今天就说到这里吧。关于 Mocha 和 Chai 这里还有很多知识没有覆盖到,我会在之后陆续更新~