Sourcemap + istanbul / isparta代码覆盖率为webpack + babel(对于es6)+ mocha(+ karma)

时间:2016-02-21 07:40:37

标签: javascript webpack istanbul karma-coverage isparta

我在https://github.com/danielbush/webpack-babel-karma-sourcemap-coverage有一个测试项目。

它由src/中的两个简单源文件组成,其中一个文件具有故意错误(src/lib2.js)。

我想使用从ES6到ES5的babel进行webpack和转换,并使用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)之类的东西来添加覆盖率,这样我就可以在coverage中生成HTML覆盖率报告/向我显示未涵盖的行(可能) - 以及整体覆盖率。

但我想确保我的堆栈跟踪仍然像上面那样正确映射源。

我已经尝试过isparta-loader和isparta-instrumenter-loader在webpack中转换和检测有问题的文件,但我的行号在stacktrace中略显错误(上图)。似乎有许多类似isparta的东西漂浮在周围,文档不是非常友好。

更广泛地表达所有这些:我将文件和测试捆绑在一起,然后在浏览器中进行测试(业力或更多手动方式),我想要我的源地图(在浏览器中)指向原始代码行和同时我希望覆盖率报告引用尚未涵盖的原始行和文件。

2 个答案:

答案 0 :(得分:2)

我没有针对单一业力/网络包配置的解决方案。我的解决方法是有2个业力混乱 - 我对atm非常满意。 (我还有其他非业力设置来运行测试。)

一个conf在后台运行测试,为我的es6代码提供准确的堆栈跟踪,另一个使用isparta-loader运行覆盖以转换和检测我的源代码。 (isparta-loader使用isparta,它使用伊斯坦布尔。

所以我的&#34;运行测试&#34; karma conf看起来有点像这样:

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 conf看起来有点像这样:

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' }
      ]
    }
  });
}

此第二个conf提供了一个文本报告,可以在终端中提供即时覆盖摘要,以及html报告,它提供了未经测试的代码的优秀源文件突出显示。 (这对于sinon来说都是一个黑客,这与这个问题没有关系。)tests.webpack.js使用webpack的require.context来引入我用mocha编写的浏览器测试。并且需要各种karma- *插件。

答案 1 :(得分:0)

使用伊斯坦布尔新的official Babel Plugin来测试代码覆盖率可能会更好。

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

当我在项目中使用它时,Sourcemaps似乎“开箱即用”。