Webpack + Babel(用于ES6)+ Mocha(+ Karma)的Sourcemap + Istanbul / Isparta代码覆盖率

4
我在https://github.com/danielbush/webpack-babel-karma-sourcemap-coverage上有一个测试项目。该项目包含两个简单的源文件,位于src/目录下,其中一个故意包含错误(src/lib2.js)。 我想使用Webpack和Babel将代码从ES6转译为ES5,并使用Karma运行Mocha测试。我已经添加了源映射并进行了测试,以便可以看到原始文件的行号。 对我来说,堆栈跟踪如下:
21 02 2016 16:03:15.445:INFO [karma]: Karma v0.13.21 server started at http://localhost:9876/
21 02 2016 16:03:15.451:INFO [launcher]: Starting browser Chrome
21 02 2016 16:03:16.551:INFO [Chrome 48.0.2564 (Linux 0.0.0)]: Connected on socket /#yRS32ons0_2HGhrwAAAA with id 3072946

START:
  lib1
    ✖ should return 1

Finished in 0.015 secs / 0.001 secs

SUMMARY:
✔ 0 tests completed
✖ 1 test failed

FAILED TESTS:
  lib1
    ✖ should return 1
      Chrome 48.0.2564 (Linux 0.0.0)
    Error: SIMULATED ERROR
        at foo (/home/danb/projects/so-test-project/tests.webpack.js:135:10 <- webpack:///src/lib2.js:13:8)
        at Context.<anonymous> (/home/danb/projects/so-test-project/tests.webpack.js:93:31 <- webpack:///test/index.js:7:11)
在上面的倒数第二行中,它显示了webpack:///src/lib2.js:13,这是原始源代码中的正确位置。 为了获得这个映射,我做了这个:https://github.com/danielbush/webpack-babel-karma-sourcemap-coverage/commit/6ea992cae499dccc68488bcb3eaca642ae4ed24e 我想要做的是使用像istanbul(或使用istanbul的isparta)这样的东西来添加覆盖率,以便我可以生成一个HTML覆盖率报告,其中显示未覆盖的行(可能)-以及总体覆盖率百分比。 但我希望确保我的堆栈跟踪仍然像上面那样正确地进行源映射。 我已经尝试了isparta-loader和isparta-instrumenter-loader来编译和检测webpack中相关文件的问题,但是我的堆栈跟踪中的行号略有不对。似乎有很多类似isparta的东西在流传,而且文档也不是很友好。 更一般地表达所有这些:我正在捆绑文件和测试,然后在浏览器中测试这些(通过karma或更手动的方式),我希望我的源映射(在浏览器中)指向原始代码的行,同时我希望覆盖率报告引用未被覆盖的原始行和文件。
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2

我无法提供一个单一的 karma/webpack 配置的解决方案,我的解决办法是有两个 karma 配置文件 - 目前我对此感到非常满意。(我还有其他非 karma 的测试运行设置。)

一个配置文件在后台运行测试并提供准确的栈跟踪信息,用于我的 es6 代码;另一个使用 isparta-loader 进行覆盖率测试,以转译和插桩我的源代码。(isparta-loader 使用 isparta,它使用 istanbul)

因此,我的“运行测试”karma配置文件看起来有点像这样:

var webpack = require('webpack');
module.exports = function (config) {
  config.set({
    browsers: [ 'PhantomJS' ],
    singleRun: false,
    frameworks: [ 'mocha' ], // Use the mocha test framework
    files: [
      'tests.webpack.js'
    ],
    preprocessors: {
      'tests.webpack.js': [ 'webpack', 'sourcemap' ]
    },
    reporters: [ 'mocha' ],
    webpack: {
      devtool: 'inline-source-map',
      module: {
        loaders: [
          // Use imports loader to hack webpacking sinon.
          // https://github.com/webpack/webpack/issues/177
          {
            test: /sinon\.js/,
            loader: "imports?define=>false,require=>false"
          },
          {
            test: /\.js$/,
            exclude: /node_modules/,
            loader: 'babel-loader',
            query: { presets: ['es2015'] }
          }
        ]
      }
    },
    webpackServer: {
      noInfo: true
    }
  });
}

我的覆盖率Karma配置看起来有点像这样:

var webpack = require('webpack'),
    path = require('path');
module.exports = function (config) {
  config.set({
    browsers: [ 'PhantomJS' ],
    singleRun: true,
    frameworks: [ 'mocha' ],
    files: [
      'tests.webpack.js'
    ],
    preprocessors: {
      'tests.webpack.js': [ 'webpack' ]
    },
    reporters: [ 'coverage' ],
    webpack: {
      // *optional* babel options: isparta will use it as well as babel-loader
      babel: {
        presets: ['es2015']
      },
      // *optional* isparta options: istanbul behind isparta will use it
      isparta: {
        embedSource: true,
        noAutoWrap: true,
        // these babel options will be passed only to isparta and not to babel-loader
        babel: {
          presets: ['es2015']
        }
      },
      module: {
        loaders: [
          {
            test: /sinon\.js/,
            loader: "imports?define=>false,require=>false"
          },
          // Perform babel transpiling on all non-source, test files.
          {
            test: /\.js$/,
            exclude: [
              path.resolve('node_modules/'),
              path.resolve('lib/')
            ],
            loader: 'babel-loader',
            query: { presets: ['es2015'] }
          },
          // Instrument source files with isparta-loader (will perform babel transpiling).
          {
            test: /\.js$/,
            include: [
              path.resolve('lib/')
            ],
            loader: 'isparta'
          }
        ]
      }
    },
    webpackServer: {
      noInfo: true
    },
    coverageReporter: {
      reporters: [
        { type: 'html', dir: 'coverage/' },
        { type: 'text' }
      ]
    }
  });
}
这个第二个配置提供了一个文本报告,在终端上可以立即看到覆盖率概要,还有一个HTML报告,可以很好地突出未经测试的代码。对于sinon进行了一些hack处理,但与此问题无关。 tests.webpack.js 使用webpack的require.context来引入我用mocha编写的浏览器测试。还需要各种karma-*插件。

1
你是否能够获得“原始”的ES6文件的覆盖率HTML输出?我的设置(与你的相似)输出了“错误”的ES6覆盖率报告。弄混了红/绿线等。 - lipp

0

你可以尝试使用伊斯坦布尔的新官方Babel插件来为你的源代码添加代码覆盖率。

根据我的经验,相比于isparta,它提供了更准确的覆盖率报告,并且除了将其添加到Babel配置的插件列表中之外,基本上不需要任何配置。

当我在项目中使用它时,Sourcemaps似乎可以“开箱即用”地正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,