JUnit 5 - Test Suite

Introduction

JUnit Test Suites allow you to group multiple test classes and run them together. This is useful for organizing and executing related tests in a cohesive manner. In JUnit 5, test suites are created using the @Suite annotation from the junit-platform-suite library.

Maven Dependencies

To use JUnit 5 and the JUnit Platform Suite, you need to add the following dependencies to your pom.xml file:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.10.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.10.3</version>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite</artifactId>
        <version>1.10.3</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Explanation of Dependencies

  • JUnit Jupiter API (junit-jupiter-api): This dependency provides the JUnit 5 annotations and assertions. It includes the core API for writing tests.
  • JUnit Jupiter Engine (junit-jupiter-engine): This dependency is the runtime engine that executes JUnit 5 tests. It integrates with your build tool or IDE to run the tests.
  • JUnit Platform Suite (junit-platform-suite): This dependency allows you to define and run test suites using the @Suite annotation. It provides the necessary classes and annotations to create and manage test suites.

Example: Student Management System

Let's create a simple Student class and write tests for its methods. Then, we'll create a test suite to run these tests together.

Student Class

public class Student {
    private String name;
    private int age;
    private String email;

    public Student(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Student Tests

StudentTest

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class StudentTest {

    @Test
    void testStudentCreation() {
        Student student = new Student("John Doe", 20, "john.doe@example.com");
        assertEquals("John Doe", student.getName());
        assertEquals(20, student.getAge());
        assertEquals("john.doe@example.com", student.getEmail());
    }
}

StudentUpdateTest

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class StudentUpdateTest {

    @Test
    void testSetAge() {
        Student student = new Student("John Doe", 20, "john.doe@example.com");
        student.setAge(21);
        assertEquals(21, student.getAge());
    }

    @Test
    void testSetEmail() {
        Student student = new Student("John Doe", 20, "john.doe@example.com");
        student.setEmail("john.new@example.com");
        assertEquals("john.new@example.com", student.getEmail());
    }
}

Creating a Test Suite

Create a test suite to run the StudentTest and StudentUpdateTest classes together.

StudentTestSuite

import org.junit.platform.suite.api.IncludeClassNamePatterns;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({StudentTest.class, StudentUpdateTest.class})
@IncludeClassNamePatterns({"^.*Test$"})
public class StudentTestSuite {
}

Explanation of Test Suite

  • @Suite: This annotation is used to indicate that the class is a JUnit test suite.
  • @SelectClasses: This annotation specifies the test classes that should be included in the suite. In this example, StudentTest and StudentUpdateTest are included.
  • @IncludeClassNamePatterns: This annotation is used to include test classes based on a regex pattern. Here, it includes all classes that end with Test.

Running the Test Suite

Using IntelliJ IDEA

  1. Run Tests: Right-click on the StudentTestSuite file and select Run 'StudentTestSuite'.
  2. View Results: The results will be displayed in the Run window, showing the tests executed from both StudentTest and StudentUpdateTest.

Using Eclipse

  1. Run Tests: Right-click on the StudentTestSuite file and select Run As > JUnit Test.
  2. View Results: The results will be displayed in the JUnit view, showing the tests executed from both StudentTest and StudentUpdateTest.

Conclusion

JUnit Test Suites provide a convenient way to group and run related test classes together. By using the @Suite annotation and the JUnit Platform Suite library, you can organize your tests efficiently and ensure they are executed in a cohesive manner. This approach helps manage large test suites and maintain organized test structures.

Comments

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare