Node測(cè)試框架Mocha

下面鏈接送你去參考阮一峰老師的文章吧,或者有興趣看看我的重點(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 等同于 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 青春期 初二的時(shí)候 班里的刺頭 語文課上老師問總雖然但是造句全班寂靜 我和同桌低著頭吃著辣條 “好 畢震 就你來回...
    從小不愛吃魚閱讀 311評(píng)論 2 0
  • 寧欺白須公,莫欺少年窮。終須有日龍穿鳳,唔信一世褲穿窿。這話,許多人都知道,只是能夠做到的少之又少。我,就是那個(gè)被...
    幽小窗閱讀 845評(píng)論 32 39
  • 我對(duì)于畫畫只有熱愛,但,是一個(gè)純純的小白,連需要的工具都是看完心藍(lán)老師的視頻才懂,紙和筆都分許多種。 我記得小時(shí)候...
    謙玥兒閱讀 338評(píng)論 0 0

友情鏈接更多精彩內(nèi)容