Not able to display JUnit tests result in Jenkins Pipeline

61.2k Views Asked by At

I have a piece of Jenkins pipeline code in which I am trying to run JUnit on my angular code.

If the unit tests fail, Jenkins has to stop the pipeline. It's working except I am not able to see "Latest test Result" and "Test Result Trend"

I am using Jenkins 2.19.1, Jenkins Pipeline 2.4 and Junit 1.19. Here is the pipeline code:

{
        sh("npm install -g gulp bower")
        sh("npm install")
        sh("bower install")    
        try {
            sh("gulp test")
        } catch (err) {
            step([$class: 'JUnitResultArchiver', testResults: '**/reports/junit/*.xml', healthScaleFactor: 1.0])
            junit '**/reports/junit/*.xml'
            if (currentBuild.result == 'UNSTABLE')
                currentBuild.result = 'FAILURE'
            throw err
        }
    }

Any idea what I am doing wrong?

4

There are 4 best solutions below

1
On

I think the way I was trying to do previous was wrong.I have changed my code like below and it works :

{
        sh("npm install -g gulp bower")
        sh("npm install")
        sh("bower install")
        try {
            sh("gulp test")
        } catch (err) {
            if (currentBuild.result == 'UNSTABLE')
                currentBuild.result = 'FAILURE'
            throw err
        } finally {
            step([$class: 'JUnitResultArchiver', testResults: '**/reports/junit/*.xml', healthScaleFactor: 1.0])
            publishHTML (target: [
                    allowMissing: false,
                    alwaysLinkToLastBuild: false,
                    keepAll: true,
                    reportDir: 'coverage',
                    reportFiles: 'index.html',
                    reportName: "Junit Report"
            ])
        }
    }
2
On

Jenkins Pipeline step for publishing JUnit-style test results produced by a Gradle build:

  stage('Publish test results') {
      steps {
          junit '**/test-results/test/*.xml'
      }
  } 
0
On

In your code, you are generating the JUnit reports only when the tests fail, which is probably not what you want. Instead use finally to always publish the tests:

   {
        sh("npm install -g gulp bower")
        sh("npm install")
        sh("bower install")    
        try {
            sh("gulp test")
        } finally {
            step([$class: 'JUnitResultArchiver', testResults: '**/reports/junit/*.xml', healthScaleFactor: 1.0])
            junit '**/reports/junit/*.xml'
        }
    }

I prefer to use finally over having it in post, because this way, things are together that belong together.

4
On

If you use declarative pipeline, you can do something like:

pipeline {
   agent any
   stages {
     stage('Build and Test') {
        steps {
            sh 'build here...'
            sh 'run tests here if you like ...'
        }
     }
   }
   post {
      always {
        junit '**/reports/junit/*.xml'
      }
   } 
}

This could also work with html publishing or anything, no need for finally/catch etc. it will always archive the results.

See https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline for more.

If you have a clean target that results in no test output:

  post {
    always {
      junit(
        allowEmptyResults: true,
        testResults: '**/test-reports/*.xml'
      )
    }