合并来自两个 angular 个项目的 Karma 测试结果

Merge Karma test results from two angular projects

我有一个包含 angular 测试的主要 angular 项目。在这里面我有一个“共享”模块,它实际上是一个 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...)

提前致谢

您需要一个包含设置的主 karma.conf.js 文件,每个项目都需要一个。在您的情况下,有 2 个额外的 karma.conf.js 文件扩展了主 karama.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'),
    },
  });
};