获取预编译源代码的 Karma 代码覆盖率

Posted

技术标签:

【中文标题】获取预编译源代码的 Karma 代码覆盖率【英文标题】:Getting Karma code coverage for pre-transpilation source code 【发布时间】:2015-11-17 03:51:45 【问题描述】:

我使用 Karma 运行测试,使用 webpack 打包文件,使用 babel 进行 es6 -> es5 转换。我已经运行了测试并生成了代码覆盖率,但是代码覆盖率数字是用于转换后的源文件的。有没有办法获得原始源文件的代码覆盖率?

我尝试使用sourcemap 预处理器,但它似乎没有做任何事情。我需要将它添加到 webpack 配置中的某个地方吗?

karma.conf.js

config.set(
    browsers: ['Chrome'], //run in Chrome

    files: [
        'src/**/*-test.js'
    ],

    frameworks: ['mocha'], //use the mocha test framework

    plugins: [
        'karma-chrome-launcher',
        'karma-mocha',
        'karma-sourcemap-loader',
        'karma-webpack',
        'karma-coverage',
    ],

    preprocessors: 
        'src/**/*-test.js': ['webpack']
    ,

    reporters: ['dots', 'coverage'], //report results in this format

    coverageReporter: 
        reporters: [
            type: 'text-summary',
        , 
            type: 'html',
            dir: 'build/reports/coverage'
        ]
    ,

    singleRun: true, //just run once by default

    webpack: 
        node: 
            fs: 'empty'
        ,

        // Instrument code that isn't test or vendor code.
        module: 
            loaders: [
                test: /\.js?$/,
                include: path.join(__dirname, 'src/js'),
                loader: 'babel?stage=0'
            ],

            postLoaders: [
                test: /\.js$/,
                exclude: /(test|node_modules)\//,
                loader: 'istanbul-instrumenter'
            ]
        
    ,

    webpackMiddleware: 
        noInfo: true //please don't spam the console when running in karma!
    
);

【问题讨论】:

你可以使用isparta-loader。 当我尝试将 isparta 添加为 preLoader(带有和不带有 babel 属性)时,它不再编译 import 语句上的代码和错误。它说要使用它而不是标准的 babel 加载器,所以我不确定我做错了什么。 【参考方案1】:

以下配置可以正常工作:

karma.conf.js

var path = require('path');

module.exports = function(config) 
  config.set(
    browsers: [ 'Chrome' ], //run in Chrome

    files: [
      'src/**/*-test.js'
    ],

    frameworks: [ 'mocha' ], //use the mocha test framework

    preprocessors: 
      'src/**/*-test.js': [ 'webpack' ]
    ,

    reporters: [ 'dots', 'coverage' ], //report results in this format

    coverageReporter: 
      reporters: [
        
          type: 'text-summary'
        ,
        
          type: 'html',
          dir: 'build/reports/coverage'
        
      ]
    ,

    singleRun: true, //just run once by default

    webpack: 
      node : 
        fs: 'empty'
      ,

      // Instrument code that isn't test or vendor code.
      module: 
        preLoaders: [
           test: /\.js$/, loader: 'isparta', include: path.join(__dirname, 'src/js') 
        ],
        loaders: [
          
            test: /\.js$/,
            include: path.join(__dirname, 'src/js'),
            loader: 'babel?stage=0'
          
        ]
      
    ,

    webpackMiddleware: 
      noInfo: true //please don't spam the console when running in karma!
    
  );
;

package.json


  "devDependencies": 
    "babel-core": "^5.8.22",
    "babel-loader": "^5.3.2",
    "chai": "^3.2.0",
    "isparta-loader": "^0.2.0",
    "karma": "^0.13.9",
    "karma-chrome-launcher": "^0.2.0",
    "karma-coverage": "^0.5.0",
    "karma-mocha": "^0.2.0",
    "karma-webpack": "^1.7.0",
    "mocha": "^2.2.5",
    "webpack": "^1.11.0"
  

【讨论】:

这对我很有用。比我遇到的任何其他事情都简单得多。这也是我见过的唯一一个不使用“替代业力配置”的例子,其中require.context 用于创建单个入口点。 我还发现在处理大型代码库时,此解决方案比 require.context 选项效果更好。 感谢您,在花了几个小时尝试其他解决方案之后,这个终于让我知道如何让它工作了。我正在使用@djskinner 提到的“替代配置”,它也可以使用。 这不太可能在 webpack 2 下工作。我收到 isparta is not a loader

以上是关于获取预编译源代码的 Karma 代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

使用 karma-jasmine 和 istanbul 的 Typescript 代码覆盖率

Karma 代码覆盖率 - 总是 100%?

Karma,覆盖率报告结合 webpack

在 TeamCity 上为 Karma 配置代码覆盖率报告

Karma 代码覆盖率未在 Sonarqube 中显示

如何使用isparta,webpack,jasmine和karma获得准确的代码覆盖率?