Cách tạo các bài kiểm tra lồng nhau trong JUnit
Một bộ kiểm tra được viết tốt sẽ có một số bài kiểm tra cho một tính năng cụ thể. Bằng cách nhóm các tính năng liên quan, bạn có thể thể hiện mối quan hệ giữa một số nhóm kiểm tra. Một trong những lợi ích chính của việc nhóm các lớp kiểm thử đơn vị là nó có thể giảm số lượng mã kiểm tra bạn viết, vì các bài kiểm tra được nhóm chia sẻ tài nguyên.
JUnit 5 cho phép bạn tạo các bài kiểm tra lồng nhau bằng cách sử dụng chú thích @Nested. Trong bài viết này, bạn sẽ tìm hiểu chú thích @Nested là gì và cách sử dụng nó.
Mục Lục
Kiểm tra lồng nhau là gì?
Chú thích @Nested của JUnit báo hiệu rằng lớp mà nó liên kết với là một lớp bên trong, là một thành viên của lớp khác. Kiểm tra lồng nhau là một lớp kiểm tra có chứa chú thích @Nested, vì điều này có nghĩa là có một (hoặc nhiều) lớp bên trong trong một lớp kiểm tra cấp cao nhất. Một lớp lồng nhau có thể xuất hiện trong một lớp cấp cao nhất hoặc trong một lớp cũng được lồng vào nhau.
Tạo các lớp Java để kiểm tra
Một lớp kiểm tra lồng nhau kế thừa tất cả các tính năng của lớp cha của nó. Do đó, thời điểm tốt nhất để tạo một bài kiểm tra lồng nhau là khi có một nhóm hợp lý các trường hợp kiểm thử hoặc khi một trường hợp kiểm thử đơn lẻ có các tính năng khác nhau. Một ví dụ điển hình về điều này là khi bạn muốn kiểm tra khả năng tạo các đối tượng hữu ích của một lớp. Một ví dụ khác là khi một phương thức duy nhất có hai mục đích trở lên.
Đây là một lớp mẫu mà bạn có thể sử dụng trong một ứng dụng bán lẻ, minh họa cách bạn có thể tạo một bài kiểm tra lồng nhau.
public class Customer {
protected int customerId;
protected String customerName;
protected String customerCode;
public Customer() {
this.customerId = 0;
this.customerName = "";
this.customerCode ="";
}
public Customer(int customerId, String customerName, String customerCode) {
this.customerId = customerId;
this.customerName = customerName;
this.customerCode = customerCode;
}
public Customer(Customer customer) {
this.customerId = customer.customerId;
this.customerName = customer.customerName;
this.customerCode = customer.customerCode;
}
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerCode() {
return customerCode;
}
public void setCustomerCode(String customerCode) {
this.customerCode = customerCode;
}
public double customerType(String customerCode) {
double discount = 0;
if (customerCode.toLowerCase().equals("pre")) {
discount = 0.10;
} else if (customerCode.toLowerCase().equals("gen")) {
discount = 0.02;
} else if (customerCode.toLowerCase().equals("new")) {
discount = 0.05;
}
return discount;
}
public double grandTotal(double total) {
double discount = customerType(customerCode);
double discountPercentage = total * discount;
double finalTotal = total - discountPercentage;
return finalTotal;
}
}
Lớp Khách hàng này chứa tất cả các thành phần của Lớp Java, hoàn chỉnh với hai phương thức.
Tạo một bài kiểm tra lồng nhau với JUnit 5
Lớp Khách hàng có một số hàm tạo, bộ nhận và bộ định tuyến, và hai phương thức. Bạn có thể tạo một lớp lồng nhau (trong lớp kiểm tra Khách hàng) để tạo một đối tượng Khách hàng mới và kiểm tra tất cả các thành phần của nó.
import static org.junit.jupiter.api.Assertions.*;import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@DisplayName("Customer Test Class Showing How to Create Nested Tests.")
class CustomerTest {
protected int customerId = 301;
protected String customerName = "Mike Wilson";
protected String customerCode = "Pre";
protected double total = 600;
@Nested
@DisplayName("Customer Builder Nested Test Class Within a Top-Level Test Class")
class CustomerBuilderTest {
Customer customer = new Customer(customerId, customerName, customerCode);
double grandTotal = customer.grandTotal(total);
@Test
@DisplayName("Testing the Customer's Class Constructors, Getters and Setters, and Methods.")
void customerBuilder() {
assertAll(() -> {
assertEquals(customerId, customer.getCustomerId());
assertEquals(customerName, customer.getCustomerName());
assertEquals(customerCode, customer.getCustomerCode());
assertEquals(0.10, customer.customerType(customerCode));
assertEquals(540, grandTotal);
});
}
}
}
Lớp CustomerTest là lớp thử nghiệm cấp cao nhất cho lớp CustomerBuilderTest lồng nhau. CustomerBuilderTest tạo một đối tượng Khách hàng mới và kiểm tra các thành phần của nó bằng cách sử dụng các bài kiểm tra xác nhận.
Việc thực thi lớp kiểm tra CustomerTest tạo ra các kết quả kiểm tra thành công sau:
Tên của các lớp kiểm tra và phương pháp kiểm tra mang tính mô tả và toàn diện, nhờ vào Chú thích @DisplayName.
Biết cách kiểm tra phần mềm là tối quan trọng
Công nghệ là một khía cạnh quan trọng của cuộc sống hàng ngày đối với hầu hết mọi người. Tiền đặt cọc để tạo ra phần mềm làm chính xác những gì nó được cho là phải làm chưa bao giờ cao hơn.
Một chiếc xe tự lái tính toán sai vị trí của nó với một đối tượng khác có thể gây ra một vụ tai nạn lớn. Do đó, bạn cần kiểm tra ứng dụng của mình ở mọi giai đoạn phát triển của nó.