02-如何使用mocha

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));
    });
  });
});

重要的有二步:

  1. 加載模塊
  2. 設(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ù)時則是一個測試用例埋凯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点楼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子白对,更是在濱河造成了極大的恐慌掠廓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩恼,死亡現(xiàn)場離奇詭異蟀瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)条摸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門悦污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钉蒲,你說我怎么就攤上這事切端。” “怎么了顷啼?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵踏枣,是天一觀的道長。 經(jīng)常有香客問我钙蒙,道長茵瀑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任躬厌,我火速辦了婚禮马昨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烤咧。我一直安慰自己偏陪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布煮嫌。 她就那樣靜靜地躺著笛谦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昌阿。 梳的紋絲不亂的頭發(fā)上饥脑,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音懦冰,去河邊找鬼灶轰。 笑死,一個胖子當(dāng)著我的面吹牛刷钢,可吹牛的內(nèi)容都是我干的笋颤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伴澄!你這毒婦竟也來了赋除?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤非凌,失蹤者是張志新(化名)和其女友劉穎举农,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敞嗡,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颁糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉悴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棱貌。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粥惧,靈堂內(nèi)的尸體忽然破棺而出键畴,到底是詐尸還是另有隱情,我是刑警寧澤突雪,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站涡贱,受9級特大地震影響咏删,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜问词,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一督函、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧激挪,春花似錦辰狡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至薄湿,卻和暖如春叫倍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豺瘤。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工吆倦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坐求。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓蚕泽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桥嗤。 傳聞我的和親對象是個殘疾皇子须妻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容