使用karma+mocha進(jìn)行前端測(cè)試驅(qū)動(dòng)開發(fā)(一)

目前來看 karma+mocha 非常適合做 TDD(測(cè)試驅(qū)動(dòng)開發(fā))办绝。

測(cè)試驅(qū)動(dòng)開發(fā)(英語:Test-driven development锐墙,縮寫為 TDD)是一種軟件開發(fā)過程中的應(yīng)用方法鳞尔,由極限編程中倡導(dǎo)滥比,以其倡導(dǎo)先寫測(cè)試程序,然后編碼實(shí)現(xiàn)其功能得名臼隔。

TDD 提倡寫代碼之前先把單測(cè)寫好嘹裂,然后通過單測(cè)來驗(yàn)證代碼是否正確。這就需要有一個(gè)單測(cè)框架(即 mocha)摔握,但這還不夠寄狼,也不能每寫完一次就運(yùn)行一下單測(cè)代碼,這也效率太低了吧氨淌,所以還需要一個(gè)框架(即 karma)來做這個(gè)事情泊愧。

這里先介紹一些 JS 單測(cè)框架 mocha(https://github.com/mochajs/mochatj 大神的作品盛正,奈何大神覺得 Node 沒搞頭去搞 go 了)删咱。安裝還是比較簡(jiǎn)單,這里就不多說了蛮艰。提醒一下腋腮,如果是在 Windows 下安裝 Node 的話可能需要設(shè)置一下環(huán)境變量雀彼。

實(shí)例:一個(gè)加法模塊src/add.js的代碼:

function add(x, y) {

return  x  +  y;

}

module.exports = add;

|

各個(gè)語言寫單測(cè)都差不多,就是對(duì)預(yù)期結(jié)果的斷言即寡。上面代碼對(duì)應(yīng)的測(cè)試代碼tests/add.test.js

var add = require('../src/add.js');

var assert = require('chai').assert;

describe('加法函數(shù)的測(cè)試', function() {

it('1 加 1 應(yīng)該等于 2',  function()  {

    assert.equal(add(1,  1),  2);

});

});

|

測(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ù)轻局。

斷言庫有很多種,mocha 并不限制使用哪一種样刷。上面代碼引入的斷言庫是 chai仑扑,并且指定使用它的assert斷言風(fēng)格。因?yàn)檫@更接近其它語言的風(fēng)格置鼻。

運(yùn)行一下測(cè)試代碼:

大概流程就是這樣镇饮,詳細(xì)的可以查看官方文檔。隨便說一下箕母,WebStorm 和 PhpStorm 原生支持 mocha储藐,設(shè)置一下即可右鍵運(yùn)行時(shí)直接調(diào)用 mocha 來運(yùn)行當(dāng)前 JS 單測(cè)文件:

單測(cè)已經(jīng)寫好了,怎么能讓測(cè)試驅(qū)動(dòng)我開發(fā)呢司蔬?這時(shí)候就需要 karma(https://github.com/karma-runner/karma)登場(chǎng)了邑茄。如 github 主頁上所說,Karma 不是一個(gè)測(cè)試框架俊啼,也不是一個(gè)斷言庫,僅僅啟動(dòng)一個(gè) http server左医,并通過你熟知的測(cè)試框架生成運(yùn)行測(cè)試的HTML授帕。Karma 支持的測(cè)試框架非常多,如前文介紹浮梢,我們這里選擇的是 mocha 測(cè)試框架和 chai 斷言庫跛十。

首先安裝 karma,然后使用karma init my.conf.js命令生成配置文件秕硝。生成文件的過程是交互式的芥映,很友好,注意選擇測(cè)試框架是 mocha。選錯(cuò)了也沒關(guān)系奈偏,配置文件之后可以手動(dòng)編輯坞嘀,大概長(zhǎng)這樣:

// Karma configuration

module.exports = function(config) {

config.set({

// base path that will be used to resolve all patterns (eg. files, exclude)

basePath:  '',

// frameworks to use

// available frameworks: https://npmjs.org/browse/keyword/karma-adapter

frameworks:  ['mocha',  'requirejs',  'chai'],

// list of files / patterns to load in the browser

files:  [

  'test-main.js',

  {pattern:  'src/*.js',  included:  true},

  {pattern:  'tests/*.test.js',  included:  false}

],

// list of files to exclude

exclude:  [

],

// preprocess matching files before serving them to the browser

// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor

preprocessors:  {

},

// test results reporter to use

// possible values: 'dots', 'progress'

// available reporters: https://npmjs.org/browse/keyword/karma-reporter

reporters:  ['progress'],

// web server port

port:  9876,

// enable / disable colors in the output (reporters and logs)

colors:  true,

// level of logging

// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG

logLevel:  config.LOG_INFO,

// enable / disable watching file and executing tests whenever any file changes

autoWatch:  true,

// start these browsers

// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher

browsers:  ['Chrome'],

// Continuous Integration mode

// if true, Karma captures browsers, runs the tests and exits

singleRun:  false,

// Concurrency level

// how many browser should be started simultaneous

concurrency:  Infinity

})

}

|

比較重要的幾個(gè)參數(shù):

  • frameworks:我們這里需要 mocha 和 chai【矗框架必須預(yù)先通過 npm install karma-xxx --save-dev 命令安裝好丽涩,支持的框架詳見:https://www.npmjs.com/browse/keyword/karma-adapter
  • files:可以配置通配符把源代碼和測(cè)試代碼加載進(jìn)來。
  • browsers:需要啟動(dòng)的瀏覽器
  • autoWatch:觀察文件是否變動(dòng)裁蚁,如有變動(dòng)則重新運(yùn)行單測(cè)矢渊。

最后使用命令karma start my.conf.js運(yùn)行即可。但這里我一直失敗枉证,遇到如下這些錯(cuò)誤:

Chrome 52.0.2743 (Windows 10 0.0.0) ERROR

Uncaught ReferenceError: module is not defined

at src/add.js:5

Chrome 52.0.2743 (Windows 10 0.0.0) ERROR

Uncaught Error: Module name "../src/add.js" has not been loaded yet for context: _. Use require([])

http://requirejs.org/docs/errors.html#notloaded

at node_modules/requirejs/require.js:143

|

這是因?yàn)樯衔牡拇a使用的是node的require()語法矮男,karma是在瀏覽器端運(yùn)行的,當(dāng)然不支持了室谚。如果你的源代碼使用的是 AMD昂灵、CMD 加載器,測(cè)試代碼也要使用 requirejs 等框架加載源代碼模塊舞萄。這里我們將源代碼和測(cè)試代碼稍微改造一下就行了:

function add(x, y) {

return  x  +  y;

}

// module.exports = add;

// var add = require('../src/add.js');

// var assert = require('chai').assert;

var assert = chai.assert;

describe('加法函數(shù)的測(cè)試', function() {

it('1 加 1 應(yīng)該等于 2',  function()  {

    assert.equal(add(1,  1),  2);

});

});

|

成功運(yùn)行:

karma 可以啟動(dòng)不同的瀏覽器眨补,所以還可以做兼容性測(cè)試。

我修改一下源代碼倒脓,karma 能自動(dòng)監(jiān)聽到文件變動(dòng)撑螺,然后顯示單測(cè)結(jié)果,這樣我就能實(shí)時(shí)知道代碼是否有問題崎弃。

當(dāng)然這只是 karma 的一個(gè)功能甘晤,還有很多實(shí)用功能等待后續(xù)學(xué)習(xí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饲做,一起剝皮案震驚了整個(gè)濱河市线婚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盆均,老刑警劉巖塞弊,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泪姨,居然都是意外死亡游沿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門肮砾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诀黍,“玉大人,你說我怎么就攤上這事仗处∶泄矗” “怎么了枣宫?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吃环。 經(jīng)常有香客問我也颤,道長(zhǎng),這世上最難降的妖魔是什么模叙? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任歇拆,我火速辦了婚禮,結(jié)果婚禮上范咨,老公的妹妹穿的比我還像新娘故觅。我一直安慰自己,他們只是感情好渠啊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布输吏。 她就那樣靜靜地躺著,像睡著了一般替蛉。 火紅的嫁衣襯著肌膚如雪贯溅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天躲查,我揣著相機(jī)與錄音它浅,去河邊找鬼。 笑死镣煮,一個(gè)胖子當(dāng)著我的面吹牛姐霍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播典唇,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镊折,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了介衔?” 一聲冷哼從身側(cè)響起恨胚,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炎咖,沒想到半個(gè)月后赃泡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塘装,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年急迂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹦肴。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猴娩,靈堂內(nèi)的尸體忽然破棺而出阴幌,到底是詐尸還是另有隱情勺阐,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布矛双,位于F島的核電站渊抽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏议忽。R本人自食惡果不足惜懒闷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栈幸。 院中可真熱鬧愤估,春花似錦、人聲如沸速址。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芍锚。三九已至昔园,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并炮,已是汗流浹背默刚。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逃魄,地道東北人荤西。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗅钻,于是被迫代替她去往敵國(guó)和親皂冰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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