یک کت و شلوار آزمایشی جامع میتواند به سرعت بادکنک بزند، با بسیاری از کلاسهای آزمایشی مجزا. بیاموزید که چگونه آنها را با استفاده از تست های تودرتو در گروه سازماندهی کنید.
یک مجموعه آزمایشی که به خوبی نوشته شده باشد، چندین تست برای یک ویژگی خاص خواهد داشت. با گروه بندی ویژگی های مرتبط، می توانید ارتباط بین چند گروه از آزمون ها را بیان کنید. یکی از مزایای اصلی گروه بندی کلاس های آزمون واحد این است که می تواند مقدار کد آزمونی که می نویسید را کاهش دهد، زیرا آزمون های گروه بندی شده منابع را به اشتراک می گذارند.
JUnit 5 به شما امکان می دهد با استفاده از حاشیه نویسی @Nested تست های تودرتو ایجاد کنید. در این مقاله یاد خواهید گرفت که حاشیه نویسی @Nested چیست و چگونه از آن استفاده کنید.
تست تودرتو چیست؟
حاشیه نویسی @Nested JUnit نشان می دهد که کلاسی که با آن مرتبط است یک کلاس داخلی است که عضوی از کلاس دیگری است. تست تودرتو یک کلاس آزمایشی است که حاوی حاشیهنویسی تودرتوی@ است، زیرا این بدان معناست که یک (یا چند) کلاس داخلی در یک کلاس تست سطح بالا وجود دارد. یک کلاس تودرتو می تواند در یک کلاس سطح بالا یا در کلاسی که همچنین تودرتو است ظاهر شود.
ایجاد کلاس های جاوا برای آزمایش
یک کلاس تست تو در تو تمام ویژگی های کلاس والد خود را به ارث می برد. بنابراین، بهترین زمان برای ایجاد یک آزمون تودرتو زمانی است که یک گروه بندی منطقی از موارد آزمایشی وجود داشته باشد یا زمانی که یک مورد آزمایشی دارای ویژگی های متفاوتی باشد. یک مثال خوب برای این زمانی است که می خواهید توانایی یک کلاس برای ایجاد اشیاء مفید را آزمایش کنید. مثال دیگر زمانی است که یک روش واحد دو یا چند هدف دارد.
در اینجا یک کلاس مثال است که ممکن است در یک برنامه خرده فروشی استفاده کنید، که نشان می دهد چگونه می توانید یک تست تودرتو ایجاد کنید.
public class Customer {
protected int customerId;
protected String customerName;
protected String customerCode;
// default constructor
public Customer() {
this.customerId = 0;
this.customerName = "";
this.customerCode ="";
}
// primary constructor
public Customer(int customerId, String customerName, String customerCode) {
this.customerId = customerId;
this.customerName = customerName;
this.customerCode = customerCode;
}
// copy constructor
public Customer(Customer customer) {
this.customerId = customer.customerId;
this.customerName = customer.customerName;
this.customerCode = customer.customerCode;
}
// getters and setters
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;
}
// determine a customer discount percentage based on customer type
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;
}
// determine a customer's grandTotal based on customer type
public double grandTotal(double total) {
double discount = customerType(customerCode);
double discountPercentage = total * discount;
double finalTotal = total - discountPercentage;
return finalTotal;
}
}
این کلاس مشتری شامل تمام اجزای یک کلاس جاوا است که با دو روش کامل شده است.
ایجاد یک تست تودرتو با JUnit 5
کلاس Customer چندین سازنده، گیرنده و تنظیم کننده و دو متد دارد. شما می توانید یک کلاس تودرتو (در کلاس تست مشتری) ایجاد کنید که یک شیء مشتری جدید ایجاد می کند و تمام اجزای آن را آزمایش می کند.
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);
});
}
}
}
کلاس CustomerTest، کلاس تست سطح بالای یک کلاس CustomerBuilderTest تودرتو است. CustomerBuilderTest یک شیء مشتری جدید ایجاد می کند و اجزای آن را با استفاده از آزمون های ادعایی آزمایش می کند.
اجرای کلاس تست CustomerTest نتایج آزمایش موفقیت آمیز زیر را ایجاد می کند:
نام کلاس های آزمون و روش آزمون به لطف حاشیه نویسی DisplayName@، تشریحی و جامع است.
دانستن نحوه تست نرم افزار بسیار مهم است
فناوری یکی از جنبه های مهم زندگی روزمره برای اکثر مردم است. ریسک ایجاد نرم افزاری که دقیقاً همان کاری را که قرار است انجام دهد، هرگز بالاتر نبوده است.
یک خودروی خودران که نزدیکی خود به جسم دیگر را اشتباه محاسبه می کند می تواند باعث تصادف بزرگ شود. بنابراین، شما باید برنامه خود را در هر مرحله از توسعه آن آزمایش کنید.