JUnit در Java
چک کنید یک متد کوچک همان مقداری را برمیگرداند که میخواستید. در SumCheck.java یک Sum با دسترسی package-private و متد add نگه دارید، کلاس عمومی SumCheck را نگه دارید، یک متد را با @Test علامت بزنید، و assertEquals(5, Sum.add(2, 3)); را صدا بزنید. وقتی 2 + 3 برابر 5 است، چک پاس میشود. دموی دوم Sum.add(4, 5) را در برابر 9 چک میکند. JAR اختیاری را برای صفحهٔ بعد بگذارید. این درس چک JUnit با assertEquals است، نه چاپ accessor در Records و نه خط لولهٔ Streams.
یک چک که 5 میخواهد
SumCheck.java را باز کنید. نام کلاس عمومی را SumCheck نگه دارید. دموهای باقیماندهٔ Card در Records، خط لولههای باقیماندهٔ Pipe در Streams، قدمزدنهای باقیماندهٔ Cue در lambda، و پرسوجوهای باقیماندهٔ Scanner در Box را پاک کنید اگر داستان JUnit را میپوشانند. فایل آموزشی یک کلاس تست است، نه main که oak چاپ کند.
بالای فایل این importها را بگذارید:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
یک کمککنندهٔ کوچک در همان فایل نگه دارید:
class Sum {
static int add(int left, int right) {
return left + right;
}
}
داخل SumCheck یک متد تست بنویسید:
@Test
void addsTwoAndThree() {
assertEquals(5, Sum.add(2, 3));
}
@Test متد را بهعنوان چکی علامت میزند که runner باید اجرا کند. assertEquals اول مقدار مورد انتظار و بعد مقدار واقعی را میگیرد. اینجا مورد انتظار 5 است و واقعی Sum.add(2, 3). یکی هستند، پس چک پاس میشود.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class Sum {
static int add(int left, int right) {
return left + right;
}
}
public class SumCheck {
@Test
void addsTwoAndThree() {
assertEquals(5, Sum.add(2, 3));
}
}
این فایل را با یک runner مربوط به JUnit 5 روی classpath ترجمه و اجرا کنید — دکمهٔ تست IDE، یا launcher کنسولی که کلاس SumCheck را انتخاب میکند. عادت دوره هنوز این است: «سورس تست را ترجمه کنید، بعد چکها را اجرا کنید.» روی این صفحه java SumCheck را مثل برنامهٔ معمولی با main اجرا نمیکنید. t.name() چاپ نمیکنید. از runner میخواهید متدهای @Test را اجرا کند.
یکبار چک را قدمبهقدم ببینید. Sum.add(2, 3) مقدار 5 برمیگرداند. assertEquals(5, ...) آن 5 را با مورد انتظار 5 مقایسه میکند. یکی هستند. چک پاس میشود. گزارش ممکن است نتیجهٔ سبز یا خلاصهٔ کوتاه موفقیت نشان دهد، بسته به runner. واقعیت آموزشی مهم این است که مورد انتظار و واقعی توافق کردند.
همانطور که به متد نگاه میکنید قانون مبتدی را بگویید: @Test چک را علامت میزند؛ assertEquals(expected, actual) مقایسه میکند؛ متد را طوری نام بگذارید که انسان بخواند. روی این صفحه دموی بستهبندی JAR نسازید. JAR منتظر درس اختیاری بعدی است. چک ناموفق در برابر 9 را دموی اول فرض نکنید — دموی اول 5 میخواهد.
اگر هنوز از فایل باقیماندهٔ Card در Records مقدار oak میبینید، به SumCheck بروید و assertEquals(5, Sum.add(2, 3)); را نگه دارید. اگر runner هیچ تستی پیدا نکرد، تأیید کنید متد @Test دارد و طوری private نیست که runner ردش کند.
چک دوم که 9 میخواهد
همان کلاس عمومی SumCheck و همان کمککنندهٔ Sum را نگه دارید. بدن تست را برای جمع دیگری عوض کنید:
@Test
void addsFourAndFive() {
assertEquals(9, Sum.add(4, 5));
}
4 + 5 برابر 9 است. مورد انتظار 9 است. واقعی Sum.add(4, 5) است. یکی هستند، پس این چک هم پاس میشود. روی این صفحه برای هر شکل آموزشی یک چک روشن نگه دارید تا عدد مورد انتظار آسان نام بماند.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class Sum {
static int add(int left, int right) {
return left + right;
}
}
public class SumCheck {
@Test
void addsFourAndFive() {
assertEquals(9, Sum.add(4, 5));
}
}
یکبار چک را قدمبهقدم ببینید. Sum.add(4, 5) مقدار 9 برمیگرداند. assertEquals(9, ...) مورد انتظار و واقعی را مقایسه میکند. یکی هستند. چک پاس میشود. دو دمو را بهعنوان دو شکل آموزشی نگه دارید. اول چکی که 5 میخواهد ثابت کنید. بعد چکی که 9 میخواهد. هر دو شکل importهای JUnit، کمککنندهٔ Sum، و @Test را مشترک دارند.
اگر دموی اول Sum.add(2, 3) را با 9 مقایسه میکرد، چک شکست میخورد چون 5 برابر 9 نیست. آن برنامهٔ ناموفق فایل آموزشی اول نیست. فایل آموزشی اول 5 میخواهد.
JUnit نه Records است و نه JAR
Records اجزای فشردهای داشت که با accessor چاپ میکردید. JUnit نتیجه را در برابر مقداری که انتظار دارید چک میکند. JAR فایلهای کلاس را برای ارسال در صفحهٔ اختیاری بعدی بستهبندی میکند. امروز این سه نقش را در یک فایل مبتدی قاطی نکنید.
5 اینجا مقدار مورد انتظار در assertEquals است. t.n() از record با Tag نیست و نتیجهٔ map در stream نیست. وقتی فایل باقیماندهٔ Card هنوز oak چاپ میکند، آن را تاریخچه بگذارید و خط assertion در SumCheck را نگه دارید.
بدون @Test بسیاری از runnerها متد را بهعنوان چک اجرا نمیکنند. بدون assertEquals در این شکل آموزشی مقایسهای ندارید. هر دو را نگه دارید. دستورهای JAR را تا آن درس از این صفحه دور نگه دارید.
عادتهای runner و classpath
نوعهای JUnit در بستههای org.junit.jupiter.api زندگی میکنند. ویرایشگر یا ابزار ساخت باید آن jarها را روی classpath ترجمه و اجرا بگذارد. مبتدیها اغلب کلاس تست را درست میچسبانند و هنوز «package does not exist» میبینند وقتی jarها نیستند — classpath را درست کنید، نه املای @Test.
Sum را در همان فایل package-private نگه دارید تا فقط یک کلاس عمومی SumCheck بماند. مقادیر مورد انتظار را در assertEquals بهصورت literal روشن نگه دارید. نام متدها را خوانا نگه دارید. System.out.println معمولی را از چکهای آموزشی دور نگه دارید مگر بعداً برای دیباگ خودتان.
اگر ترجمه روی org.junit شکست خورد، خط import درست است و کتابخانه از classpath غایب است. اگر runner بگوید صفر تست پیدا شد، دنبال @Test گمشده یا نام کلاسی بگردید که انتخاب نکردهاید.
بررسی پوشه قبل از JAR
بعد از کامپایل موفق با jarهای JUnit در دسترس، پوشه را لیست کنید. باید SumCheck.class و معمولاً Sum.class کنار سورس را ببینید. سورس را ویرایش کنید، ذخیره کنید، دوباره ترجمه کنید، بعد چکها را با همان عادت runner اجرا کنید. کلاس کهنه میتواند مقدار مورد انتظار عوضشده را پنهان کند اگر بعد از ویرایش ترجمه را رد کنید.
اگر javac از کلاسهای عمومی تکراری شکایت کرد، فقط SumCheck عمومی بماند. اگر بعد از تایپ assertEquals(9, Sum.add(2, 3)) چک شکست خورد، آن ناهماهنگی واقعی است — جفت منطبق را برای دمویی که میخواهید نگه دارید برگردانید.
record Tag از Card را داخل SumCheck نچسبانید. stream().map از Pipe را جایگزین assertEquals نکنید. کار اختیاری JUnit یک چک علامتخورده است که مورد انتظار و واقعی را مقایسه میکند.
قبل از JAR اختیاری
میتوانید کلاس عمومی SumCheck را نگه دارید، کمککنندهٔ Sum.add را نگه دارید، @Test و assertEquals را از JUnit وارد کنید، Sum.add(2, 3) را در برابر 5 چک کنید، بعد Sum.add(4, 5) را در برابر 9 چک کنید. با JUnit روی classpath ترجمه کنید و چکها را با runner مربوط به JUnit 5 اجرا کنید. صفحهٔ اختیاری بعدی JAR است.
دموهای SumCheck را برای جفت assertion روشن نگه دارید. فایلهای Card در Records را هنگام تمرین JUnit از این صفحه دور نگه دارید. فایلهای Pipe در Streams را هنگام تمرین JUnit از این صفحه دور نگه دارید. کار JAR را تا آن درس از این صفحه دور نگه دارید. این عادتها نقطهٔ عبور قبل از ادامه هستند. وقتی چک اول 5 میخواهد و پاس میشود، یا چک دوم 9 میخواهد و پاس میشود، JUnit کار این درس را کرده و اگر مسیر اختیاری را ادامه دهید برای JAR آمادهاید.
یک نوبت آخر روی پوشه: یک SumCheck عمومی، Sum با package-private، @Test حاضر، assertEquals(expected, actual) همراستا، importهای JUnit حاضر، بدون انتظار Scanner، بدون نیاز به خط لولهٔ stream. یکبار دیگر چکها را روی دمویی که باز نگه داشتهاید ترجمه و اجرا کنید. اگر مورد انتظار و واقعی هنوز یکی هستند، شکل JUnit محکم است و دوره میتواند به JAR اختیاری در صفحهٔ بعد برود. برای هر خواندن یک عادت assertion روشن نگه دارید تا هر بار همان نقشه را یاد بگیرید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود