JUnit là một Java testing framework được sử dụng phổ biến trong các dự án Java. JUnit 5 là phiên bản mới nhất của JUnit, nó có một số cải tiến thú vị, với mục tiêu hỗ trợ các tính năng mới từ phiên bản Java 8 trở đi cũng như cho phép nhiều kiểu kiểm thử khác nhau.

Cài đặt JUnit 5 trong dự án Maven

Việc cài đặt JUnit 5 khá đơn giản, chúng ta chỉ cần thêm các dependency của JUnit và file pom.xml

<!-- Only needed to run tests in a version of IntelliJ IDEA that bundles older versions -->
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.6.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.6.0</version>
    <scope>test</scope>
</dependency>

Lưu ý: Bạn cần sử dụng phiên bản Java 8 trở lên

Cấu tạo của JUnit 5

Không giống các phiên bản trước của JUnit, JUnit 5 bao gồm một số module khác nhau từ 3 dự án con (sub-projects) khác nhau

JUnit 5 = Junit Platform + JUnit Jupiter + JUnit Vintage

JUnit Platform đóng vai trò là nền tảng khởi chạy các framework kiểm thử trên JVM. Nó cũng xác định API TestEngine để phát triển framework kiểm thử chạy trên platform. Ngoài ra, nền tảng này còn cung cấp Console Launcher để khởi chạy platform từ command line và trình chạy dựa trên JUnit 4 để chạy bất kỳ TestEngine nào trên nền tàng trong môi trường dựa trên JUnit 4.

JUnit Platform cũng tồn tại trong các IDE phổ biến (như IntelliJ IDEA, Eclipse, NetBeans, và VS Code) và các công cụ xây dựng (Như Gradle, Maven, Ant)

JUnit Jupiter là sự kết hợp của mô hình lập trình mới và mô hình mở rộng để viết testcase và phần mở rộng trong JUnit 5. Jupiter sub-project cung cấp một TestEngine để chạy các kiểm thử dựa trên nền tảng này

JUnit Vintage cung cấp TestEngine để chạy cac kiểm thử dựa trên JUnit 3 và JUnit 4

Annotations

JUnit 5 hỗ trợ các annotations sau để viết unit test.

AnnotationMô tả
@TestĐặt ở đầu method để thông báo method được sử dụng để kiểm thử (test method)
@ParameterizedTestBiểu thị rằng test method có nhiều tham số
@RepeatedTestBiểu thị rằng test method là một kiểm thử được lặp nhiều lần
@TestFactoryBiểu thị rằng test method là một test factory cho các dynamic test
@TestTemplateBiểu thị rằng method là một template cho các test case được thiết kế để được gọi nhiều lần
@TestMethodOrderCấu hình thứ tự thực thi cho các annotation @Test, tương tự như annotation @FixMethodOrder trong JUnit 4
@TestIntanceQuy định vòng đời của các annotation test class
@DisplayNameKhai báo tên hiển thị tùy chỉnh cho các test class hoặc test method
@DisplayNameGenerationKhai báo tên hiển thị cho các test class được generate
@BeforeEachBiểu thị rằng annotated method phải được thực thi trước mỗi method @Test, @RepeatedTest hoặc @TestFactory trong lớp hiện tại, nó tương tự như annotation @Before của JUnit 4
@AfterEachBiểu thị rằng annotated method phải được thực thi sau mỗi method @Test, @RepeatedTest hoặc @ParameterizedTest trong lớp hiện tại, nó tương tự như annotation @After của JUnit 4
@BeforeAllBiểu thị rằng annotated method phải được thực thi trước tất cả method @Test, @RepeatedTest, @TestFactory và @ParameterizedTest trong lớp hiện tại, nó tương tự như annotation @BeforeClass của JUnit 4
@AfterAllBiểu thị rằng annotated method phải được thực thi sau tất cả method @Test, @RepeatedTest, @TestFactory và @ParameterizedTest trong lớp hiện tại, nó tương tự như annotation @AfterClass của JUnit 4
@NestedBiểu thị rằng annotated class là một test class non static lồng nhau. Các method @BeforeAll và @AfterAll không thể được sử dụng trực tiếp trong test class @Nested trừ khi test instance lifecycle được sử dụng
@TagĐược sử dụng để khai báo các thẻ filter test, ở cấp độ class hoặc method
@DisabledĐược sử dụng để vô hiệu hóa một test method hay một test class

Thực hành với các annotations

Hãy sử dụng các annotation trong JUnit 5 và xem cách sử dụng cũng như hoạt động để hiểu rõ hơn

package vn.techmaster;

import org.junit.jupiter.api.*;

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

@DisplayName("JUnit5Example")
class DemoTestTest {
    //@BeforeAll dùng để chỉ định test method chạy đầu tiên
    //Nó phải được đặt là phương thức tĩnh (static), nếu không chương trình sẽ không biên dịch được
    @BeforeAll
    static void setup() {
        System.out.println("BeforeAll");
    }

    //@BeforeEach chỉ định 1 method sẽ luôn được thực thi trước mỗi test method thực thi
    @BeforeEach
    public void beforeEach() {
        System.out.println("BeforeEach");
    }

    //@AfterAll Chỉ định method sẽ được thực thi khi tất cả các test method trong class thực thi xong
    //Nó phải được đặt trên static method
    @AfterAll
    public static void afterAll() {
        System.out.println("AfterAll");
    }

    //@AfterEach Chỉ định 1 method luôn thực thi sau khi 1 test method thực thi xong
    @AfterEach
    public void afterEach() {
        System.out.println("AfterEach");
    }
    @Test
    @DisplayName("My test method")
    public void test() {
        System.out.println("Test");
    }

    //disable() method không được thực thi vì bị ngắn chặn bởi @Disabled
    @Test
    @Disabled
    public void disable() {
        System.out.println("Disabled");
    }

}

Kết quả thực thi:

Phần source code ví dụ trên mình để đây nhé : https://github.com/EriChannel/JUnit-5-Tutorial/tree/main/01-Annotations/Demo

Tham khảo khoá học Java Spring Boot Full Stack 7 tháng tại Techmaster