Menu

Publishing Angular unit test and code coverage results on Azure DevOps CI/CD pipe line

As most of us know writing unit test is one of the hot topics among developers, and we all try to write to our best abilities and time constraints. This is about how we can publish results to DevOps as part of your Angular build.

install below npm packges on your Angular project

npm install puppeteer --save-dev
npm install karma-junit-reporter --save-dev
npm install jasmine-reporters --save-dev

update your package.json like below

"scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "install-puppeteer": "cd node_modules/puppeteer && npm run install",
    "test": "npm run install-puppeteer && ng test",
    "lint": "ng lint",
    "e2e": "npm run install-puppeteer && ng e2e"
  },

Add below steps to azure-pipelines.yml file looks like

trigger:
  - master
  - hotfix/*
  - feature/*
  - release/*

pool:
  name: Hosted Windows 2019 with VS2019
  demands: npm

steps:
  - task: Npm@1
    displayName: 'Install node modules'
    inputs:
      command: 'ci'
      verbose: false

  - task: Npm@1
    displayName: Tslint
    inputs:
      command: custom
      verbose: false
      customCommand: 'run lint'

  - task: Npm@1
    displayName: 'Run Tests'
    inputs:
      command: 'custom'
      customCommand: 'run ng test -- --watch=false --code-coverage'

  - task: PublishTestResults@2
    displayName: 'Publish unit test results'
    condition: succeededOrFailed()
    inputs:
      searchFolder: $(System.DefaultWorkingDirectory)/testresults/junit
      testRunTitle: Angular
      testResultsFormat: JUnit
      testResultsFiles: "**/unit-test-result.xml"

  - task: PublishCodeCoverageResults@1
    displayName: 'Publish code coverage results'
    condition: succeededOrFailed()
    inputs:
      codeCoverageTool: Cobertura
      summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml'
      failIfCoverageEmpty: true

  - task: Npm@1
    displayName: 'Build'
    inputs:
      command: custom
      verbose: false
      customCommand: 'run build:prod'

  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: 'dist/[*********your folder***********]'
      ArtifactName: 'drop'
      publishLocation: 'Container'

Now lets update karma.conf.js

Add below after “module.exports = function (config) {” line

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

add below under plugins

require('karma-junit-reporter')

add below under coverageIstanbulReporter

    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage'),
      reports: ['html', 'lcovonly', 'text-summary', 'cobertura'],
      fixWebpackSourcePaths: true
    },

add below to “reporters

junitReporter: {
outputDir: 'testresults/junit',
outputFile: 'unit-test-result.xml',
useBrowserName: false
},

browsers can be Chrome or ChromeHeadless

browsers: [‘Chrome’],// or [‘ChromeHeadless’]

let’s update e2e/protractor.conf.js all the way in the top, before export

const { JUnitXmlReporter } = require('jasmine-reporters');
const puppeteer = require('puppeteer');
process.env.CHROME_BIN = puppeteer.executablePath();

under capabilities

  capabilities: {
    'browserName': 'chrome',
    chromeOptions: {
      args: ["--headless", "--disable-gpu", "--window-size=1200,900"],
      binary: process.env.CHROME_BIN
    }
  },

inside of onPrepare section please add below line last

var junitReporter = new JUnitXmlReporter({
      savePath: require('path').join(__dirname, './junit'),
      consolidateAll: true
    });
    jasmine.getEnv().addReporter(junitReporter);

Leave a comment