mocha 是一個功能豐富的javascript測試框架型凳,可以運(yùn)行在nodejs和瀏覽器環(huán)境心俗,使異步測試變得簡單有趣。mocha 串聯(lián)運(yùn)行測試回官,允許靈活和精確地報(bào)告結(jié)果曹宴,同時映射未捕獲的異常用來糾正測試用例。
支持TDD/BDD 的 開發(fā)方式孙乖,結(jié)合 should.js/expect/chai/better-assert 斷言庫浙炼,能輕松構(gòu)建各種風(fēng)格的測試用例份氧。
安裝
npm install -g mocha
起步
//模塊依賴
var assert = require("assert");
//斷言條件
describe('Array', function(){
describe('#indexOf()', function(){
it('當(dāng)值不存在時應(yīng)該返回 -1', function(){
assert.equal(-1, [1,2,3].indexOf(5));
assert.equal(-1, [1,2,3].indexOf(0));
});
});
});
重要的有二步:
- 加載模塊
- 設(shè)置斷言: assert.equal(實(shí)際值唯袄,期望值,返回信息)蜗帜。當(dāng)實(shí)際與期望相同的時候恋拷,顯示錯誤
測試驅(qū)動開發(fā) TDD
行為驅(qū)動開發(fā) BDD
exports風(fēng)格
簡要說明BDD的使用
BDD認(rèn)為,不應(yīng)該針對代碼的實(shí)現(xiàn)細(xì)節(jié)寫測試厅缺,而是要針對行為寫測試蔬顾。BDD測試的是行為,即軟件應(yīng)該怎樣運(yùn)行湘捎。
BDD接口提供以下方法:
describe():測試套件
it():測試用例
before():所有測試用例的統(tǒng)一前置動作
after():所有測試用例的統(tǒng)一后置動作
beforeEach():每個測試用例的前置動作
afterEach():每個測試用例的后置動作
var expect = require('chai').expect;
describe('Array', function(){
before(function(){
console.log('在測試之前運(yùn)行');
});
describe('#indexOf()', function(){
it('當(dāng)值不存在時應(yīng)該返回 -1', function(){
expect([1,2,3].indexOf(4)).to.equal(-1);
});
});
});
運(yùn)行的命令
$ mocha ./step2.js
hook機(jī)制
hook 就是在測試流程的不同時段觸發(fā)诀豁,比如在整個測試流程之前,或在每個獨(dú)立測試之前等窥妇。
hook也可以理解為是一些邏輯舷胜,通常表現(xiàn)為一個函數(shù)或者一些聲明,當(dāng)特定的事件觸發(fā)時 hook 才執(zhí)行活翩。
提供方法有:before()烹骨、beforeEach() after() 和 afterEach()。
方法解析:
before():所有測試用例的統(tǒng)一前置動作
after():所有測試用例的統(tǒng)一后置動作
beforeEach():每個測試用例的前置動作
afterEach():每個測試用例的后置動作
var expect = require('chai').expect;
describe('hooks', function() {
before('可以加入描述',function() {
//在執(zhí)行本區(qū)塊的所有測試之前執(zhí)行
});
after('可以加入描述',function() {
//在執(zhí)行本區(qū)塊的所有測試之后執(zhí)行
});
beforeEach('可以加入描述',function() {
//在執(zhí)行本區(qū)塊的每個測試之前都執(zhí)行
});
afterEach('可以加入描述',function() {
//在執(zhí)行本區(qū)塊的每個測試之后都執(zhí)行
});
//測試用例
describe('#indexOf()', function(){
it('當(dāng)值不存在時應(yīng)該返回 -1', function(){
expect([1,2,3].indexOf(4)).to.equal(-1);
});
});
});
測試用例占位只要添加一個沒有回調(diào)的 it() 方法即可:
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
//同步測試
it('當(dāng)值不存在時應(yīng)該返回 -1', function() {
assert.equal(-1, [1,2,3].indexOf(5));
assert.equal(-1, [1,2,3].indexOf(0));
});
});
describe('Array', function() {
describe('#indexOf()', function() {
//下面是一個掛起的測試
it('當(dāng)值不存在時應(yīng)該返回 -1');
});
});
});
僅執(zhí)行指定測試的特性可以讓你通過添加 .only() 來指定唯一要執(zhí)行的測試套件或測試用例:
describe('Array', function(){
describe.only('#indexOf()', function(){
...
})
})
或一個指定的測試用例:
describe('Array', function(){
describe('#indexOf()', function(){
it.only('當(dāng)值不存在時應(yīng)該返回 -1', function(){
})
it('當(dāng)值不存在時應(yīng)該返回 -1', function(){
})
})
})
忽略指定測試
該特性和 .only() 非常相似材泄,通過添加 .skip() 你可以告訴 Mocha 忽略的測試套件或者測試用例(可以有多個)沮焕。該操作使得這些操作處于掛起的狀態(tài),這比使用注釋來的要好拉宗,因?yàn)槟憧赡軙洶炎⑨尳o取消掉峦树。
describe('Array', function(){
describe.skip('#indexOf()', function(){
...
})
})
或一個指定的測試用例:
describe('Array', function(){
describe('#indexOf()', function(){
it.skip('當(dāng)值不存在時應(yīng)該返回 -1', function(){
})
it('當(dāng)值不存在時應(yīng)該返回 -1', function(){
})
})
})
動態(tài)生成測試
由于mocha 可以使用 function.prototype.call 和function 表達(dá)式定義測試套件和測試用例,所以可以動態(tài)生成測試用例旦事。
var assert = require('assert');
function add() {
return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
return prev + curr;
}, 0);
}
describe('add()', function() {
var tests = [
{args: [1, 2], expected: 3},
{args: [1, 2, 3], expected: 6},
{args: [1, 2, 3, 4], expected: 10}
];
tests.forEach(function(test) {
it('correctly adds ' + test.args.length + ' args', function() {
var res = add.apply(null, test.args);
assert.equal(res, test.expected);
});
});
});
hook機(jī)制
簡要說明TDD的使用
TDD(測試驅(qū)動開發(fā))組織方式是使用測試集(suite)和測試(test)魁巩。
每個測試集都有* setup 和 teardown 函數(shù)*。這些方法會在測試集中的測試執(zhí)行前執(zhí)行族檬,它們的作用是為了避免代碼重復(fù)以及最大限度使得測試之間相互獨(dú)立歪赢。
TDD接口:
suite:類似BDD中 describe()
test:類似BDD中 it()
setup:類似BDD中 before()
teardown:類似BDD中 after()
suiteSetup:類似BDD中 beforeEach()
suiteTeardown:類似BDD中 afterEach()
var assert = require("assert");
suite('Array', function(){
setup(function(){
console.log('測試執(zhí)行前執(zhí)行');
});
suite('#indexOf()', function(){
test('當(dāng)值不存在時應(yīng)該返回 -1', function(){
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
運(yùn)行的命令
$ mocha --ui tdd ./step2.js
這里需要明確指定tdd方式
簡要說明exports風(fēng)格的使用
exports類似于nodejs里的模塊語法,關(guān)鍵字 before, after, beforeEach, 和 afterEach 是特殊保留的,值為對象時是一個測試套件单料,為函數(shù)時則是一個測試用例埋凯。