测试脚本
Mocha 的作用是运行测试脚本,所谓“测试脚本”,就是用来测试源码的脚本。
通常,测试脚本与所要测试的源码脚本同名,但是后缀名为 .test.js(表示测试)或者 .spec.js(表示规格)。比如,add.js 的测试脚本名字就是 add.test.js 或者 add.spec.js。
// add.js
function add(x, y) {
return x + y;
}
module.exports = add;
// add.test.js
var add = require('./add.js');
var expect = require('chai').expect; // 引入断言库,指定使用它的 `expect` 断言风格
describe('加法函数的测试', function() { // 测试套件
it('1 加 1 应该等于 2', function() { // 测试用例
expect(add(1, 1)).to.be.equal(2); // 断言
});
});
测试脚本里应该包括一个或多个 describe 块,每个 describe 块应该包括一个或多个 it 块。
describe 块称为"测试套件"(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称("加法函数的测试"),第二个参数是一个实际执行的函数。
it 块称为"测试用例"(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称("1 加 1 应该等于 2"),第二个参数是一个实际执行的函数。
断言库
- 所谓“断言”,就是判断源码的实际执行结果与预期结果是否一致,如果不一致就抛出一个错误。
- 所有的测试用例(it 块)都应该有一句或多句的断言。它是编写测试用例的关键。
- 断言功能由断言库来实现,Mocha 本身不带断言库,所以必须先引入断言库。
- 断言库有很多种,Mocha 并不限制使用哪一种。上面代码引入的断言库是
chai,并且指定使用它的expect断言风格。
Mocha 的基本用法
Mocha 的作用是运行测试脚本,那么有了测试脚本之后,就可以用 Mocha 运行它。
为了在任意目录下使用 mocha 命令,需要在全局安装 Mocha。
npm install --global mocha
如果是使用项目内安装的 mocha,使用命令
node_modules/.bin/mocha
在测试脚本所在的目录下执行命令,得到测试结果。
上面的运行结果标识,测试脚本通过了测试,一共只有一个测试用例,耗时 5ms。
mocha 命令后面紧跟 测试脚本的路径和文件名,可以指定多个测试脚本。
因此,如果在不同目录下执行 mocha 命令,后面的路径也不相同。
Mocha 默认运行 test 子目录里面的测试脚本。所以,如果把测试脚本放在 test 目录里,然后执行 mocha 就不需要参数了。
上图中通过 mocha 命令,执行的是 add.test.js 测试脚本。
这时可以看到,test 子目录里面的测试脚本 add.test.js 执行了。但是还有一个子目录 test/dir ,里面的 multiply.test.js 并没有执行。
mocha 默认只执行 test 子目录下面第一层的测试用例,不会执行更下层的用例。 为了改变这种行为,就必须加上
--recursive参数,这时 test 子目录下面所有的测试用例,不论在哪一层,都会执行。
通配符
命令行指定测试脚本时,可以使用通配符,同时指定多个文件。
$ mocha spec/{my,awesome}.js
$ mocha test/unit/*.js
第一行命令,指定执行 spec 目录下面的 my.js 和 awesome.js。 第二行命令,指定执行 test/unit 目录下面的所有 js 文件。
除了使用 Shell 通配符,还可以使用 Node 通配符。
$ mocha 'test/**/*.@(js|jsx)'
代码指定运行 test 目录下面任何子目录中、文件后缀名为 js 或 jsx 的测试脚本。 注意,Node 的通配符要放在单引号之中,否则星号(*)会先被Shell解释。
上面这行 Node 通配符,如果改用 Shell 通配符,要写成下面这样。
$ mocha test/{,**/}*.{js,jsx}