Mocha发信“摩卡”,是现在最流行的JavaScript测试框架之一。
测试框架:就是一套测试工具、解决方案,有自己的流程和规范。
除了Mocha以外,类似的测试框架还有Jasmine、Karma、Tape等,也很值得学习。
安装
在全局和工程里面安装mocha
npm install --save-dev mocha
npm install mocha -g
有时候mocha运行要依赖于项目node-modules里面的库,这时候使用
npx mocha ...
测试脚本写法
var expect = require('chai').expect;
describe('加法函数的测试', function() {
it('1 加 1 应该等于 2', function() {
expect(add(1, 1)).to.be.equal(2);
});
});
describe块是一个测试套件(test suite),表示一组相关的测试;
it(test case)是一个测试用例。
一般测试文件命名为*.test.js
断言
用来断言结果和预期是否匹配,mocha本身没有断言,可以使用第三方断言库。
断言失败会抛出一个错误,只要不抛出错误,这个测试就通过。
chai的expect风格断言库很接近自然语言风格,例如:
// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });
// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;
// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);
// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;
// match
expect('foobar').to.match(/^foo/);
Mocha基本用法
命令
mocha --help
mocha 后面跟文件、路径(默认当前路径的test目录)
--watch 监视测试文件改动,有改动后重新运行测试。(vs可以先把改动写入缓存,保存后flush到工作区)
--grep 管道筛选
--recursive 递归子级目录文件
配置文件mocha.opts
Mocha允许在test目录下面,放置配置文件mocha.opts,把命令行参数写在里面。
server-tests
--recursive
这样每次运行会自动附件里面的参数。
ES6 测试
- 用babel编译。
npm install babel-core babel-preset-es2015 --save-dev
- 运行测试。
//.babelrc
{
"presents":[ "es2015" ]
}
mpx mocha --compilers js:babel-core/register
--compilers
后面紧跟一个冒号分割的字符串,左边是文件后缀名,右边是处理这类文件模块名。
CoffeeScript也很有趣:
mocha --compilers coffee:coffee-script/register
注意,Babel默认不会对Iterator、Generator、Promise、Map、Set等全局对象,以及一些全局对象的方法(比如Object.assign)转码。如果你想要对这些对象转码,就要安装babel-polyfill。
npm install babel-polyfill --save
然后,在你的脚本头部加上一行:
npm install babel-polyfill --save
异步测试
mocha对异步测试通过情况分两种:
- 用户显示调用了done方法,告诉mocha异步完成;
it('测试应该5000毫秒后结束', function(done) {
var x = true;
var f = function() {
x = false;
expect(x).to.be.not.ok;
done(); // 通知Mocha测试结束
};
setTimeout(f, 4000);
});
- 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');
});
});
mocha对每个异步测试等待时间默认2000毫秒,如果2000之内done方法或者promise状态没有完成变化,则超时。可设置等待时间:
mocha -t 5000 timeout.test.js
测试用例钩子
describe('hooks', function() {
before(function() {
// 在本区块的所有测试用例之前执行
});
after(function() {
// 在本区块的所有测试用例之后执行
});
beforeEach(function() {
// 在本区块的每个测试用例之前执行
});
afterEach(function() {
// 在本区块的每个测试用例之后执行
});
// test cases
});
测试用例管理
有些测试用例是否运行,不需要注释,describe和it都可以用skip或者only。
it.only('1 加 1 应该等于 2', function() {
expect(add(1, 1)).to.be.equal(2);
});
it('任何数加0应该等于自身', function() {
expect(add(1, 0)).to.be.equal(1);
});
只要有it方法被调用,mocha只会执行only标记的方法。
mocha应该it方法是将执行函数入栈,经过筛选执行,而非立即执行。
网友评论