盒子
文章目录
  1. 为什么javascript需要做单元测试
  2. 需要的工具
  3. 编写模块化测试
    1. 一个简单的例子
    2. 接下来再写一些别的断言
  4. end
  5. 参考

mocha下的javascript模块化测试

模块化测试,也是单元测试的意思。

单元测试是一种测试你的项目中每个最小单元代码的艺术,是使你的程序思路清晰的基础。

所有的单元都能通过测试,意味着部分(单元)组合而成的整体也能良好的运行,因为这些单元的行为已经被独立的验证过。

为什么javascript需要做单元测试

传统的javascirpt,即jquery+jq插件再加上一堆混乱的代码,虽然这样也可以做出很多很实在很酷的效果,但是非常维护而且也很难做到自动化的测试。

新的标准不断的普及,旧的那一套会慢慢被淘汰,模块化和加载模块在javascript来说是越来越流行了。



做单元测试能让你去更好的划分模块的功能和粒度,也就是说,单元测试能够规范你的javascript模块化。

另一方面,javascript是脚本语言,缺乏很多基本的静态检查代码的能力,单元测试能作为一个很好的补充。

除此之外写单元测试还有很多优点:代码更有条理,易于维护,保证质量,便于梳理思路。

需要的工具

这种测试方式是机遇node的,所以需要先安装node,已经node的包管理工具 npm。
如果你的电脑上还没装过,
点击这里查看详细的安装指引

有了node和npm之后,接下来就是安装mocha和expect。
mocha是一个javascipt的测试框架;expect是帮你封装测试api,给你提供更简便,更语义化的api。

1
2
3
4
5
#mocha 需要全局安装
npm install -g mocha

#expect 安装在当前文件夹环境就可以了
npm install expect

在当前目录下创建被测试的模块,Module.js。然后创建test文件夹,test文件夹下面,创建测试模块的程序,module.js。

文件夹的结构如下

编写模块化测试

一个简单的例子

首先是 被测试的模块文件
Module.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


(function (root, factory)
{

'use strict';

/**
* 让模块支持多种加载规范
*/

if (typeof exports === 'object') {

// CommonJS module
module.exports = factory();

}
else if (typeof define === 'function' && define.amd) {

// AMD. Register as an anonymous module.
define(function (req)
{

return factory();
});

} else {

root.Module = factory();

}
}(this, function ()
{

'use strict';

//模块的具体代码
function Module(){

}

return Module;

}));

自动化测试的代码

test/module.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var 
Module = require('../Module'),
expect = require('expect');

describe('这个Module模块', function ()
{

'use strict';

it('可以支持 CommonJs的加载规范 ', function ()
{

expect(Module).toBeA('function');
})

it('是一个类,能够创建实例对象 ', function ()
{

expect(new Module).toBeA(Module);
});

});

然后命令行里,当前目录下执行 mocha 命令

1
mocha

效果如下图所示

两个测试都能够通过了

接下来再写一些别的断言

修改Module.js 里的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(function (root, factory)
{

'use strict';

/**
* 让模块支持多种加载规范
*/

if (typeof exports === 'object') {

// CommonJS module
module.exports = factory();

}
else if (typeof define === 'function' && define.amd) {

// AMD. Register as an anonymous module.
define(function (req)
{

return factory();
});

} else {

root.Module = factory();

}
}(this, function ()
{

'use strict';

//模块的具体代码
function Module(){
this.number = 1;
this.bool = "a";
this.string = true;

}

return Module;

}));

接下来是测试程序

test/module.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var Module = require('../Module'),
expect = require('expect');

describe('这个Module模块', function ()
{

'use strict';

it('可以支持 CommonJs的加载规范 ', function ()
{

expect(Module).toBeA('function');
})

it('是一个类,能够创建实例对象 ', function ()
{

expect(new Module).toBeA(Module);
});


it('类的属性 number 是一个数字', function ()
{

var module = new Module;
expect(module.number).toBeA('number');
});

it('类的属性 bool 是一个布尔值', function ()
{

var module = new Module;
expect(module.bool).toBeA('boolean');
});

it('类的属性 string 是一个字符串', function ()
{

var module = new Module;
expect(module.string).toBeA('string');
});
});

执行mocha命令,结果如下图所示:

很明显,这里有两个不通过的地方,因为this.bool是一个字符串并不是布尔值。同样地,this.string是一个布尔值而不是所期望的字符串。

end

上面的例子只是简单的介绍了基于node,mocha,expect等工具下的自动化模块测试。
但其实测试是一个很广泛而复杂的领域,我也只是昨天才研究的javascript模块化测试。如果你看到这篇文章哪里有什么问题,或者你有最佳实践方式,欢迎你告诉我~

参考

Test-Driven Development in Node.js With Mocha

初识 mocha in NodeJS