DEV Community

Cover image for Automated testing and reporting in Jenkins
Avesh
Avesh

Posted on • Edited on

Automated testing and reporting in Jenkins

Automated testing and reporting are essential components of the Continuous Integration (CI) and Continuous Delivery (CD) process in Jenkins, enabling developers to catch and fix errors early in the development cycle. This article provides a comprehensive guide to setting up and configuring automated testing and reporting in Jenkins, with examples to illustrate key concepts and configurations.


What is Automated Testing in Jenkins?

Automated testing refers to the use of scripts and tools to run tests on code automatically. In Jenkins, automated testing is integrated directly into the CI/CD pipeline, allowing tests to be triggered whenever there’s a code change. This approach helps identify bugs, ensures code quality, and accelerates the feedback loop.

Jenkins supports various testing frameworks for different programming languages, including JUnit (Java), NUnit (C#), and Pytest (Python), among others. Additionally, Jenkins can integrate with quality reporting tools like SonarQube for code analysis and Jacoco for code coverage.


Key Components of Automated Testing in Jenkins

  1. Test Frameworks: Jenkins supports various test frameworks, each suited for different languages (e.g., JUnit for Java, Pytest for Python).
  2. Test Reports: Test reports provide insight into which tests passed, failed, or were skipped.
  3. Quality Gates: Quality gates define code quality standards and decide whether to continue deployment based on test results.
  4. Code Coverage: Code coverage measures how much of the codebase was tested during the run, providing a metric for test completeness.

Setting Up Automated Testing in Jenkins

Let’s look at a practical example using JUnit for testing a Java application and integrating the testing process within a Jenkins pipeline.

Step 1: Install Jenkins and Configure Necessary Plugins

  1. Install Jenkins: Ensure Jenkins is installed on your server.
  2. Install Plugins: The following plugins are necessary for automated testing and reporting:
    • JUnit Plugin (for Java applications)
    • Pipeline Plugin (to create Jenkinsfile for the CI/CD pipeline)
    • SonarQube Scanner (for static code analysis)
    • Jacoco Plugin (for code coverage reports)

To install these plugins:

  • Go to Manage Jenkins > Manage Plugins.
  • Search for each plugin and click Install without restart.

Step 2: Write Unit Tests in Your Application

To demonstrate automated testing, let’s add some sample unit tests in a Java application using the JUnit framework.

Example: CalculatorTest.java

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {

    @Test
    public void testAddition() {
        Calculator calc = new Calculator();
        assertEquals(5, calc.add(2, 3));
    }

    @Test
    public void testSubtraction() {
        Calculator calc = new Calculator();
        assertEquals(2, calc.subtract(5, 3));
    }
}
Enter fullscreen mode Exit fullscreen mode

These tests validate basic arithmetic operations of a calculator program. Once the code is pushed to the repository, Jenkins will automatically run these tests during the pipeline.

Step 3: Configure Jenkins Pipeline for Automated Testing

To set up the CI/CD pipeline, create a Jenkinsfile in the root directory of your project repository. This Jenkinsfile will define stages for building, testing, and reporting.

Example: Jenkinsfile

pipeline {
    agent any
    tools {
        jdk 'JDK11' // Ensure Java is installed
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Build') {
            steps {
                sh './gradlew clean build' // Command for building Java project
            }
        }

        stage('Test') {
            steps {
                sh './gradlew test' // Run tests
            }
            post {
                always {
                    junit 'build/test-results/test/*.xml' // Publish JUnit test results
                }
            }
        }

        stage('Code Coverage') {
            steps {
                jacoco execPattern: 'build/jacoco/test.exec' // Collect code coverage data
            }
        }

        stage('Static Code Analysis') {
            steps {
                script {
                    withSonarQubeEnv('SonarQube') {
                        sh './gradlew sonarqube' // Run SonarQube analysis
                    }
                }
            }
        }
    }

    post {
        always {
            archiveArtifacts artifacts: '**/build/libs/*.jar', allowEmptyArchive: true // Archive build artifacts
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Explanation of the Pipeline Stages

  1. Checkout Stage: Pulls the latest code from the repository.
  2. Build Stage: Builds the project using Gradle, Maven, or another build tool.
  3. Test Stage:
    • Runs unit tests with ./gradlew test.
    • Uses junit to publish test reports, allowing Jenkins to display test results.
  4. Code Coverage Stage:
    • Collects code coverage data using the Jacoco plugin.
    • You can visualize code coverage within Jenkins to analyze test completeness.
  5. Static Code Analysis:
    • Runs SonarQube to check code quality and highlight issues.
    • You can configure quality gates in SonarQube to stop builds if the code quality does not meet the standard.

Viewing Test Reports in Jenkins

After running the pipeline:

  1. Access JUnit Reports: Jenkins automatically stores and displays test reports. Go to the project, and select Test Results to view detailed test outcomes.
  2. Check Code Coverage:
    • The Jacoco plugin generates a coverage report that you can access from the project dashboard.
  3. Review Code Quality:
    • SonarQube results will also be available as part of the pipeline, displaying any code smells, vulnerabilities, or bugs identified.

Automated Reporting with Jenkins

Automated reporting is crucial for summarizing test outcomes and coverage, making it easier to catch issues and ensure code quality. Jenkins can be integrated with tools like Slack, email, or custom dashboards to notify teams of pipeline results.

Setting Up Notifications

  1. Email Notifications:
    • In the post section of the Jenkinsfile, add email notifications to inform stakeholders of pipeline status.
   post {
       failure {
           mail to: 'team@example.com',
                subject: "Build Failed in Jenkins: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                body: "Please check Jenkins for details."
       }
   }
Enter fullscreen mode Exit fullscreen mode
  1. Slack Integration:
    • You can set up a Slack webhook to post build statuses to your team’s Slack channel.
    • Go to Manage Jenkins > Configure System and add your Slack webhook URL under the Slack Notifications section.

Example Notification in Jenkinsfile

post {
    success {
        slackSend (channel: '#ci-cd', color: 'good', message: "Build Success: ${env.JOB_NAME} #${env.BUILD_NUMBER}")
    }
    failure {
        slackSend (channel: '#ci-cd', color: 'danger', message: "Build Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}")
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusion

By integrating automated testing and reporting into Jenkins, you ensure that code quality is consistently checked, problems are caught early, and your team is notified of issues quickly. Setting up a Jenkins pipeline for testing and reporting involves defining clear testing stages, integrating tools like Jacoco for code coverage and SonarQube for code analysis, and configuring notifications for effective communication. Automated testing in Jenkins is a powerful way to improve development quality and streamline the release process in any software project.

Top comments (0)