【问题标题】:How to specify folder for which I want to include files for code coverage in angular?如何指定要在 Angular 中包含代码覆盖文件的文件夹?
【发布时间】:2019-07-09 12:26:50
【问题描述】:

我正在使用 jasmine 和 karma 进行单元测试。伊斯坦布尔记者。

我想指定要考虑哪个文件夹进行代码覆盖。 我想排除其他所有内容。

现在我完全不知道配置是如何工作的。 核心文件夹是我要考虑的代码覆盖率的唯一文件夹。 (不得不粘贴截图,因为防火墙不允许我上传图片)

karma.config:

module.exports = function (config) {
  config.set({
    basePath: '',
    files:['mockData.js', 'mockLocalization.js'],
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      //require('karma-phantomjs-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular/cli/plugins/karma'),
      require('karma-scss-preprocessor'),
       require('karma-sonarqube-reporter'),
       require('karma-junit-reporter'),

    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    angularCli: {
      environment: 'dev'
    },
    coverageIstanbulReporter: {

      reports: [ 'html', 'lcov', 'cobertura' ],
      fixWebpackSourcePaths: true,

    },

    junitReporter:{
      useBrowserName: false, 
      outputDir: 'report',
      // will be resolved to basePath (in the same way as files/exclude patterns)
      outputFile: 'karma-report.xml'
    },

    coverageReporter: {
      includeAllSources: false,
      dir: 'coverage',

      reporters: [
        { type: 'html', subdir: 'html' }
      ]
    },

    reporters: ['progress', 'kjhtml','coverage-istanbul'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],    //make sure it is chromeHeadless while running the pipeline otherwise it will fail.
    singleRun: true,
    browserDisconnectTimeout: 20000,
    browserDisconnectTolerance: 3,
    browserNoActivityTimeout: 120000,
    flags: [
      '--disable-web-security',
      '--disable-gpu',
      '--no-sandbox'
    ]
  });
};

记者:

编辑:

const context = require.context('./core', true, /\.spec\.ts$/);
context.keys().map(context);

看起来不错!

但是

const context = require.context('./core', true, /\.spec\.ts$/);
context.keys().map(context);
const context2 = require.context('./modules', true, /\.spec\.ts$/);
context2.keys().map(context2);

给予:

为什么会突然包含资产文件夹??

【问题讨论】:

    标签: javascript angular jasmine karma-jasmine istanbul


    【解决方案1】:

    在您的 src 文件夹中配置您的 test.js 以仅指向您要运行测试的文件夹

    // Then we find all the tests.
    const context = require.context('./app/folderyouwantoruntestcas', true, /\.spec\.ts$/);
    // And load the modules.
    context.keys().map(context);
    

    【讨论】:

      【解决方案2】:

      正如@Chellappan 所指出的,该框架在代码覆盖范围内包含了一个库。因为它在我的一个组件中被引用。 我能够通过 angular-cli.json 中的以下内容将其从代码覆盖范围中排除

      "test": {
          "codeCoverage": {
            "exclude": [
              "src/assets/jqwidgets/**/*",
              "src/assets/jqwidgets-ts/**/*"
            ]
          },
      

      【讨论】:

        【解决方案3】:

        有一个属性可以从覆盖范围中排除特定文件,请参阅下面来自 angular.json 文件的代码

        `"test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            ...
            "codeCoverageExclude": [
              "src/app/in-memory-data.service.ts",
              "src/test-util/stubs.ts",
              "src/testing/**/*"
            ]
          }
        }`
        

        “codeCoverageExclude”属性将排除其中提到的文件。

        另请参阅此以了解支持的参数 - https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L1065-L1267

        【讨论】:

        • 我怀疑 node_module 也包含在其中。如何排除它?
        • 并且我认为添加“codeCoverageExclude”后没有任何效果:
        • 我建议的更改针对 Angular v6 及更高版本,对于较低版本,您可以使用 - "test": { "codeCoverage": { "exclude": [ src/assests/**/* ] },。此功能来自 @angular/cli 版本 rc.0
        猜你喜欢
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 2022-07-06
        相关资源
        最近更新 更多