Bird
Raised Fist0
Jenkinsdevops~5 mins

Running unit tests in pipeline in Jenkins - Commands & Configuration

Choose your learning style10 modes available
Introduction
Unit tests check small parts of your code to make sure they work correctly. Running these tests automatically in a pipeline helps catch problems early before the code is shared or used.
When you want to verify that new code changes do not break existing features before merging.
When you want to automate testing so developers get quick feedback on their work.
When you want to ensure code quality by running tests on every code update.
When you want to prevent broken code from being deployed to production.
When you want to keep a history of test results for your project.
Config File - Jenkinsfile
Jenkinsfile
pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Run Unit Tests') {
            steps {
                sh 'mvn test'
            }
        }
    }
    post {
        always {
            junit '**/target/surefire-reports/*.xml'
        }
    }
}

This Jenkinsfile defines a pipeline with two main stages:

  • Checkout: Gets the latest code from the source control.
  • Run Unit Tests: Runs unit tests using Maven's mvn test command.

The post section collects test results using the junit step to show test reports in Jenkins.

Commands
This command updates or creates the Jenkins pipeline job named 'my-pipeline' using the Jenkinsfile in the project. It sets up the pipeline to run the defined stages.
Terminal
jenkins-jobs --conf jenkins.ini update my-pipeline
Expected OutputExpected
Job 'my-pipeline' updated successfully
This command triggers the pipeline job 'my-pipeline' on the Jenkins server and waits for it to finish. It starts the process of running unit tests automatically.
Terminal
java -jar jenkins-cli.jar -s http://localhost:8080 build my-pipeline -w
Expected OutputExpected
[Pipeline] Start of Pipeline [Pipeline] stage [Pipeline] { (Checkout) [Pipeline] checkout ... (checkout logs) ... [Pipeline] } [Pipeline] stage [Pipeline] { (Run Unit Tests) [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ my-app --- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0 [Pipeline] } [Pipeline] junit Recording test results [Pipeline] End of Pipeline Finished: SUCCESS
→
-w - Waits for the job to complete before returning output
This command fetches the console output of the latest run of the 'my-pipeline' job to review the test execution details and results.
Terminal
java -jar jenkins-cli.jar -s http://localhost:8080 console my-pipeline
Expected OutputExpected
[Pipeline] Start of Pipeline [Pipeline] stage [Pipeline] { (Checkout) [Pipeline] checkout ... (checkout logs) ... [Pipeline] } [Pipeline] stage [Pipeline] { (Run Unit Tests) [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ my-app --- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0 [Pipeline] } [Pipeline] junit Recording test results [Pipeline] End of Pipeline Finished: SUCCESS
Key Concept

If you remember nothing else from this pattern, remember: automate running unit tests in your pipeline to catch errors early and keep your code healthy.

Common Mistakes
Not including the 'junit' step to publish test results in Jenkins.
Without publishing test results, Jenkins cannot show test reports or mark the build as unstable on test failures.
Always add a 'post' section with 'junit' to collect and display test results.
Running tests without checking out the latest code first.
Tests may run on old or missing code, causing confusion and invalid results.
Add a 'Checkout' stage before running tests to get the latest code.
Triggering the pipeline without waiting for it to finish when you want immediate feedback.
You won't see test results or know if the build succeeded until later.
Use the '-w' flag with Jenkins CLI build command to wait for completion.
Summary
Create a Jenkinsfile that checks out code and runs unit tests with a testing tool like Maven.
Use the 'junit' step to publish test results so Jenkins can show reports and mark build status.
Trigger the pipeline job and wait for it to finish to get immediate feedback on test success or failure.

Practice

(1/5)
1. What is the main purpose of running unit tests in a Jenkins pipeline?
easy
A. To monitor server performance
B. To deploy the application automatically
C. To create a backup of the code repository
D. To catch bugs early and ensure code quality

Solution

  1. Step 1: Understand the role of unit tests

    Unit tests check small parts of code to find bugs early.
  2. Step 2: Connect unit tests to pipeline goals

    Running tests in Jenkins pipeline helps maintain code quality before deployment.
  3. Final Answer:

    To catch bugs early and ensure code quality -> Option D
  4. Quick Check:

    Unit tests catch bugs early [OK]
Hint: Unit tests catch bugs early, not deploy or backup [OK]
Common Mistakes:
  • Confusing testing with deployment
  • Thinking tests create backups
  • Assuming tests monitor performance
2. Which Jenkins pipeline syntax correctly runs unit tests using a shell command?
easy
A. execute shell('pytest tests/')
B. sh 'pytest tests/'
C. run 'pytest tests/'
D. command('pytest tests/')

Solution

  1. Step 1: Recall Jenkins pipeline shell syntax

    Jenkins uses the sh step to run shell commands.
  2. Step 2: Match the correct syntax

    sh 'pytest tests/' is the correct way to run tests in a shell step.
  3. Final Answer:

    sh 'pytest tests/' -> Option B
  4. Quick Check:

    Use sh for shell commands [OK]
Hint: Use 'sh' step to run shell commands in Jenkins pipeline [OK]
Common Mistakes:
  • Using non-existent steps like 'run' or 'command'
  • Incorrect function syntax for shell commands
  • Missing quotes around command string
3. Given this Jenkins pipeline snippet, what will be the output if tests fail?
pipeline {
  agent any
  stages {
    stage('Test') {
      steps {
        sh 'pytest tests/'
      }
    }
  }
}
medium
A. Pipeline fails and stops execution
B. Pipeline ignores test failures and continues
C. Pipeline retries the test stage automatically
D. Pipeline marks tests as passed regardless

Solution

  1. Step 1: Understand default behavior of sh step

    The sh step fails the pipeline if the command exits with a non-zero status (test failure).
  2. Step 2: Predict pipeline reaction to test failure

    Since tests fail, the pipeline stage fails and stops further execution.
  3. Final Answer:

    Pipeline fails and stops execution -> Option A
  4. Quick Check:

    sh fails pipeline on error [OK]
Hint: Failed shell commands stop pipeline by default [OK]
Common Mistakes:
  • Assuming pipeline continues despite test failure
  • Thinking Jenkins retries failed stages automatically
  • Believing tests pass regardless of results
4. You wrote this Jenkins pipeline stage to run tests:
stage('Test') {
  steps {
    sh pytest tests/
  }
}
But the pipeline fails with a syntax error. What is the problem?
medium
A. Incorrect stage name
B. Missing agent declaration
C. Missing quotes around the shell command
D. Using 'sh' outside steps block

Solution

  1. Step 1: Check shell command syntax in Jenkins pipeline

    The sh step requires the command as a quoted string.
  2. Step 2: Identify missing quotes causing syntax error

    Here, sh pytest tests/ lacks quotes around pytest tests/.
  3. Final Answer:

    Missing quotes around the shell command -> Option C
  4. Quick Check:

    Shell commands must be quoted in sh step [OK]
Hint: Always quote shell commands in sh step [OK]
Common Mistakes:
  • Forgetting quotes around commands
  • Confusing stage name with syntax error cause
  • Ignoring required agent declaration elsewhere
5. How can you modify a Jenkins pipeline to run unit tests but continue the pipeline even if tests fail, while still marking the test stage as unstable?
hard
A. Use catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') { sh 'pytest tests/' }
B. Use sh 'pytest tests/' || true without any catchError
C. Remove the test stage from the pipeline
D. Use sh 'pytest tests/' inside a timeout block

Solution

  1. Step 1: Understand how to catch errors without failing pipeline

    The catchError step can catch failures and mark the build unstable instead of failing.
  2. Step 2: Apply catchError with proper parameters

    Using catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') around the test command allows continuation but marks stage unstable.
  3. Final Answer:

    Use catchError(buildResult: 'UNSTABLE', stageResult: 'UNSTABLE') { sh 'pytest tests/' } -> Option A
  4. Quick Check:

    Use catchError to continue on test failure [OK]
Hint: Wrap tests in catchError to continue but mark unstable [OK]
Common Mistakes:
  • Using '|| true' hides failures without marking unstable
  • Removing test stage skips testing
  • Timeout does not handle test failures
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard