常用的前端自动化测试工具介绍 —— 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 的系列套件。
关于具体的代码,我在下篇文章中专门进行陈列。

完。

你可能感兴趣的:(常用的前端自动化测试工具介绍 —— Karma(二))