تست های واحد باید تا حد امکان عملکرد را ایزوله کنند، اما حذف همه کدهای وابسته می تواند مشکل باشد. این حاشیه نویسی کمک خواهد کرد.
وقتی در حال نوشتن یک مجموعه تست واحد هستید، ممکن است برخی از فعالیتهای غیر مرتبط با آزمون وجود داشته باشد که باید انجام دهید. این فعالیت ها می توانند هر شکلی داشته باشند. ممکن است لازم باشد قبل از انجام آزمایش به یک پایگاه داده متصل شوید یا منابع را جمع آوری کنید. پس از اجرای هر تست، ممکن است لازم باشد منابعی را آزاد کنید.
انجام هر یک از این فعالیتهای غیرمرتبط با آزمون خارج از محدوده یک کلاس آزمون واحد، اگر غیرممکن نباشد، ممکن است خستهکننده باشد. اجرای موفقیت آمیز کلاس تست شما ممکن است به این فعالیت ها بستگی داشته باشد، بنابراین JUnit دو جفت حاشیه نویسی برای رفع این مشکل ارائه می دهد.
حاشیه نویسی @BeforeAll
یک کلاس تست JUnit می تواند یک یا چند روش تست داشته باشد. حاشیه نویسی @BeforeAll نشان می دهد که یک متد خاص باید قبل از همه روش های تست در یک کلاس آزمایشی اجرا شود. متد مربوط به این حاشیهنویسی صرفنظر از تعداد روشهای تست در کلاس تست، فقط یک بار (در شروع آزمون) اجرا میشود.
هر روشی که از حاشیه نویسی @BeforeAll استفاده می کند باید از چند شرط پیروی کند. این متدها باید دارای نوع بازگشتی باطل باشند، عمومی باشند و خصوصی نباشند. حاشیه نویسی @BeforeAll برای برقراری ارتباط با پایگاه داده یا ایجاد یک فایل جدید ایده آل است. این مقاله از یک کلاس تست ماشین حساب استفاده می کند تا نشان دهد چگونه می توانید از حاشیه نویسی @BeforeAll استفاده کنید.
کلاس ماشین حساب
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;
}
}
کلاس CalculatorTest
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 {
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}
در این کلاس، حاشیهنویسی @BeforeAll با متد powerOnCalculator() کار میکند، که قبل از اجرای آزمایشی «ماشینحساب روشن است» را چاپ میکند. اجرای موفقیت آمیز تست، گزارش تست زیر را چاپ می کند:
همانطور که می بینید روش مرتبط با حاشیه نویسی @BeforeAll در گزارش تست ظاهر نمی شود. با این حال، اگر در روش حاشیه نویسی @BeforeAll خطایی وجود داشته باشد، نتایج گزارش آزمایشی این مشکل را نشان می دهد.
حاشیه نویسی @BeforeEach
مانند روش @BeforeAll annotated، روش @BeforeEach annotated در گزارش تست ظاهر نمی شود. متد @BeforeEach annotated قبل از هر روش تست در یک کلاس تست اجرا می شود. بنابراین، اگر یک کلاس تست شامل دو روش تست باشد، حاشیهنویسی @BeforeEach دو بار اجرا میشود.
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 {
public static void powerOnCalculator() {
System.out.println("The calculator is on");
}
public void clearCalculator() {
System.out.println("The calculator is ready");
}
@DisplayName("Testing method that adds two integer values.")
public void testAdd() {
assertEquals(7, Calculator.add(3, 4));
}
@DisplayName("Testing method that subtracts one integer value from another.")
public void testSubtract() {
assertEquals(6, Calculator.subtract(9, 3));
}
@DisplayName("Testing method that multiplies two integer values")
public void testMultiply() {
assertEquals(10, Calculator.multiply(5, 2));
}
@DisplayName("Testing method that divides one integer value by another")
public void testDivide() {
assertEquals(2, Calculator.divide(4, 2));
}
}
افزودن حاشیه نویسی @BeforeEach به کلاس CalculatorTest خروجی زیر را تولید می کند:
روش مرتبط با حاشیه نویسی @BeforeEach چهار بار، یک بار قبل از هر روش آزمایشی اجرا می شود. باید توجه داشته باشید که متد @BeforeEach ایستا نیست، نوع بازگشتی باطل دارد و خصوصی نیست، زیرا این موارد اجباری هستند. همچنین مهم است که متد مرتبط با حاشیه نویسی @BeforeEach بعد از روش @BeforeAll اجرا می شود.
حاشیه نویسی @AfterAll
یک متد با @AfterAll Annotation پس از اتمام اجرای تمام متدهای تست در کلاس تست اجرا می شود. حاشیه نویسی @AfterAll برای عملیات اصلی فایل، مانند بستن یک فایل، یا قطع ارتباط از پایگاه داده ایده آل است. حاشیه نویسی @AfterAll همتای حاشیه نویسی @BeforeAll است. مانند حاشیه نویسی @BeforeAll، حاشیه نویسی @AfterAll باید ثابت باشد، باید خالی باشد و بسیاری از آنها خصوصی نباشند.
public static void powerOffCalculator() {
System.out.println("The calculator is off");
}
افزودن متد @AfterAll annotated به کلاس CalculatorTest موجود، خروجی زیر را در کنسول چاپ میکند:
توجه داشته باشید که متد powerOffCalculator() که از حاشیه نویسی @AfterAll استفاده می کند، پس از اجرای تمام روش های تست، در انتهای کلاس تست چاپ می شود.
حاشیه نویسی @AfterEach
حاشیه نویسی @AfterEach همتای حاشیه نویسی @BeforeEach است. آنها دارای مقررات اجباری یکسانی هستند که کمی با حاشیه نویسی های @BeforeAll و @AfterAll متفاوت است. آنچه که حاشیه نویسی @AfterEach را از حاشیه نویسی @BeforeEach (به غیر از نام آنها) متمایز می کند این است که متد @AfterEach بعد از هر روش آزمایشی اجرا می شود.
public void returnResults() {
System.out.println("The results are ready");
}
با اجرای کلاس CalculatorTest خروجی زیر در کنسول چاپ می شود:
خروجی نشان می دهد که روش مرتبط با حاشیه نویسی @AfterEach (returnResults) چهار بار چاپ می شود. هر اجرای متد returnResults() فقط پس از اجرای هر تست واحد اتفاق می افتد. این امر با این واقعیت مشهود است که خروجی متد returnResults بعد از هر خروجی از متد مرتبط با حاشیه نویسی @BeforeEach ظاهر می شود.
مجموعه های آزمایشی خود را با استفاده از حاشیه نویسی جلا دهید
JUnit به شما اجازه می دهد تا با استفاده از حاشیه نویسی های زوج قبل و بعد، فرآیندهای غیر مرتبط با آزمایش را مدیریت کنید. این چهار حاشیه نویسی به فهرستی از چندین حاشیه نویسی دیگر تعلق دارند که به تست های شما ارزش می بخشند. یکی دیگر از حاشیه نویسی های JUnit @DisplayName است.
دو نمونه کدی که کلاس CalculatorTest کامل را نمایش می دهند از حاشیه نویسی @DisplayName استفاده می کنند. حاشیهنویسی @DisplayName به شما کمک میکند تا نامهای معنادارتری برای کلاسهای آزمایشی و روشهای تست خود ایجاد کنید.