下面鏈接送你去參考阮一峰老師的文章吧,或者有興趣看看我的重點(diǎn)摘抄!
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
Mocha的基本用法
npm install --global mocha
Mocha的作用是運(yùn)行測(cè)試腳本,首先必須學(xué)會(huì)寫測(cè)試腳本。所謂"測(cè)試腳本",就是用來測(cè)試源碼的腳本。
具體測(cè)試的demo可以根據(jù)阮一峰老師的github中的demo自己試著去敲并測(cè)試,也可以去Node社區(qū)看看狼叔的教程,我這只提供一些皮毛知識(shí),個(gè)人筆記。
測(cè)試腳本里面應(yīng)該包括一個(gè)或多個(gè)describe塊,每個(gè)describe塊應(yīng)該包括一個(gè)或多個(gè)it塊。
describe塊稱為"測(cè)試套件"(test suite),表示一組相關(guān)的測(cè)試。它是一個(gè)函數(shù),第一個(gè)參數(shù)是測(cè)試套件的名稱("加法函數(shù)的測(cè)試"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)。
it塊稱為"測(cè)試用例"(test case),表示一個(gè)單獨(dú)的測(cè)試,是測(cè)試的最小單位。它也是一個(gè)函數(shù),第一個(gè)參數(shù)是測(cè)試用例的名稱("1 加 1 應(yīng)該等于 2"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)。
所有的測(cè)試用例(it塊)都應(yīng)該含有一句或多句的斷言。它是編寫測(cè)試用例的關(guān)鍵。斷言功能由斷言庫來實(shí)現(xiàn),Mocha本身不帶斷言庫,所以必須先引入斷言庫。
斷言庫有很多種,Mocha并不限制使用哪一種。上面代碼引入的斷言庫是chai,并且指定使用它的expect斷言風(fēng)格。
expect斷言的優(yōu)點(diǎn)是很接近自然語言
// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });
// 布爾值為true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;
// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);
// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;
// match
expect('foobar').to.match(/^foo/);
基本上,expect斷言的寫法都是一樣的。頭部是expect方法,尾部是斷言方法,比如equal、a/an、ok、match等。兩者之間使用to或to.be連接。
$ mocha test子目錄里面的測(cè)試腳本執(zhí)行了。但是,test目錄下的測(cè)試無法被執(zhí)行。此時(shí)需要加上參數(shù)--recursive,這時(shí)test子目錄下面所有的測(cè)試用例----不管在哪一層----都會(huì)執(zhí)行。
$ mocha spec/{my,awesome}.js
$ mocha test/unit/*.js
上面的第一行命令,指定執(zhí)行spec目錄下面的my.js和awesome.js。第二行命令,指定執(zhí)行test/unit目錄下面的所有js文件。
除了使用Shell通配符,還可以使用Node通配符。
$ mocha 'test//.@(js|jsx)'
上面代碼指定運(yùn)行test目錄下面任何子目錄中、文件后綴名為js或jsx的測(cè)試腳本。注意,Node的通配符要放在單引號(hào)之中,否則星號(hào)()會(huì)先被Shell解釋。
上面這行Node通配符,如果改用Shell通配符,要寫成下面這樣。
$ mocha test/{,*/}.{js,jsx}
命令行參數(shù)
--help或-h參數(shù),用來查看Mocha的所有命令行參數(shù)。
$ mocha --help
--reporter參數(shù)用來指定測(cè)試報(bào)告的格式,默認(rèn)是spec格式。
mocha --reporter spec 另一種形式 $ mocha --reporter tap
--watch參數(shù)用來監(jiān)視指定的測(cè)試腳本。只要測(cè)試腳本有變化,就會(huì)自動(dòng)運(yùn)行Mocha。
$ mocha --watch
上面命令執(zhí)行以后,并不會(huì)退出。你可以另外打開一個(gè)終端窗口,修改test目錄下面的測(cè)試腳本add.test.js,比如刪除一個(gè)測(cè)試用例,一旦保存,Mocha就會(huì)再次自動(dòng)運(yùn)行。
--grep參數(shù)用于搜索測(cè)試用例的名稱(即it塊的第一個(gè)參數(shù)),然后只執(zhí)行匹配的測(cè)試用例。
$ mocha --grep "1 加 1"
上面代碼只測(cè)試名稱中包含"1 加 1"的測(cè)試用例
--invert參數(shù)表示只運(yùn)行不符合條件的測(cè)試腳本,必須與--grep參數(shù)配合使用。
$ mocha --grep "1 加 1" --invert
配置文件mocha.opts
Mocha允許在test目錄下面,放置配置文件mocha.opts,把命令行參數(shù)寫在里面。
然后,把這三個(gè)參數(shù)寫入test目錄下的mocha.opts文件。
--reporter tap
--recursive
--growl
然后,執(zhí)行mocha就能取得與第一行命令一樣的效果。
$ mocha
如果測(cè)試用例不是存放在test子目錄,可以在mocha.opts寫入以下內(nèi)容。
server-tests
--recursive
上面代碼指定運(yùn)行server-tests目錄及其子目錄之中的測(cè)試腳本。
異步測(cè)試
Mocha默認(rèn)每個(gè)測(cè)試用例最多執(zhí)行2000毫秒,如果到時(shí)沒有得到結(jié)果,就報(bào)錯(cuò)。對(duì)于涉及異步操作的測(cè)試用例,這個(gè)時(shí)間往往是不夠的,需要用-t或--timeout參數(shù)指定超時(shí)門檻。
it('測(cè)試應(yīng)該5000毫秒后結(jié)束', function(done) {
var x = true;
var f = function() {
x = false;
expect(x).to.be.not.ok;
done(); // 通知Mocha測(cè)試結(jié)束
};
setTimeout(f, 4000);
});
上面的測(cè)試用例,需要4000毫秒之后,才有運(yùn)行結(jié)果。所以,需要用-t或--timeout參數(shù),改變默認(rèn)的超時(shí)設(shè)置。
$ mocha -t 5000 timeout.test.js
上面命令將測(cè)試的超時(shí)時(shí)限指定為5000毫秒。
另外,上面的測(cè)試用例里面,有一個(gè)done函數(shù)。it塊執(zhí)行的時(shí)候,傳入一個(gè)done參數(shù),當(dāng)測(cè)試結(jié)束的時(shí)候,必須顯式調(diào)用這個(gè)函數(shù),告訴Mocha測(cè)試結(jié)束了。否則,Mocha就無法知道,測(cè)試是否結(jié)束,會(huì)一直等到超時(shí)報(bào)錯(cuò)。你可以把這行刪除試試看。
Mocha默認(rèn)會(huì)高亮顯示超過75毫秒的測(cè)試用例,可以用-s或--slow調(diào)整這個(gè)參數(shù)。
$ mocha -t 5000 -s 1000 timeout.test.js
上面命令指定高亮顯示耗時(shí)超過1000毫秒的測(cè)試用例。
測(cè)試用例的鉤子
Mocha在describe塊之中,提供測(cè)試用例的四個(gè)鉤子:before()、after()、beforeEach()和afterEach()。它們會(huì)在指定時(shí)間執(zhí)行。
describe('hooks', function() {
before(function() {
// 在本區(qū)塊的所有測(cè)試用例之前執(zhí)行
});
after(function() {
// 在本區(qū)塊的所有測(cè)試用例之后執(zhí)行
});
beforeEach(function() {
// 在本區(qū)塊的每個(gè)測(cè)試用例之前執(zhí)行
});
afterEach(function() {
// 在本區(qū)塊的每個(gè)測(cè)試用例之后執(zhí)行
});
// test cases
});
測(cè)試用例管理
大型項(xiàng)目有很多測(cè)試用例。有時(shí),我們希望只運(yùn)行其中的幾個(gè),這時(shí)可以用only方法。describe塊和it塊都允許調(diào)用only方法,表示只運(yùn)行某個(gè)測(cè)試套件或測(cè)試用例。
it.only('1 加 1 應(yīng)該等于 2', function() {
expect(add(1, 1)).to.be.equal(2);
});
it('任何數(shù)加0應(yīng)該等于自身', function() {
expect(add(1, 0)).to.be.equal(1);
});
上面代碼中,只有帶有only方法的測(cè)試用例會(huì)運(yùn)行。
此外,還有skip方法,表示跳過指定的測(cè)試套件或測(cè)試用例。
it.skip('任何數(shù)加0應(yīng)該等于自身', function() {
expect(add(1, 0)).to.be.equal(1);
});
瀏覽器測(cè)試
呃~,看阮一峰老師的吧,很詳細(xì)!
生成規(guī)格文件
$ mocha --recursive -R markdown > spec.md
上面命令根據(jù)test目錄的所有測(cè)試腳本,生成一個(gè)規(guī)格文件spec.md。-R markdown參數(shù)指定規(guī)格報(bào)告是markdown格式。
如果想生成HTML格式的報(bào)告spec.html,使用下面的命令。
$ mocha --recursive -R doc > spec.html