Azure devops - требование минимального покрытия кода - PullRequest
0 голосов
/ 18 марта 2020

У меня есть проект Angular 9, и я пытаюсь получить минимальное покрытие кода, работающее над запросом на получение, в Azure devops соответствуют документации . Однако минимальное покрытие кода не работает, возможно, пропущен какой-то шаг ....

Шаги для воспроизведения:

  1. Создание нового проекта Angular 9: "ng new DefaultWebsite «
  2. Создание конвейера сборки и редактирование конфигурации кармы и транспортира в соответствии с Microsoft» Сборка, тестирование и развертывание JavaScript и Node.js приложений »документация
  3. Добавить и "azurepipelines-cover.yml" в root моего проекта, чтобы включить проверку покрытия кода в запросе на включение, соответствует Microsoft " Покрытие кода для запросов на получение " документация
  4. Отключить некоторые проверьте в файле de app.spe c .ts, чтобы охват кода больше не составлял 100%, теперь он составляет 77%. Изменено минимальное покрытие кода в файле yml на 95%, чтобы нельзя было выполнить запрос извлечения, соответствующий теории, и он должен выдавать ошибку « Проверка состояния покрытия не удалась », что соответствует документации Microsoft.

Однако, когда стартовый запрос запущен, под частью «Статус» выполняется проверка покрытия кода. Когда сборка (с юнит-тестами и тестами e2e) завершена, нет ошибки покрытия кода, которую я ожидаю увидеть в разделе «Статус».

Запрос извлечения с проверкой покрытия кода Сборка по требованию завершена

Когда я смотрю на сборку, появляются результаты теста и результаты покрытия кода.

Результат теста сборки Код сборки результат покрытия

Когда я смотрю на результат покрытия кода, я вижу, что покрытие строки 75%, которое должно быть минимум 90%, соответствует yml-файлу.

Файл конфигурации Karma

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

module.exports = function (config) {
  const process = require('process');
  process.env.CHROME_BIN = require('puppeteer').executablePath();

  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'),
      require('karma-junit-reporter')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage'),
      reports: ['html', 'lcovonly', 'text-summary', 'cobertura'],
      fixWebpackSourcePaths: true
    },
    coverageReporter: {
      type : 'html',
      dir : 'coverage/'
    },
    junitReporter: {
      outputDir: './coverage', // results will be saved as $outputDir/$browserName.xml
      outputFile: 'junit.xml', // if included, results will be saved as $outputDir/$browserName/$outputFile
      suite: '', // suite will become the package name attribute in xml testsuite element
      useBrowserName: true, // 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
    },
    reporters: ['progress', 'kjhtml','junit'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadless'],
    singleRun: false,
    restartOnFileChange: true
  });
};

Файл конфигурации транспортира:

// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter } = require('jasmine-spec-reporter');
const { JUnitXmlReporter } = require('jasmine-reporters');

process.env.CHROME_BIN = process.env.CHROME_BIN || require("puppeteer").executablePath();

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './src/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'chrome',

    chromeOptions: {
      args: ["--headless", "--disable-gpu", "--window-size=1200,900"],
      binary: process.env.CHROME_BIN
    }
  },
  directConnect: true,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function () { }
  },
  onPrepare() {
    require('ts-node').register({
      project: require('path').join(__dirname, './tsconfig.json')
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
    var junitReporter = new JUnitXmlReporter({
      savePath: require('path').join(__dirname, './junit'),
      consolidateAll: true
    });
    jasmine.getEnv().addReporter(junitReporter);
  }
};

azurepipelines-cover.yml

coverage:
  status:           #Code coverage status will be posted to pull requests based on targets defined below.
    diff:           #diff coverage is code coverage only for the lines changed in a pull request.
      target: 95%   #set this to a desired %. Default is 70%.

Azure Построить этапы конвейера:

"steps": [
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "npm install",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "fe47e961-9fa8-4106-8639-368c022d43ad",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "command": "install",
            "workingDir": "Project\\Frontend\\DefaultWebsite",
            "verbose": "false",
            "customCommand": "",
            "customRegistry": "useNpmrc",
            "customFeed": "",
            "customEndpoint": "",
            "publishRegistry": "useExternalRegistry",
            "publishFeed": "",
            "publishPackageMetadata": "true",
            "publishEndpoint": ""
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "npm custom - test ",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "fe47e961-9fa8-4106-8639-368c022d43ad",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "command": "custom",
            "workingDir": "Project\\Frontend\\DefaultWebsite",
            "verbose": "false",
            "customCommand": "run test",
            "customRegistry": "useNpmrc",
            "customFeed": "",
            "customEndpoint": "",
            "publishRegistry": "useExternalRegistry",
            "publishFeed": "",
            "publishPackageMetadata": "true",
            "publishEndpoint": ""
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "Publish code coverage from Project\\Frontend\\DefaultWebsite\\coverage\\cobertura-coverage.xml",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "2a7ebc54-c13e-490e-81a5-d7561ab7cd97",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "codeCoverageTool": "Cobertura",
            "summaryFileLocation": "Project\\Frontend\\DefaultWebsite\\coverage\\cobertura-coverage.xml",
            "pathToSources": "",
            "reportDirectory": "",
            "additionalCodeCoverageFiles": "",
            "failIfCoverageEmpty": "false"
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "Publish Test Results Project\\Frontend\\DefaultWebsite\\**\\junit.xml copy",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "0b0f01ed-7dde-43ff-9cbb-e48954daf9b1",
            "versionSpec": "2.*",
            "definitionType": "task"
        },
        "inputs": {
            "testRunner": "JUnit",
            "testResultsFiles": "Project\\Frontend\\DefaultWebsite\\**\\junit.xml",
            "searchFolder": "$(System.DefaultWorkingDirectory)",
            "mergeTestResults": "false",
            "failTaskOnFailedTests": "false",
            "testRunTitle": "",
            "platform": "",
            "configuration": "",
            "publishRunAttachments": "true"
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "npm custom - e2e",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "fe47e961-9fa8-4106-8639-368c022d43ad",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "command": "custom",
            "workingDir": "Project\\Frontend\\DefaultWebsite",
            "verbose": "false",
            "customCommand": "run e2e",
            "customRegistry": "useNpmrc",
            "customFeed": "",
            "customEndpoint": "",
            "publishRegistry": "useExternalRegistry",
            "publishFeed": "",
            "publishPackageMetadata": "true",
            "publishEndpoint": ""
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "Publish Test Results Project\\Frontend\\DefaultWebsite\\e2e\\**\\junitresults.xml",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "0b0f01ed-7dde-43ff-9cbb-e48954daf9b1",
            "versionSpec": "2.*",
            "definitionType": "task"
        },
        "inputs": {
            "testRunner": "JUnit",
            "testResultsFiles": "Project\\Frontend\\DefaultWebsite\\e2e\\**\\junitresults.xml",
            "searchFolder": "$(System.DefaultWorkingDirectory)",
            "mergeTestResults": "false",
            "failTaskOnFailedTests": "false",
            "testRunTitle": "",
            "platform": "",
            "configuration": "",
            "publishRunAttachments": "true"
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "npm custom - prodBuild",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "fe47e961-9fa8-4106-8639-368c022d43ad",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "command": "custom",
            "workingDir": "Project\\Frontend\\DefaultWebsite",
            "verbose": "false",
            "customCommand": "run prodBuild",
            "customRegistry": "useNpmrc",
            "customFeed": "",
            "customEndpoint": "",
            "publishRegistry": "useExternalRegistry",
            "publishFeed": "",
            "publishPackageMetadata": "true",
            "publishEndpoint": ""
        }
    },
    {
        "environment": {},
        "enabled": true,
        "continueOnError": false,
        "alwaysRun": false,
        "displayName": "Publish Artifact: app",
        "timeoutInMinutes": 0,
        "condition": "succeeded()",
        "task": {
            "id": "2ff763a7-ce83-4e1f-bc89-0ae63477cebe",
            "versionSpec": "1.*",
            "definitionType": "task"
        },
        "inputs": {
            "PathtoPublish": "Project\\Frontend\\DefaultWebsite\\dist",
            "ArtifactName": "app",
            "ArtifactType": "Container",
            "TargetPath": "",
            "Parallel": "false",
            "ParallelCount": "8",
            "FileCopyOptions": ""
        }
    }
],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...