前端单元测试(一)karma

一直很想做单元测试,也在尝试着开始写,但是由于项目采用vue书写,一是开始写项目的时候没有编写单元测试的意识,导致后期编写有些麻烦,二是新需求层出不穷,没有精力进行编写。但是随着vue-cli更新到2.8,推出了一个vue build的功能后,对于vue的测试变得简单起来。
先讲讲单元测试的工具:karma和mocha

karma

karma是一个测试管理工具,可以很容易和Jasmine、Mocha等市面上常用的测试框架打通,通过其插件可以快速集成到各种环境中。例如:本地环境、持续集成环境。

安装

npm install karma-cli -g
npm install karma --save-dev
npm install karma-mocha --save-dev
npm install karma-chai --save-dev

这里使用mocha作为测试库,chai作为断言库。
使用jasmine的话,可以不引断言库。

初始化

使用cmd或者shell(使用git bash会报错)输入karma init后选择选项。

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

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.
> Chrome

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. > "test/**/*.spec.js" 
>

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.
> yes

之后karma会生成一个karma.conf.js,大体上就是我们之前的选项。
使用mocha,需要在framework中加入chai,否则要在测试js中手动引入。
在浏览器这里,需要install相应的launcher,如karma-chrome-launcher,一般用phantomjs就行了。当然,在可视浏览器中可以使用部分es6功能,所以只是简单测试,使用它们也行。

//karma.conf.js
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','chai'],


    // list of files / patterns to load in the browser
    files: ['*.js'],


    // list of files to exclude
    exclude: ['karma.config.js'],


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

开始

配置完后,就可以开始测试了。项目目录如下:

项目目录

index和index-spec随便取啥都可以,作为全局环境的引入,karma会根据函数名进行判断,但是为了规范,尽量后缀名为test或者spec。
我们实现一个简单的对hello的测试。

//hello.js
function hello(name){
    return 'hello ' + name
}
//hello.spec.js
describe('this is hello test',function(){
    it('hello',function(){
        expect(hello('world')).to.be.equal('hello world')
        expect(hello('gay')).to.be.equal('hello gay')
    })
})

接着运行 karma start。你会发现karma打开了谷歌浏览器,并且还有一个DEBUG的按钮,同时命令行中也出现了测试的结果。
如果测试未通过,DEBUG页面中的控制台将会提示错误信息。

配合webpack

首先安装webpack、karma-webpack以及babel。

npm install webpack karma-webpack --save-dev
npm install babel-loader babel-core babel-preset-es2015 --save-dev
// karma.config.js
module.exports = function(config) {
  config.set({
    // ......
    preprocessors: {
      '*.js': ['webpack']
    },
    webpack: {
      module: {
        loaders: [{
          test: /\.js$/,
          exclude: /node_modules/,
          loader: "babel-loader",
          query: {
            presets: ["es2015"],
          }
        }]
      }
    },
    // ......
  })
}

再次运行,可以看到在启动浏览器之前,所有代码都经过了webpack的打包,因此需要将被测试代码引入测试代码中才行。

//hello.js
export default name => 'hello ' + name
//hello.spec.js
import hello from "./hello.js";
//...

接下去的拓展,就和平时配置webpack一样。如果我需要对.vue文件或者Vue进行测试,通过安装vue-loader,配置webpack的loader。就可以实现vue官方文档的简单事例。

测试覆盖率

npm install karma-coverage --save-dev
//karma.config.js
module.exports = function(config) {
    config.set({
    //...
        preprocessors: {
            '*.spec.js': ['webpack','coverage']
        },
        reporters: ['progress','coverage'],
        webpack: {
            module: {
                loaders: [
              //...  
              ,{
                    test: /\.vue$/,
                    loader: "vue-loader"
                }]
            }
        },
    })
}

运行后在文件目录中会自动创建一个coverage的文件夹,里边包含了覆盖率的指数。

Paste_Image.png

打开一看,覆盖率好低,代码行数也增多不少,点开文件会发现这些代码是打包过后的代码,因此覆盖率降低不少。

npm install babel-plugin-istanbul --save-dev
karma.config.js
loaders: [{
                    test: /\.js$/,
                    exclude: /node_modules/,
                    loader: "babel-loader",
                    query: {
                        presets: ["es2015"],
                        plugins: ['istanbul']
                    }
                },

再次运行发现,覆盖率已经是你期盼的值了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容