Mocha 测试框架

492 阅读3分钟

测试脚本

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

在测试脚本所在的目录下执行命令,得到测试结果。

1.png

上面的运行结果标识,测试脚本通过了测试,一共只有一个测试用例,耗时 5ms。

mocha 命令后面紧跟 测试脚本的路径和文件名,可以指定多个测试脚本。 因此,如果在不同目录下执行 mocha 命令,后面的路径也不相同。

2.png

Mocha 默认运行 test 子目录里面的测试脚本。所以,如果把测试脚本放在 test 目录里,然后执行 mocha 就不需要参数了。

3.png

上图中通过 mocha 命令,执行的是 add.test.js 测试脚本。

这时可以看到,test 子目录里面的测试脚本 add.test.js 执行了。但是还有一个子目录 test/dir ,里面的 multiply.test.js 并没有执行。

mocha 默认只执行 test 子目录下面第一层的测试用例,不会执行更下层的用例。 为了改变这种行为,就必须加上 --recursive 参数,这时 test 子目录下面所有的测试用例,不论在哪一层,都会执行。

4.png

通配符

命令行指定测试脚本时,可以使用通配符,同时指定多个文件。

$ 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}

参考文章

测试框架 Mocha 实例教程
Mocha.js 官方文档翻译——简单、灵活、有趣