常用的前端自動(dòng)化測(cè)試工具介紹 —— Karma(一)

在開發(fā)的過程中栅盲,除了代碼本身,測(cè)試也是重要的一環(huán)。大體來說晰赞,測(cè)試分為以下幾種類型:

  • 單元測(cè)試
  • 功能測(cè)試
  • 性能測(cè)試
  • 安全測(cè)試

對(duì)于普通開發(fā)者而言,單元測(cè)試和功能測(cè)試是最常見的兩種測(cè)試方式,本系列文章要介紹的幾個(gè)工具是針對(duì)這兩個(gè)方面的掖鱼。
單元測(cè)試是對(duì)某一塊獨(dú)立的業(yè)務(wù)模塊進(jìn)行測(cè)試然走,可以是一個(gè)小功能,甚至一個(gè)函數(shù)戏挡。在前端開發(fā)中芍瑞,我們可以選用 Karma 進(jìn)行代碼的單元測(cè)試,這個(gè)工具十分強(qiáng)大褐墅,它集成了像 Jasmine(基于 BDD 的測(cè)試框架)拆檬,PhantomJS(無界面的瀏覽器) 這些測(cè)試套件。還有一些其他有用的功能妥凳,比如生成代碼覆蓋率的報(bào)告等竟贯。
本文只介紹 Karma 的基本使用。

單元測(cè)試工具 Karma

要使用 Karma 對(duì)代碼進(jìn)行單元測(cè)試逝钥,首先需要安裝一系列的相關(guān)插件屑那。我們來新建一個(gè)名為 myKarmDemo 的目錄,并安裝相關(guān)的插件:

npm install karma-cli -g
npm install karma jasmine-core karma-jasmine karma-phantomjs-launcher -D

接下來對(duì)我們的工程進(jìn)行初始化:

karma init

之后會(huì)彈出一些選項(xiàng)艘款,其中包含了一些初始化的配置工作持际,使用上下方向鍵可以在配置項(xiàng)之間進(jìn)行切換。我這里選擇使用 Jasmine 測(cè)試框架哗咆,使用 PhantomJS 無界面瀏覽器蜘欲,整體的配置選項(xiàng)如下:

myKarmDemo karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> jasmine

Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> PhantomJS

What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> 

Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
> 

Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> no

Config file generated at "/home/charley/Desktop/myKarmDemo/karma.conf.js".

初始化完成之后,會(huì)在我們的項(xiàng)目中生成一個(gè) karma.conf.js 文件岳枷,這個(gè)文件就是 Karma 的配置文件芒填。
配置文件比較簡(jiǎn)單,能夠比較輕松的看懂空繁,這里我對(duì)原始的配置文件進(jìn)行簡(jiǎn)單的修改殿衰,結(jié)果如下:

// Karma configuration
// Generated on Sun Oct 29 2017 21:45:27 GMT+0800 (CST)

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: ['jasmine'],


    // list of files / patterns to load in the browser
    files: [
      "./src/**/*.js",
      "./test/**/*.spec.js",
    ],


    // 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: false,


    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['PhantomJS'],


    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: true,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity
  })
}

然后創(chuàng)建一個(gè) src 目錄和一個(gè) test 目錄,在其中分別創(chuàng)建 index.js 和 index.spec.js 文件盛泡。
我要做的測(cè)試內(nèi)容比較簡(jiǎn)單闷祥,對(duì) index.js 中的兩個(gè)函數(shù)(一個(gè)加法函數(shù),一個(gè)乘法函數(shù))進(jìn)行測(cè)試傲诵。
index.js 文件如下:

// 加法函數(shù)
function add(x){
    return function(y){
        return x + y;
    }
}
// 乘法函數(shù)
function multi(x){
    return function(y){
        return x * y + 1;
    }
}

index.spec.js 文件如下:

describe("運(yùn)算功能單元測(cè)試",function(){
    it("加法函數(shù)測(cè)試",function(){
        var add5 = add(5)
        expect(add5(5)).toBe(10)
    });

    it("乘法函數(shù)測(cè)試",function(){
        var multi5 = multi(5)
        expect(multi5(5)).toBe(25)
    })
})

單測(cè)的代碼寫好后凯砍,就可以使用 karma start 來運(yùn)行單元測(cè)試。由于我們的乘法代碼中有錯(cuò)誤拴竹,因此測(cè)試結(jié)果是這樣的:

myKarmDemo karma start
29 10 2017 22:21:56.283:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
29 10 2017 22:21:56.287:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
29 10 2017 22:21:56.294:INFO [launcher]: Starting browser PhantomJS
29 10 2017 22:21:56.549:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket 0h6boaepSUMwG7l2AAAA with id 44948955
PhantomJS 2.1.1 (Linux 0.0.0) 運(yùn)算功能單元測(cè)試 乘法函數(shù)測(cè)試 FAILED
        Expected 26 to be 25.
        test/index.spec.js:9:31
PhantomJS 2.1.1 (Linux 0.0.0): Executed 2 of 2 (1 FAILED) (0.048 secs / 0.002 secs)

將乘法函數(shù)的代碼改為正常悟衩,再次啟用 karma start 進(jìn)行測(cè)試:

29 10 2017 22:23:08.670:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
29 10 2017 22:23:08.673:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
29 10 2017 22:23:08.685:INFO [launcher]: Starting browser PhantomJS
29 10 2017 22:23:08.940:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket pl_pZDcAK4rBTpr0AAAA with id 40770640
PhantomJS 2.1.1 (Linux 0.0.0): Executed 2 of 2 SUCCESS (0.045 secs / 0.001 secs)

對(duì)了,如果使用 PhantomJS 作為代碼的運(yùn)行環(huán)境栓拜,其對(duì)于 ES6 的支持性不是太好座泳,我在代碼中使用了箭頭函數(shù)惠昔,在運(yùn)行時(shí)就報(bào)錯(cuò)了。為了解決這個(gè)問題挑势,你可以使用 Chrome 或其他瀏覽器進(jìn)行測(cè)試镇防,也需要安裝相應(yīng)的 launcher,如果你使用 Chrome 瀏覽器測(cè)試潮饱,需要安裝 karma-chrome-launcher 插件来氧。
或者,你可以使用 Babel 等工具對(duì)代碼進(jìn)行轉(zhuǎn)碼后進(jìn)行測(cè)試香拉。
使用 PhantomJS 的好處在于其是一個(gè)無界面的瀏覽器運(yùn)行環(huán)境啦扬,可以跑在命令行環(huán)境中,在某些沒有 Chrome 等瀏覽器服務(wù)器環(huán)境下比較好用缕溉,方便代碼驗(yàn)收和集成考传。
對(duì)于 Karma 的介紹就到這里了,本文只是對(duì) Karma 的安裝和使用進(jìn)行了簡(jiǎn)單的介紹证鸥,權(quán)當(dāng)拋磚引玉僚楞,至于更多的用法,您可以再進(jìn)行研究枉层。

完泉褐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸟蜡,隨后出現(xiàn)的幾起案子膜赃,更是在濱河造成了極大的恐慌,老刑警劉巖揉忘,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跳座,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泣矛,警方通過查閱死者的電腦和手機(jī)疲眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來您朽,“玉大人狂丝,你說我怎么就攤上這事』┳埽” “怎么了几颜?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讯屈。 經(jīng)常有香客問我蛋哭,道長(zhǎng),這世上最難降的妖魔是什么涮母? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任具壮,我火速辦了婚禮准颓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棺妓。我一直安慰自己,他們只是感情好炮赦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布怜跑。 她就那樣靜靜地躺著,像睡著了一般吠勘。 火紅的嫁衣襯著肌膚如雪性芬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天剧防,我揣著相機(jī)與錄音植锉,去河邊找鬼。 笑死峭拘,一個(gè)胖子當(dāng)著我的面吹牛俊庇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸡挠,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辉饱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拣展?” 一聲冷哼從身側(cè)響起彭沼,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎备埃,沒想到半個(gè)月后姓惑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡按脚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年于毙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乘寒。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望众,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伞辛,到底是詐尸還是另有隱情烂翰,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布蚤氏,位于F島的核電站甘耿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竿滨。R本人自食惡果不足惜佳恬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一捏境、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毁葱,春花似錦垫言、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至前痘,卻和暖如春凛捏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芹缔。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工坯癣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人最欠。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓示罗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窒所。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹉勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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