一、测试框架:Mocha 

JavaScript测试框架之一,在浏览器和Node环境都可以使用,相对比较新的测试框架,可以用来做 TDD(Test-Driven Development)或 BDD(Behavior Driven Development)风格的测试

说明:

TDD:解决的是代码级的验证,但是测试代码与需求的符合问题解决得不是很好,非技术人员、客户看不懂代码,无法评审测试是否符合需求。

BDD:理念是使用自然语言来描述功能,而且强调的是使用例子来说明需求功能。

1、全局变量泄露测试

Mocha 能够发现那种不小心创建出来的全局变量泄露,如果创建了全局变量,它会在测试时抛出错误。如果想禁用全局泄露检查,可以运行 mocha 命令时加上 --ignored-leaks 选项。

2、用 Mocha挂钩定义设置和清理逻辑

BDD 接口 beforeEach()、afterEach()、before()和 after()接受回调,可以用来定义设置和清理逻辑。

3、示例



const memdb = require('..');
describe('memdb', () => {
    describe('.saveSync(doc)', () => {
        it('should save the document', () => {
      });
   });
});



说明:

describe块:被称为测试套件,表示一组相关的测试,它是一个函数,第一个参数是测试套件的名称,第二个参数是一个实际执行的函数。

it块:被称为测试用例,表示一个单独的测试,是测试的最小单位,也是一个函数,第一个参数是测试用例的名字,第二个参数是一个实际执行的函数。

所有的测试用例(it块)都应该含有一句或多句断言,是编写测试用例的关键,Mocha本身不包含断言,断言是由断言库来实现的,因此需要先引入断言库。

4、运行测试代码

mocha默认运行test子目录里面的测试脚本,一般情况下,可以把测试脚本放在test目录下,然后进入项目对应的目录,直接执行mocha命令即可。

上面的命令只会执行test第一层目录下所有文件,并不能执行嵌套目录下的文件。为了执行所有嵌套目录下的文件,使用 mocha --recursive 。

5、制作网页版报告

全局安装:



npm install -g --save-dev mochawesome



执行命令:



mocha --reporter mochawesome



说明:

使用上面的命令生成的报告中包含test目录下所有测试文件,若对某个测试文件生成报告在命令后加XXX.js 。

出现的问题:Mocha里面引用mochawesome失败(ERROR: Unknown "reporter": mochawesome)

解决:全局安装:npm install -g --save-dev mochawesome(之前没全局)

二、断言库

可以理解为比较函数,也就是断言函数是否和预期一致,如果一致则表示测试通过,如果不一致表示测试失败。目前比较受欢迎的断言库有 should.js, expect.js, chai。

1、should.js

它的设计初衷是搭配其他测试框架一起用,我们用的例子是编写代码测试一个定制的模块。Should.js 跟其他框架的搭配很容易,因为它只是给 Object.prototype 增加了一个 should属性。这样你就可以写出表达能力更强的断言,比如 user.role.should.equal('admin'),或者users.should.include('rick')。

示例:



var should = require('should');
const num1 = 3;
describe('示例', function() {
    it('3应该等于3',function() {
        num1.should.equal(3);
    });
    it('3不应该等于2',function() {
        num1.should.not.equal(2);
    });
});



2、expect.js

应用广泛,拥有很好的仿自然语言的方法,追求极简的BDD风格断言库,基于should.js简化。

3、chai

是个流行的断言库,同时支持should、expect 和 assert三种风格的断言库。看起来像是 Node 自带的 assertion 模块,但它还有用来比较对象、数组和它们的属性的工具。比如用 typeof比较类型,用 property检查某个对象是否有我们想要的属性。声明式风格更冗长,但看起来更加通顺。

示例:



//引入断言库chai
const chai = require('chai');
//使用它的assert断言风格
const assert = chai.assert;
const foo = 'bar';
const tea = { flavors: ['char', 'earl grey', 'pg tips'] };
describe('示例',function() {
    it('1',function() {
        assert.typeOf(foo, 'string');
    });
    it('2',function() {
        assert.equal(foo, 'bar');
    });
    it('3',function() {
        assert.lengthOf(foo, 3);
    });
    it('4',function() {
        assert.property(tea, 'flavors');
    });
    it('5',function() {
        assert.lengthOf(tea.flavors, 3);
    });
});