Not able to display JUnit tests result in Jenkins Pipeline

61.3k 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
Joy 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"
            ])
        }
    }
4
Michael Neale 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'
      )
    }
2
Alex 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
not2savvy 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.