点击在我的博客 xuxusheng.com 中查看,有更好的排版哦~
2016-08-13 16:28 周六
上周学习了一下 jasmine 的用法,感觉理解和使用的不是非常好。
webpack 的 loader 模块写测试的时候,因为依赖了webpack的上下文和参数,写测试的时候不知道怎么样去mock,看了一下 css-loader 的测试模块,采用 mocha 写的,不太看得懂,于是决定再学习一下 mocha 的使用。
参考:
阮一峰大神的教程:
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
初学测试模块,将一些觉得理解的不太好,或者容易忘记的部分记录下来,以便查阅。
一、
$ mocha
Mocha 默认运行 test
子目录里面的测试脚本。所以一般都会把测试脚本放在 test
目录里面,然后执行 mocha
就可以了。
Mocha 默认只会执行 test
子目录下面第一层的测试用例,不会执行更下层的用例,如果想要遍历所有的子文件夹,需要加上 --recursive
参数。
二、参数
--reporter
--reporter
参数用来指定测试报告的格式,默认是 spec
mochawesome
使用 mochawesome
模块,可以生成漂亮的 HTML 格式的模块。
$ npm install mochawesome -D
$ ../node_modules/.bin/mocha --reporter mochawesome
上面代码中,mocha
命令使用了项目内安装的版本,也就是../node_modules/.bin/mocha
这一段,而不是全局安装的版本,因为 mochawesome
模块是安装在项目内的。
这个
mochawesome
模块我用的时候生成的文件中css文件总是空的,页面没有样式,看这个模块依赖的是 mocha~2 的版本,但是我安装2也还是这样,坑爹。
--watch , -w
--watch
用来监视指定的测试脚本
--bail , -b
--bail
参数指定只要有一个测试用例没有通过,就停止执行后面的测试用例,这对持续集成很有用。
--grep , -g
--grep
参数用户搜索测试用例的名称(即 it
块的第一个参数,然后只执行匹配的测试用例。
$ mocha --grep "1 加 1"
--invert , -i
--invert
参数表示只运行不符合条件的测试脚本,必须与 --grep
参数配合使用,与上相反。
$ mocha --grep "1 加 1" --invert
三、
Mocha 允许在 test
目录下面,放置配置文件 mocha.opts
,把命令行参数写在里面。
$ mocha --recursive --reporter tap --growl
可以将此三个参数写入配置文件中
--reporter tap
--recursive
--growl
然后执行 mocha
即可
如果测试用例不是存放在test目录中,可以在配置文件中写入:
server-tests
--recursive
上面的代码指定运行 server-tests
目录及其子目录之中的测试脚本。
四、使用 es6 语法
这个是重点,要记住。
ES6转码,需要安装 Babel
$ npm install babel-core babel-preset-es2015 --save-dev
然后在项目目录下建一个 .babelrc 配置文件
{
"presets": ["es2015"]
}
最后使用 --compilers
参数指定测试脚本的转码器。
$ ../node_modules/.bin/mocha --compilers js:babel-core/register
重点:
上面代码中,--compilers
参数后面紧跟一个用冒号分隔的字符串,冒号左边是文件的后缀名,右边是用来处理这一类文件的模块名。
上面代码表示,在运行测试之之前,先用 babel-core/register
模块,处理一下 .js
文件。
由于这里的转码器安装在项目内,所有要使用项目内安装的 Mocha,也就是 ../node_modules/.bin/mocha
,如果转码器安装在全局,就可以使用全局的Mocha。
注意:
注意,Babel默认不会对 Iterator、Generator、Promise、Map、Set 等全局对象,以及一些全局对象的方法(比如 Object.assign)转码。如果你想对这些对象转码,就要安装 babel-polyfill
。
$ npm install babel-polyfill --save
然后在脚本头部加上一行
import 'babel-polyfill'
五、异步测试
这个是个重点!!
Mocha 默认每个测试用例最多执行 2000 毫秒,如果没有得到结果,就报错。对于涉及异步操作的测试用例,这个时间往往是不够的,需要用 -t
或 --timeout
参数指定超时门槛。
it('测试应该5000毫秒后结束', function(done) {
var x = true;
var f = function() {
x = false;
expect(x).to.be.not.ok;
done(); // 通知Mocha测试结束
};
setTimeout(f, 4000);
});
上面的测试用例,需要 4000 毫秒之后,才会有运行结果,所以,需要用 -t
或 --timeout
参数,改变默认的超时设置。
$ mocha -t 5000 timeout.test.js
上面的命令将测试的超时时限指定为 5000 毫秒。
另外,上面的测试用例里面,有一个 done
函数。it
块执行的时候,传入了一个 done
参数,当测试结束的时候,必须显示调用这个函数,告诉 Mocha 测试结束了。否则,Mocha 就无法知道,测试是否结束,会一直等到超时报错。
Mocha 默认会高亮显示超过 75 毫秒的测试用例,可以用 -s
或 --slow
调整这个参数。
$ mocha -t 5000 -s 1000 timeout.test.js
上面命令指定高亮显示耗时超过 1000 毫秒的测试用例。
另一个例子:async.test.js
:
it('异步请求应该返回一个对象', function(done){
request
.get('https://api.github.com')
.end(function(err, res){
expect(res).to.be.an('object');
done();
});
});
这个需要安装 superagent 模块。
另外,Mocha 内置对 promise 的支持,允许直接返回 promise,等到它的状态改变,再执行断言,而不用显示的调用done方法
it('异步请求应该返回一个对象', function() {
return fetch('https://api.github.com')
.then(function(res) {
return res.json();
}).then(function(json) {
expect(json).to.be.an('object');
});
});
这个需要安装 node-fetch
模块
六、测试用例的钩子
Mocha 在 describe
块之中,提供测试用例的四个钩子:before()
,after()
,beforeEach()
和afterEach()
。他们会在指定时间执行。
describe('hooks', function() {
before(function() {
// 在本区块的所有测试用例之前执行
});
after(function() {
// 在本区块的所有测试用例之后执行
});
beforeEach(function() {
// 在本区块的每个测试用例之前执行
});
afterEach(function() {
// 在本区块的每个测试用例之后执行
});
// test cases
});
后面的都很重要,直接看原版教程吧。。。。
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html