Карта исходного кода + покрытие кода Стамбула / Испарта для веб-пакета + бабель (для es6) + мокко (+ карма)

У меня есть тестовый проект по адресу https://github.com/danielbush/webpack-babel-karma-sourcemap-coverage.

Он состоит из двух простых исходных файлов в src/один с преднамеренной ошибкой (src/lib2.js).

Я хочу упаковать и перенести с помощью babel из ES6 в ES5 и запустить тесты Mocha для этого комплекта, используя Karma.

Я уже добавил исходное сопоставление и проверил это, чтобы увидеть номер строки исходного файла.

Для меня трассировка стека выглядит так:

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)

На 2-й последней строке выше, это показывает webpack:///src/lib2.js:13 это правильное местоположение в оригинальном источнике.

Чтобы получить это сопоставление, я сделал это: https://github.com/danielbush/webpack-babel-karma-sourcemap-coverage/commit/6ea992cae499dccc68488bcb3eaca642ae4ed24e

То, что я хочу сделать, это добавить покрытие, используя что-то вроде istanbul (или isparta, которое использует istanbul), чтобы я мог сгенерировать отчет покрытия HTML в покрытии / который показывает мне строки, которые не покрыты (потенциально), а также общее покрытие проценты.

Но я хочу убедиться, что мои трассировки стека по-прежнему отображаются правильно, как указано выше.

Я пробовал isparta-loader и isparta-instrumenter-loader для переноса и обработки файлов в веб-пакете, но номера строк в трассировке стека немного неправильны (см. Выше). Кажется, что-то похожее на Испарта, и документация не супер-дружественная.

Чтобы выразить все это немного более широко: я объединяю файлы и тесты, а затем проверяю это в браузере (карма или более ручными средствами), и я хочу, чтобы мои исходные карты (в браузере) указывали на исходные строки кода и в то же время я хочу, чтобы отчет о покрытии ссылался на оригинальные строки и файлы, которые не были покрыты.

2 ответа

У меня нет решения для одной конфигурации karma/webpack. Мой обходной путь - сделать 2 конфессий кармы - что я вполне доволен. (У меня есть и другие установки, не связанные с кармой, для запуска тестов.)

Один conf запускает тесты в фоновом режиме с точными трассировками стека для моего кода es6, а другой запускает покрытие с использованием isparta-loader для переноса и обработки моего исходного кода. ( Испарта-загрузчик использует Испарта, который использует Стамбул).

Так что мой "бегущий тест" карма-конф выглядит примерно так:

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

и мой репортаж о покрытии выглядит примерно так:

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 использует веб-пакеты require.context вытащить в моем браузере тесты, написанные на мокко. И требуются различные плагины karma-*.

Возможно, вам повезет больше, если использовать новый официальный плагин Babel в Стамбуле, чтобы использовать свои источники для покрытия кода.

По моему опыту, по сравнению с ispartaон предоставил более точные отчеты о покрытии и не требовал никакой конфигурации, кроме добавления его в список плагинов в моей конфигурации Babel.

Исходные карты работали корректно "из коробки", когда я использовал их в своем проекте.

Другие вопросы по тегам