一、测试框架: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);
});
});