原作者: 阮一峰
原文地址:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
Mocha (發(fā)音"摩卡")誕生于 2011 年岂津,是現(xiàn)在最流行的 JavaScript 測(cè)試框架之一斋竞,在瀏覽器和 Node 環(huán)境都可以自由使用富弦。
所謂"測(cè)試框架"障贸,就是運(yùn)行測(cè)試的工具窿祥。通過(guò)它,可以為 JavaScript 應(yīng)用添加測(cè)試呛讲,從而保證代碼的質(zhì)量朱嘴。
本文全面介紹如何使用 Mocha,讓你輕松上手尤蒿。如果你以前對(duì)測(cè)試一無(wú)所知郑气,本文也可以當(dāng)作 JavaScript 單元測(cè)試入門(mén)。值得說(shuō)明的是腰池,除了 Mocha 以外尾组,類(lèi)似的測(cè)試框架還有 Jasmine、Karma示弓、Tape 等讳侨,也很值得學(xué)習(xí)。
一奏属、安裝
原作者為了本文跨跨,寫(xiě)了一個(gè)示例庫(kù) Mocha-demos,清閑安裝這個(gè)庫(kù)。
$ git clone https://github.com/ruanyf/mocha-demos
如果你的電腦沒(méi)有安裝 Git囱皿,則可以直接下載 zip壓縮包勇婴,進(jìn)行解壓。
然后嘱腥,進(jìn)入 mocha-demos 目錄耕渴,在每個(gè) demo 中安裝依賴(lài)(你的電腦必須有 Node)。
$ cd mocha-demos
$ npm ** install
上面的代碼會(huì)在目錄內(nèi)部安裝 Mocha齿兔,為了操作方便萨螺,請(qǐng)?jiān)谌汁h(huán)境也安裝一下 Mocha。
$ npm install -g mocha
二愧驱、測(cè)試腳本的寫(xiě)法
Mocha 的作用是運(yùn)行測(cè)試腳本,首先必須學(xué)會(huì)寫(xiě)測(cè)試腳本椭盏。所謂"測(cè)試腳本"组砚,就是用來(lái)測(cè)試源碼的腳本。下面是一個(gè)加法模塊 add.js 的代碼掏颊。
// add.js
function add(x, y) {
return x + y;
}
module.exports = add;
要測(cè)試這個(gè)加法模塊是否正確糟红,就要寫(xiě)測(cè)試腳本艾帐。
通常,測(cè)試腳本與所要測(cè)試的源碼腳本同名盆偿,但是后綴名為 .test.js(表示測(cè)試)或者 .spec.js(表示規(guī)格)柒爸。比如 add.js 的測(cè)試腳本名字就是 add.test.js。
// add.test.js
var add = require('./add.js');
var expect = require('chai').expect;
describe('加法函數(shù)的測(cè)試', function(){
it('1 加 1 應(yīng)該等于 2', function(){
expect(add(1, 1)).to.be.equal(2);
});
});
上面這段代碼事扭,就是測(cè)試腳本捎稚,它可以獨(dú)立執(zhí)行。測(cè)試腳本里面應(yīng)該包括一個(gè)或多個(gè) describe 塊求橄,每個(gè) describe 塊應(yīng)該包括一個(gè)或多個(gè) it 塊今野。
describe 塊被稱(chēng)為"測(cè)試套件"(test suite),表示一組相關(guān)的測(cè)試罐农。它是一個(gè)函數(shù)条霜,第一個(gè)參數(shù)是測(cè)試套件的名稱(chēng)("加法函數(shù)的測(cè)試"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)涵亏。
it 塊被稱(chēng)為"測(cè)試用例"(test case)宰睡,表示一個(gè)單獨(dú)的測(cè)試,是測(cè)試的最小單位气筋。它是一個(gè)函數(shù)拆内,第一個(gè)參數(shù)是測(cè)試用例的名稱(chēng)("1 加 1 應(yīng)該等于 2"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)裆悄。
三矛纹、斷言庫(kù)的用法
上面的測(cè)試腳本里面,有一句斷言光稼。
expect(add(1, 1)).to.be.equal(2);
所謂"斷言"或南,就是判斷源碼的實(shí)際執(zhí)行結(jié)果與預(yù)期結(jié)果是否一致,如果不一致就拋出一個(gè)錯(cuò)誤艾君。上面這句斷言的意思是采够,調(diào)用 add(1, 1) 函數(shù),結(jié)果應(yīng)該等于 2冰垄。
所有的測(cè)試用例(it塊)都應(yīng)該含有一句或多句的斷言蹬癌。它是編寫(xiě)測(cè)試用例的關(guān)鍵。斷言功能由斷言庫(kù)來(lái)實(shí)現(xiàn)虹茶,Mocha 本身不帶斷言庫(kù)逝薪,所以必須引入斷言庫(kù)。
var expect = require('chai').expect;
斷言庫(kù)有很多種蝴罪,Mocha 并不限制使用哪一種董济。上面代碼引入的斷言庫(kù)是 chai,并且指定使用它的 expect 斷言風(fēng)格要门。
expect 斷言的有點(diǎn)是很接近自然語(yǔ)言虏肾,下面是一些例子:
// 相等或不相等
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 斷言的寫(xiě)法都是一樣的。頭部是 expect 方法封豪,尾部是斷言方法谴轮,比如 equal、a/an吹埠、ok第步、match 等。兩者之間使用 to 或 to.be 連接藻雌。
如果 expect 斷言不成立雌续,就會(huì)拋出一個(gè)錯(cuò)誤,事實(shí)上胯杭,只要不拋出錯(cuò)誤驯杜,測(cè)試用例就算通過(guò)。
it('1 加 1 應(yīng)該等于 2', function(){});
上面的這個(gè)測(cè)試用例做个,內(nèi)部沒(méi)有任何代碼鸽心,由于沒(méi)有拋出了錯(cuò)誤,所以還是會(huì)通過(guò)居暖。
四顽频、Mocha的基本用法
有了測(cè)試腳本以后,就可以用Mocha運(yùn)行它太闺。請(qǐng)進(jìn)入 demo01 子目錄糯景,執(zhí)行下面的命令。
$ mocha add.test.js
加法函數(shù)的測(cè)試
? 1 加 1 應(yīng)該等于 2
1 passing (8ms)
上面的運(yùn)行結(jié)果表示省骂,測(cè)試腳本通過(guò)了測(cè)試蟀淮,一共只有 1 個(gè)測(cè)試用例,耗時(shí)是 8 毫秒钞澳。
mocha 命令后面緊跟測(cè)試腳本的路徑和文件名怠惶,可以指定多個(gè)測(cè)試腳本。
$ mocha file1 file2 file3
Mocha 默認(rèn)運(yùn)行 test 子目錄里面的測(cè)試腳本轧粟。所以策治,一般都會(huì)把測(cè)試腳本放在 test 目錄里面,然后執(zhí)行 mocha 就不需要參數(shù)了兰吟。請(qǐng)進(jìn)入 demo02 子目錄通惫,運(yùn)行下面的命令:
$ mocha
加法函數(shù)的測(cè)試
? 1 加 1 應(yīng)該等于 2
? 任何數(shù)加0應(yīng)該等于自身
2 passing (9ms)
這時(shí)可以看到,test 子目錄里面的測(cè)試腳本執(zhí)行了混蔼。但是讽膏,你打開(kāi) test 子目錄,會(huì)發(fā)現(xiàn)下面還有一個(gè) test/dir 子目錄拄丰,里面還有一個(gè)測(cè)試腳本 multiply.test.js府树,并沒(méi)有得到執(zhí)行。原來(lái)料按,Mocha 默認(rèn)只執(zhí)行 test 子目錄下面第一層的測(cè)試用例奄侠,不會(huì)執(zhí)行更下層的用例。
為了改變這種行為载矿,就必須加上 --recursive 參數(shù)垄潮,這時(shí) test 子目錄下面所有的測(cè)試用例----不管在哪一層----都會(huì)執(zhí)行。
$ mocha --recursive
加法函數(shù)的測(cè)試
? 1 加 1 應(yīng)該等于 2
? 任何數(shù)加0應(yīng)該等于自身
乘法函數(shù)的測(cè)試
? 1 乘 1 應(yīng)該等于 1
3 passing (9ms)
五闷盔、通配符
命令行指定測(cè)試腳本時(shí)弯洗,可以使用通配符,同事指定多個(gè)文件逢勾。
$ 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 通配符杨拐,要寫(xiě)成下面這樣:
$ mocha test/{,**/}*.{js|jsx}
六、命令行參數(shù)
除了前面介紹的 --recursive凹炸,Mocha 還可以加上其他命令行參數(shù)戏阅。請(qǐng)?jiān)?demo02 子目錄里面,運(yùn)行下面的命令啤它,查看效果:
6.1 --help奕筐,-h
--help 或 -h 參數(shù),用來(lái)查看 Mocha 的所有命令行參數(shù)
$ mocha --help
6.2 --reporter, -R
--reporter 參數(shù)用來(lái)指定測(cè)試報(bào)告的格式变骡,默認(rèn)是 spec 格式择卦。
$ mocha
# 等同于
$ mocha --reporter spec
除了 spec 格式,官方網(wǎng)站還提供了其他許多報(bào)告格式毡惜。
$ mocha --reporter tap
1..2
ok 1 加法函數(shù)的測(cè)試 1 加 1 應(yīng)該等于 2
ok 2 加法函數(shù)的測(cè)試 任何數(shù)加0應(yīng)該等于自身
# tests 2
# pass 2
# fail 0
上面是 tap 格式報(bào)告的顯示結(jié)果橱健。
--reporters 參數(shù)可以顯示所有內(nèi)置的報(bào)告格式:
$ mocha --reporters
使用 mochawesome 模塊,可以生成漂亮的 HTML 格式的報(bào)告:
$ npm install --save-dev mochawesome
$ mocha --reporter mochawesome
上面代碼中台妆,mocha 命令使用了項(xiàng)目?jī)?nèi)安裝的版本翎猛,而不是全局安裝的版本胖翰,因?yàn)?mochawesome 模塊是安裝在項(xiàng)目?jī)?nèi)的。
然后切厘,測(cè)試結(jié)果報(bào)告就在 mochaawesome-reports 子目錄生成萨咳。
6.3 --growl,-G
打開(kāi) --growl 參數(shù)疫稿,就會(huì)將測(cè)試結(jié)果在桌面上顯示培他。
$ mocha --growl
6.4 --watch -W
--watch 參數(shù)用來(lái)監(jiān)視指定的測(cè)試腳本。只要測(cè)試腳本有變化遗座,就會(huì)自動(dòng)運(yùn)行 Mocha舀凛。
$ mocha --watch
上面命令行執(zhí)行以后,并不會(huì)退出途蒋。這個(gè)時(shí)候你可以另外打開(kāi)一個(gè)終端窗口猛遍,修改 test 目錄下面的測(cè)試腳本 add.test.js,比如刪除一個(gè)測(cè)試用例碎绎,一旦保存螃壤,Mocha 就會(huì)再次自動(dòng)運(yùn)行。
6.5 --bail, -b
--bail 參數(shù)指定只要有一個(gè)測(cè)試用例沒(méi)有通過(guò)筋帖,就停止執(zhí)行后面的測(cè)試用例奸晴,這對(duì)持續(xù)集成很有幫助。
$ mocha --bail
6.6 --grep, -g
--grep 參數(shù)用于搜索測(cè)試用例的名稱(chēng)(即 it 塊的第一個(gè)參數(shù))日麸,然后只執(zhí)行匹配的測(cè)試用例寄啼。
$ mocha --grep "1 加 1"
上面代碼只測(cè)試名稱(chēng)中包含"1 加 1"的測(cè)試用例。
6.7 --invert, -i
-- invert 參數(shù)表示只運(yùn)行不符合條件的測(cè)試腳本代箭,必須與 --grep 參數(shù)配合使用墩划。
$ mocha --grep "1 加 1" --invert
七、配置文件 mocha.opts
Mocha 允許在 test 目錄下面嗡综,放置配置文件 mocha.opts乙帮,把命令行參數(shù)寫(xiě)在里面。請(qǐng)先進(jìn)入 demo03 目錄极景,運(yùn)行下面的命令:
mocha --recursive --reporter tap --growl
上面這個(gè)命令有三個(gè)參數(shù) --recursive察净、--reporter tap、--growl盼樟。
然后氢卡,把這三個(gè)參數(shù)寫(xiě)入test目錄下的 mocha.opts 文件。
--reporter tap
--recursive
--growl
如果測(cè)試用例不是存放在 test 子目錄晨缴,可以在 mocha.opts 寫(xiě)入一下內(nèi)容译秦。
server-tests
--recursive
上面代碼指定運(yùn)行 server-tests 目錄及其子目錄之中的測(cè)試腳本。
八、ES6測(cè)試
如果測(cè)試腳本使用 ES6 來(lái)編寫(xiě)筑悴,那么運(yùn)行測(cè)試之前们拙,需要先用 Babel 轉(zhuǎn)碼。進(jìn)入 demo04 目錄阁吝,打開(kāi) test/add.test.js 文件睛竣,可以看到這個(gè)測(cè)試用例是用 ES6 編寫(xiě)的。
import add from '../src/add.js';
import chai from 'chai';
let expect = chai.expect;
describe('加法函數(shù)的測(cè)試', function(){
it('1 加 1 應(yīng)該等于 2', function(){
expect(add(1, 1)).to.be.equal(2);
});
});
ES6 轉(zhuǎn)碼求摇,需要安裝 Babel
$ npm install babel-core babel-preset-es2015 --save-dev
然后,在項(xiàng)目目錄下面殊者,新建一個(gè) .babelrc 配置文件与境。
{
"presets": ["es2015"]
}
最后,使用 --compilers 參數(shù)指定測(cè)試腳本的轉(zhuǎn)碼器
$ mocha --compilers js:babel-core/register
上面代碼中猖吴,--compilers 參數(shù)后面緊跟一個(gè)用冒號(hào)分隔的字符串摔刁,冒號(hào)左邊是文件的后綴名,右邊是用來(lái)處理這一類(lèi)文件的模塊名海蔽。上面代碼表示共屈,運(yùn)行測(cè)試之前,先用 babel-core/register 模塊党窜,處理一下 .js 文件拗引。由于這里的轉(zhuǎn)碼器安裝在項(xiàng)目?jī)?nèi),所以要使用項(xiàng)目?jī)?nèi)安裝的 Mocha幌衣,如果轉(zhuǎn)碼器安裝在全局矾削,就可以使用全局的 Mocha。
下面是另外一個(gè)例子豁护,使用 Mocha 測(cè)試 CoffeeScript 腳本哼凯。測(cè)試之前,先將 .coffee 文件轉(zhuǎn)成 .js 文件楚里。
$ mocha --compilers coffee:coffee-script/register
注意断部,Babel 默認(rèn)不會(huì)對(duì) Iterator、Generator班缎、Promise蝴光、Map、Set 等全局對(duì)象吝梅,以及一些全局對(duì)象的方法(比如 Object.assign)轉(zhuǎn)碼虱疏,如果你想要對(duì)這些對(duì)象轉(zhuǎn)碼,就要安裝 babel-polyfill苏携。
$ npm install --save-dev babel-polyfill
然后做瞪,在你的腳本頭部加上一行:
import 'babel-polyfill'
九、異步測(cè)試
Mocha 默認(rèn)每個(gè)測(cè)試用例最多執(zhí)行 2000 毫秒,如果到時(shí)沒(méi)有得到結(jié)果装蓬,就報(bào)錯(cuò)著拭。對(duì)于涉及異步操作的測(cè)試用例,這個(gè)時(shí)間往往是不夠的牍帚,需要用 -t 或 --timeout 參數(shù)指定超時(shí)門(mén)檻儡遮。
進(jìn)入 demo05 子目錄,打開(kāi)測(cè)試腳本 timeout.test.js:
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 就無(wú)法知道宪肖,測(cè)試是否結(jié)束,會(huì)一直等到超時(shí)報(bào)錯(cuò)健爬。你可以把這行代碼刪除試試看控乾。
Mocha 默認(rèn)會(huì)高亮顯示超過(guò) 75 毫秒的測(cè)試用例,可以用 -s 或 --slow 調(diào)整這個(gè)參數(shù)娜遵。
$ mocha -t 5000 -s 1000 timeout.test.js
上面命令指定高亮顯示耗時(shí)超過(guò) 1000 毫秒的測(cè)試用例蜕衡。
下面是另外一個(gè)異步測(cè)試的例子 async.test.js
it('異步請(qǐng)求應(yīng)該返回一個(gè)對(duì)象', function(done){
request.get('https://api.github.com')
.end(function(err, res){
expect(res).to.be.an('object');
done();
});
});
運(yùn)行下面命令,可以看到這個(gè)測(cè)試會(huì)通過(guò)设拟。
$ mocha -t 10000 async.test.js
另外慨仿,Mocha 內(nèi)置對(duì) Promiss 的支持,允許直接返回 Promiss纳胧,等到它的狀態(tài)改變镰吆,在執(zhí)行斷言,而不用顯示調(diào)用 done 方法跑慕。請(qǐng)看 promise.test.js万皿。
it('異步請(qǐng)求應(yīng)該返回一個(gè)對(duì)象', function(){
return fetch('https://api.github.com')
.then(function(res){
return res.json();
}).then(function(json){
expect(json).to.be.an('object');
});
});
十摧找、測(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
});
進(jìn)入 demo06 子目錄,可以看到下面兩個(gè)例子位岔。首先是 beforeEach 的例子 beforeEach.test.js如筛。
// beforeEach.test.js
describe('beforeEach示例', function() {
var foo = false;
beforeEach(function() {
foo = true;
});
it('修改全局變量應(yīng)該成功', function() {
expect(foo).to.be.equal(true);
});
});
上面代碼中,beforeEach 會(huì)在 it 之前執(zhí)行抒抬,所以會(huì)修改全局變量妙黍。
另一個(gè)例子 beforeEach-async.test.js 則是演示,如何在 beforeEach 之中使用異步操作瞧剖。
// beforeEach-async.test.js
describe('異步 beforeEach 示例', function(){
var foo = false;
beforeEach(function(done){
setTimeout(function(){
foo = true;
done();
}, 50);
});
it('全局變量異步修改應(yīng)該成功', function(){
expect(foo).to.be.equal(true);
});
});
十一、測(cè)試用例管理
大型項(xiàng)目有很多測(cè)試用例可免。有時(shí)抓于,我們希望只運(yùn)行其中的幾個(gè),這時(shí)可以用 only 方法浇借。 describe 塊和 it 塊都允許調(diào)用 only 方法捉撮,表示只運(yùn)行某個(gè)測(cè)試套件或測(cè)試用例。
進(jìn)入 demo07 子目錄妇垢,測(cè)試腳本 test/add.test.js 就使用了 only巾遭。
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)行:
$ mocha test/add.test.js
加法函數(shù)的測(cè)試
? 1 加 1 應(yīng)該等于 2
1 passing (10ms)
此外闯估,還有 skip 方法灼舍,表示跳過(guò)指定的測(cè)試套件或測(cè)試用例。
it.skip('任何數(shù)加0應(yīng)該等于自身', function(){
expect(add(1, 0)).to.be.equal(1);
});
上面代碼的這個(gè)測(cè)試用例不會(huì)執(zhí)行涨薪。
十二骑素、瀏覽器測(cè)試
除了在命令行運(yùn)行,Mocha 還可以在瀏覽器運(yùn)行
首先刚夺,使用 mocha init 命令在指定目錄生成初始化文件献丑。
$ mocha init demo08
運(yùn)行上面命令,就會(huì)在 demo08 目錄下生成 index.html 文件侠姑,以及配套的腳本和樣式表创橄。
<!DOCTYPE html>
<html>
<body>
<h1>Unit.js test in the browser with Mocha</h1>
<div id="mocha"></div>
<script type="text/javascript" src="mocha.js"></script>
<script type="text/javascript">
mocha.setup('bdd');
</script>
<script type="text/javascript" src="tests.js"></script>
<script type="text/javascript">
mocha.run();
</script>
</body>
</html>
然后,新建一個(gè)源碼文件 add.js:
// add.js
function add(x, y){
return x + y;
}
然后莽红,把這個(gè)文件妥畏,以及斷言庫(kù) chai.js,加入 index.html;
<script type="text/javascript">
mocha.setup('bdd');
</script>
<script type="text/javascript" src="http://chaijs.com/chai.js"></script>
<script type="text/javascript" src="tests.js"></script>
<script type="text/javascript">
mocha.run();
</script>
最后咖熟,在 tests.js 里面寫(xiě)入測(cè)試腳本圃酵。
var expect = chai.expect;
describe('加法函數(shù)的測(cè)試', function(){
it('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);
expect(add(0, 0)).to.be.equal(0);
});
});
現(xiàn)在,在瀏覽器里面打開(kāi) index.html馍管,就可以看到測(cè)試腳本的運(yùn)行結(jié)果郭赐。
十三、生成規(guī)格文件
Mocha 支持從測(cè)試用例生成規(guī)格文件确沸。
進(jìn)入 demo09 子目錄捌锭,運(yùn)行下面的命令:
$ 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