常用的前端自动化测试工具介绍 —— Karma(二)

上篇文章中,对 Karma 进行了简单的介绍,本文是上篇文章的一些延伸,主要是 Karma 和 ES6 相关的配置以及代码覆盖率的配置。
首先来让 Karma 实现 ES6 支持。

ES6 支持

默认情况下,Karma 是不支持 ES6 的,比如我们有这样一个 utils.js 文件:

function add(x){
    return(y)=>{
        return x + y
    }
}

export {
    add
}

该文件中使用 ES6 的export 关键字向外暴露了一个 add 函数。然后在 src 文件夹中再创建一个 main.js 文件,并使用 import 关键字导入模块:

import {
    add,
} from "./utils.js";
...

在不进行其他配置之前,我们来运行 karma start 命令:

PS E:\charley-praise> karma start
05 11 2017 17:03:10.128:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
05 11 2017 17:03:10.135:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
05 11 2017 17:03:10.146:INFO [launcher]: Starting browser PhantomJS
05 11 2017 17:03:13.416:INFO [PhantomJS 2.1.1 (Windows 8 0.0.0)]: Connected on socket gfnyTuv0Hz4bH7JBAAAA with id 98139962
PhantomJS 2.1.1 (Windows 8 0.0.0) ERROR
  SyntaxError: Use of reserved word 'import'
  at src/main.js:1


PhantomJS 2.1.1 (Windows 8 0.0.0) ERROR
  SyntaxError: Unexpected token '>'
  at src/utils.js:17

这里就报错了,因为我们使用了浏览器和 Node 都不支持的 ES6 Modules。为了让 Karma 支持 ES6 Modules,我们需要使用 Webpack 和 Babel。下面有请这两位选手:

// 安装 webpack 相关的套件
yarn add webpack karma-webpack -D
// 安装 babel 相关的套件
yarn add babel-core babel-loader babel-preset-env -D

安装完成后,修改 karma.conf.js 配置文件:
1)增加 webpack 配置:

...
 webpack:{
      module: {
        rules: [
          {
          test: /\.js$/,
          use: {
              loader: 'babel-loader',
              options: {
                  presets: ['env'],
              }
            },
            exclude: /node_modules/
        }]
      }
    },
...

2)修改配置项中的 preprocessors,应用我们的 webpack 插件:

...
    preprocessors: {
      './src/**/*.js':['webpack'],
      './test/**/*.spec.js':['webpack']
    },
...

因为我们的原始文件和测试文件都使用了 ES6,因此需要对它们都应用 webpack 的配置。
现在运行 karma start 命令,就不会发生错误了。

代码覆盖率支持

接下来,让 Karma 实现代码覆盖率的支持,让我们隆重请出 Istanbul 大佬:

yarn add istanbul-instrumenter-loader -D
yarn add  babel-plugin-istanbul -D
yarn add karma-coverage-istanbul-reporter -D

安装完成后,我们需要做以下配置:
1)修改 karma.conf.js 配置文件中的 webpack 配置项:

...
    webpack:{
      module: {
        rules: [{
          test: /\.js$/,
          use: {
              loader: 'istanbul-instrumenter-loader',
              options: { esModules: true }
          },
          enforce: 'pre',
          exclude: /node_modules|\.spec\.js$/,
        },
        {
          test: /\.js$/,
          use: {
              loader: 'babel-loader',
              options: {
                  presets: ['env'],
                  plugins: ['istanbul']
              }
            },
            exclude: /node_modules/
        }]
      }
    },
...

2)修改 karma.conf.js 中的 reporters 选项:

...
    reporters: ['coverage-istanbul'],
...

3)对覆盖率测试做一些配置

...
   coverageIstanbulReporter: {
      reports: ['html', 'text-summary'],
      dir: 'coverage/',
      fixWebpackSourcePaths: true,
      skipFilesWithNoCoverage: true,
      'report-config': {
        html: {
          subdir: 'html'
        }
      }
    },
...

现在可以来测试一下单元测试覆盖率的情况了,我们不加入任何单元测试代码,看下运行效果:

05 11 2017 17:04:22.020:INFO [PhantomJS 2.1.1 (Windows 8 0.0.0)]: Connected on socket 6UUDaNimVpEfxhKDAAAA with id 72046933

=============================== Coverage summary ===============================
Statements   : 0% ( 0/2 )
Branches     : 100% ( 0/0 )
Functions    : 0% ( 0/2 )
Lines        : 0% ( 0/2 )
================================================================================

对于代码覆盖率的测试,会从语句(Statements)、分支(Branches)、函数(Functions)和行(Lines)四个维度进行。对于这几个维度的解释如下:

行覆盖率(line coverage):是否每一行都执行了?
函数覆盖率(function coverage):是否每个函数都调用了?
分支覆盖率(branch coverage):是否每个if代码块都执行了?
语句覆盖率(statement coverage):是否每个语句都执行了?

接下来,对 utils.js 中的 add 进行单元测试,下面是 utils.spec.js 中的代码:

import { add } from "../src/utils"

describe("测试算数运算",()=>{
    it("测试加法运算",()=>{
        const add5 = add(5)
        expect(add5(5)).toBe(10)
    })
})

然后执行 karma start 命令,看下运行效果:

05 11 2017 17:11:09.487:INFO [PhantomJS 2.1.1 (Windows 8 0.0.0)]: Connected on socket WKhEFarUgA8QPn2HAAAA with id 38737854

=============================== Coverage summary ===============================
Statements   : 100% ( 2/2 )
Branches     : 100% ( 0/0 )
Functions    : 100% ( 2/2 )
Lines        : 100% ( 2/2 )
================================================================================

恩,不错,现在我们的代码覆盖率为 100%,看来升值加薪,是在所难免了。

查看 HTML 报表

除了可以在命令行的运行结果中查看代码覆盖率的情况,Karma 还为我们生成了 HTML 报表(上面在配置 coverageIstanbulReporter 对生成路径进行了配置),看起来更加直观。您可以自行打开 coverage (或其他您自行配置的路径)进行查看,这里就不截图了。

总结

本文主要在前文的基础上,为 Karma 增加了 ES6 和代码覆盖率的支持,让 Karma 支持 ES6 需要用到 Webpack 和 Babel 的一些套件, 对于代码覆盖率的支持,我选用了 Istanbul 的系列套件。
关于具体的代码,我在下篇文章中专门进行陈列。

完。

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

推荐阅读更多精彩内容