首页 > 解决方案 > 合并来自两个 Angular 项目的 Karma 测试结果

问题描述

我有一个包含角度测试的主要角度项目。在这里面我有一个“共享”模块,它实际上是一个 BitBucket 子模块,它有自己的业力测试。每当我ng test在主项目客户端应用程序文件夹上运行命令时,都会启动来自两个“项目”的测试,但结果会被覆盖(大项目会覆盖子模块,反之亦然)有没有办法将结果附加到相同的结果中 -文件?

此外,对于我使用 JUnit Reporter 的主项目,这是我在主项目中的 karma.config 文件:

const puppeteer = require('puppeteer');
process.env.CHROME_BIN = puppeteer.executablePath();

module.exports = function (config) {
  config.set({
    customLaunchers: {
      X: {
        base: 'ChromeHeadless',
        flags: [
          '--headless',
          '--no-sandbox',
        ]
      }
    },
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('karma-scss-preprocessor'),
      require('@angular-devkit/build-angular/plugins/karma'),
      require('karma-junit-reporter'),
    ],

    client: {
      jasmine: {
        random: false,
        timeoutInterval: 10000
      }
    },

    proxies: {
      '/assets/': 'src/assets/'

    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, '../coverage'),
      reports: ['html', 'lcovonly'],
      fixWebpackSourcePaths: true
    },
    junitReporter: {
      outputDir: '', // results will be saved as $outputDir/$browserName.x ml
      outputFile: 'karma-results.xml', // if included, results will be saved as $outputDir/$browserName/$outputFile
      suite: '', // suite will become the package name attribute in xml testsuite element
      useBrowserName: false, // add browser name to report and classes names
      nameFormatter: undefined, // function (browser, result) to customize the name attribute in xml testcase element
      classNameFormatter: undefined, // function (browser, result) to customize the classname attribute in xml testcase element
      properties: {}, // key value pair of properties to add to the <properties> section of the report
      xmlVersion: null // use '1' if reporting to be per SonarQube 6.2 XML format
    },
    trxReporter: {
      outputFile: 'test-results.trx',
      shortTestName: false
    },
    reporters: ['junit'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_WARN,
usePolling: false,
    autoWatch: false,
    browsers: ['X'],
    captureTimeout: 6000000,//it was already there
    browserDisconnectTimeout: 1000000,
    browserDisconnectTolerance: 1,
    browserNoActivityTimeout: 6000000,
    singleRun: true
  });
};

第二个项目的 Karma 配置是:

// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, '../../coverage'),
      reports: ['html', 'lcovonly'],
      fixWebpackSourcePaths: true
    },

    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_DISABLE,
    autoWatch: true,
    browsers: ['ChromeHeadless'],
    captureTimeout: 6000000, // it was already there
    browserDisconnectTimeout: 1000000,
    browserDisconnectTolerance: 1,
    browserNoActivityTimeout: 6000000,
    singleRun: true
  });
};

我不明白的是第二个项目如何知道在与第一个项目相同的文件上输出并覆盖主项目的内容?

还有 tsconfig.spec.json 文件:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "../../out-tsc/spec",
    "types": [
      "jasmine",
      "node"
    ]
  },
  "files": [
    "src/test.ts"
  ],
  "include": [
    "**/*.spec.ts",
    "**/*.d.ts"
  ]
}

我假设所有的 spec.ts 文件都包含在这里(包括第二个项目,考虑到它的路径:ClientApp\libs\SecondProject ....)

提前致谢

标签: angularkarma-jasmine

解决方案


您需要一个包含设置的主 karma.conf.js 文件和一个用于每个项目的文件。在您的情况下,扩展主 karama.conf.js 文件的 2 个附加 karma.conf.js 文件。

请参阅下面的示例并检查属性 coverageIstanbulReporter 以设置输出文件夹 karma.conf.js

const { join } = require('path');
const { constants } = require('karma');

module.exports = () => {
    return {
        basePath: '',
        frameworks: ['jasmine', '@angular-devkit/build-angular'],
        plugins: [
            require('karma-jasmine'),
            require('karma-chrome-launcher'),
            require('karma-jasmine-html-reporter'),
            require('karma-coverage-istanbul-reporter'),
            require('@angular-devkit/build-angular/plugins/karma')
        ],
        client: {
            clearContext: false // leave Jasmine Spec Runner output visible in browser
        },
        jasmine: {
            random: false
        },
        coverageIstanbulReporter: {
            dir: join(__dirname, '../../coverage'),
            reports: ['html', 'lcovonly'],
            fixWebpackSourcePaths: true
        },
        reporters: ['progress', 'kjhtml'],
        port: 9876,
        colors: true,
        logLevel: constants.LOG_INFO,
        autoWatch: true,
        browsers: ['ChromeHeadlessNoSandbox'],
        customLaunchers: {
            ChromeHeadlessNoSandbox: {
                base: 'ChromeHeadless',
                executablePath: '/usr/bin/chromium-browser',
                flags: [
                    '--no-sandbox',
                    '--disable-dev-shm-usage',
                    '--remote-debugging-port=9222'
                ]
            }
        },
        singleRun: true
    };
};

项目的 karma.conf.js:

const { join } = require('path');
const getBaseKarmaConfig = require('../../karma.conf');

module.exports = function (config) {
  const baseConfig = getBaseKarmaConfig();
  config.set({
    ...baseConfig,
    coverageIstanbulReporter: {
      ...baseConfig.coverageIstanbulReporter,
      dir: join(__dirname, '../../coverage/apps/project-A'),
    },
  });
};

推荐阅读