Cách sử dụng chú thích @Before và @After trong JUnit

Cách sử dụng chú thích @Before và @After trong JUnit

Khi bạn đang viết bộ thử nghiệm đơn vị, có thể có một số hoạt động không liên quan đến thử nghiệm mà bạn cần thực hiện. Các hoạt động này có thể diễn ra dưới mọi hình thức. Bạn có thể cần kết nối với cơ sở dữ liệu hoặc thu thập tài nguyên trước khi thực hiện kiểm tra. Sau khi mỗi trường hợp thử nghiệm thực thi, bạn có thể cần giải phóng một số tài nguyên.





LÀM VIDEO TRONG NGÀY

Thực hiện bất kỳ hoạt động nào không liên quan đến kiểm tra ngoài phạm vi của một lớp kiểm tra đơn vị có thể rất tẻ nhạt nếu không muốn nói là không thể. Việc thực thi thành công lớp thử nghiệm của bạn có thể phụ thuộc vào các hoạt động này, vì vậy JUnit cung cấp hai cặp chú thích để giải quyết vấn đề này.





Chú thích @BeforeAll

Một lớp thử nghiệm JUnit có thể có một hoặc nhiều phương pháp thử nghiệm. Chú thích @BeforeAll báo hiệu rằng một phương thức cụ thể sẽ thực thi trước tất cả các phương thức thử nghiệm trong một lớp thử nghiệm. Phương thức được liên kết với chú thích này chỉ thực hiện một lần (khi bắt đầu thử nghiệm) bất kể số lượng phương pháp thử nghiệm trong lớp thử nghiệm.





Bất kỳ phương thức nào sử dụng chú thích @BeforeAll đều phải tuân theo một số quy định. Các phương thức này phải có kiểu trả về void, phải là public và không được private. Chú thích @BeforeAll lý tưởng để thiết lập kết nối với cơ sở dữ liệu hoặc tạo một tệp mới. Bài viết này sử dụng một lớp kiểm tra máy tính để chỉ ra cách bạn có thể sử dụng chú thích @BeforeAll.

Lớp Máy tính

package com.app; 
public class Calculator {
public static int add(int num1, int num2) {
return num1 + num2;
}
public static int subtract(int num1, int num2) {
return num1 - num2;
}
public static int multiply(int num1, int num2) {
return num1 * num2;
}
public static int divide(int num1, int num2) {
return num1 / num2;
}
}

Lớp Kiểm tra Máy tính

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

@DisplayName("Test class demonstrating how to use the before and after annotations.")
class CalculatorTest {
@BeforeAll
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}

@Test
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}

@Test
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}

@Test
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}

@Test
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}

Trong lớp này, chú thích @BeforeAll hoạt động với phương thức powerOnCalculator (), phương thức này sẽ in ra “Máy tính đang bật” trước khi chạy thử nghiệm. Việc thực hiện kiểm tra thành công sẽ in báo cáo kiểm tra sau:



  Báo cáo BeforeAll chú thích

Như bạn có thể thấy, phương pháp được liên kết với chú thích @BeforeAll không xuất hiện trong báo cáo thử nghiệm. Tuy nhiên, nếu có lỗi trong phương thức chú thích @BeforeAll, kết quả báo cáo kiểm tra sẽ chỉ ra lỗi này với lỗi.

Chú thích @BeforeEach

Giống như phương thức chú thích @BeforeAll, phương thức chú thích @BeforeEach sẽ không xuất hiện trong báo cáo thử nghiệm. Phương thức được chú thích @BeforeEach thực thi trước mỗi phương thức thử nghiệm trong một lớp thử nghiệm. Vì vậy, nếu một lớp thử nghiệm chứa hai phương thức thử nghiệm, thì chú thích @BeforeEach sẽ thực thi hai lần.





import static org.junit.jupiter.api.Assertions.*; 
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@DisplayName("Test class demonstrating how to use the before and after annotations.")
class CalculatorTest {
@BeforeAll
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}
@BeforeEach
public void clearCalculator() {
System.out.println("The calculator is ready");
}
@Test
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}
@Test
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}
@Test
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}
@Test
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}

Thêm chú thích @BeforeEach vào lớp CalculatorTest sẽ tạo ra kết quả sau:

  Trước mỗi đầu ra chú thích

Phương thức được liên kết với chú thích @BeforeEach thực thi bốn lần, một lần trước mỗi phương pháp thử nghiệm. Bạn nên lưu ý rằng phương thức @BeforeEach không tĩnh, có kiểu trả về void và không phải là private, vì đây là những quy định bắt buộc. Cũng cần lưu ý rằng phương thức được liên kết với chú thích @BeforeEach chạy sau phương thức @BeforeAll.





Chú thích @AfterAll

Một phương thức có Chú thích @AfterAll sẽ thực thi sau khi tất cả các phương thức thử nghiệm trong lớp thử nghiệm hoàn thành việc thực thi của chúng. Chú thích @AfterAll lý tưởng cho hoạt động tệp cơ bản , chẳng hạn như đóng tệp hoặc ngắt kết nối khỏi cơ sở dữ liệu. Chú thích @AfterAll là bản sao của chú thích @BeforeAll. Giống như chú thích @BeforeAll, chú thích @AfterAll phải tĩnh, phải trả về giá trị void và nhiều thứ không được riêng tư.

@AfterAll 
public static void powerOffCalculator() {
System.out.println("The calculator is off");
}

Việc thêm phương thức được chú thích @AfterAll vào lớp CalculatorTest hiện có sẽ in kết quả sau ra bảng điều khiển:

  AfterAll đầu ra chú thích

Lưu ý rằng phương thức powerOffCalculator (), sử dụng chú thích @AfterAll, in ở cuối lớp thử nghiệm, sau khi tất cả các phương thức thử nghiệm thực thi.

Chú thích @AfterEach

Chú thích @AfterEach là bản sao của chú thích @BeforeEach. Chúng có các quy định bắt buộc giống nhau, hơi khác so với chú thích @BeforeAll và @AfterAll. Điều phân biệt chú thích @AfterEach với chú thích @BeforeEach (khác với tên của chúng) là phương thức @AfterEach chạy sau mỗi phương pháp thử nghiệm.

@AfterEach 
public void returnResults() {
System.out.println("The results are ready");
}

Thực thi lớp CalculatorTest in kết quả sau ra bảng điều khiển:

  AfterEach đầu ra chú thích

Kết quả cho thấy rằng phương thức được liên kết với chú thích @AfterEach (returnResults) in bốn lần. Mỗi lần thực thi phương thức returnResults () chỉ xảy ra sau khi thực hiện mỗi bài kiểm tra đơn vị. Điều này được chứng minh bằng thực tế là đầu ra của phương thức returnResults () xuất hiện sau mỗi đầu ra từ phương thức được liên kết với chú thích @BeforeEach.

Đánh bóng bộ thử nghiệm của bạn bằng cách sử dụng chú thích

JUnit cho phép bạn xử lý các quy trình liên quan đến không kiểm tra bằng cách sử dụng các chú thích cặp trước và sau. Bốn chú thích này thuộc danh sách một số chú thích khác giúp tăng giá trị cho các bài kiểm tra của bạn. Một trong những chú thích khác của JUnit là @DisplayName.

cửa sổ không thể hoàn thành định dạng

Hai ví dụ mã hiển thị lớp CalculatorTest hoàn chỉnh sử dụng chú thích @DisplayName. Chú thích @DisplayName giúp bạn tạo các tên có ý nghĩa hơn cho các lớp thử nghiệm và phương pháp thử nghiệm của mình.