JUnit: چیست، مفاهیم کلیدی و چگونگی کار

نویسنده: IT Sectr منتشر شده: 2026-04-08 زمان مطالعه: 8 دقیقه

JUnit — چارچوبی استاندارد برای آزمون‌های واحد در اکوسیستم Java و Kotlin است که در توسعه Android برای بررسی منطق کسب‌وکار در سطح مؤلفه‌های جداگانه استفاده می‌شود. چارچوب مجموعه‌ای از انوتاشها، روش‌های assertion و Test Runner را برای کشف و اجرای خودکار آزمون‌ها فراهم می‌کند. به گزارش JUnit.org، این کتابخانه محبوب‌ترین راه‌حل برای آزمون‌های واحد در اکوسیستم JVM باقی می‌ماند: بیش از 70% پروژه‌های Java از JUnit در هر نسخه‌ای استفاده می‌کنند.

نکات کلیدی

  • JUnit — چارچوبی منبع‌باز برای آزمون‌های واحد کد Java و Kotlin.
  • انوتاشها — @Test, @BeforeEach, @BeforeAll چرخه زندگی کلاس آزمون را مدیریت می‌کنند.
  • Assertions — assertEquals, assertTrue, assertThrows نتایج مورد انتظار را بررسی می‌کنند.
  • آزمون‌های پارامتریزه — امکان اجرای یک آزمون با مجموعه‌های مختلف از داده‌های ورودی.
  • Test Runner — زیرساخت JUnit به طور خودکار تمامی آزمون‌ها را پیدا و اجرا می‌کند.

JUnit چیست؟

JUnit — چارچوبی منبع‌باز برای نوشتن و اجرای آزمون‌های واحد تکرارپذیر به زبان Java و Kotlin است. آن بخشی از اکوسیستم xUnit است — خانواده چارچوب‌هایی که بر پایه معماری Kent Beck و Erich Gamma ساخته شده‌اند و ابزار استاندارد آزمون در Android Studio و IntelliJ IDEA می‌باشد.

وظیفه اصلی JUnit جداکردن یک بخش کوچک از کد (روش، کلاس) و بررسی رفتار آن در شرایط کنترل شده است. آزمون‌ها به صورت کلاس‌های معمولی Java/Kotlin با انوتاشها نوشته می‌شوند و چارچوب کشف آزمون‌ها، مدیریت چرخه زندگی و جمع‌آوری آمار اجرای آن‌ها را بر عهده می‌گیرد.

نسخه اول JUnit در سال 1997 منتشر شد و رویکرد را به طور بنیادین تغییر داد و روش‌های Test-Driven Development (TDD) را رایج کرد. امروزه JUnit 5 (Jupiter) نسخه فعلی است که با معماری ماژولایی و پشتیبانی از Java 8+ و افزونه‌ها تماماً بازنویسی شده است.

JUnit چگونه کار می‌کند

مکانیزم اجرای JUnit بر پایه الگوی Test Runner استوار دارد که classpath را اسکن می‌کند، روش‌هایی را با انوتاشان @Test پیدا می‌کند، از کلاس آزمون یک نمونه ایجاد می‌کند و روش‌ها را به ترتیب مشخصی اجرا می‌کند. Test Runner چرخه زندگی را مدیریت می‌کند: BeforeAll → BeforeEach → Test → AfterEach → AfterAll.

چرخه زندگی کلاس آزمون

JUnit هر روش آزمون را در یک نمونه جداگانه از کلاس قرار می‌دهد که جداگانگی بین آزمون‌ها را تضمین می‌کند. این به معنای آن است که فیلدهای کلاس وضعیت را بین روش‌های @Test مختلف حفظ نمی‌کنند — هر آزمون با یک شیئٔ پاک آغاز می‌شود.

ساختار پایه آزمون

ساده‌ترین آزمون در JUnit به صورت یک روش با انوتاشان @Test است که در داخل آن کد مورد آزمون فراخوانی شده و نتیجه از طریق assertion بررسی می‌شود. اگر assertion موفق نباشد — آزمون شکست خورده دانسته می‌شود و JUnit خطا را گزارش می‌دهد.

java
@Test
void additionShouldReturnCorrectSum() {
    var calculator = new Calculator();
    var result = calculator.add(2, 3);
    assertEquals(5, result);
}

Test Runner به طور خودکار چنین روشی را پیدا می‌کند، آن را اجرا می‌کند و نتیجه را گزارش می‌دهد. اگر روش استثنائی نیندازد — آزمون موفقیت آمیز است (green). اگر assertion کار نکند — آزمون شکست می‌خورد (red).

انوتاشهای JUnit: چرخه زندگی آزمون

انوتاشهای JUnit تعیین می‌کنند که کد آزمون چه زمانی و چگونه اجرا شود. در JUnit 5 انوتاشها در بسته org.junit.jupiter.api قرار دارند و تمام مراحل را پوشش می‌دهند: آماده‌سازی داده‌ها، اجرای آزمون، پاک‌سازی منابع.

انوتاشانکاربردتعداد اجرا
@Testنشانه‌گذاری روش آزمونیک بار به ازای هر فراخوانی
@BeforeEachآماده‌سازی قبل از هر آزمونقبل از هر @Test
@BeforeAllمقدمه‌چینی یکباره کلاسیک بار قبل از تمامی آزمون‌ها
@AfterEachپاک‌سازی پس از هر آزمونپس از هر @Test
@AfterAllپایان یکباره کلاسیک بار پس از تمامی آزمون‌ها
@DisplayNameنام قابل خواندن آزمونتزئینی

نمونه استفاده از انوتاشها

یک کلاس آزمون کامل با چرخه زندگی مناسب را در نظر بگیرید. روش setUp قبل از هر آزمون یک نمونه تازه از Calculator ایجاد می‌کند و tearDown منابع را آزاد می‌کند — به عنوان مثال، بستن دسکریپتورهای فایل یا اتصالات پایگاه داده.

java
class CalculatorTest {

    private Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @Test
    void subtractionShouldReturnCorrectResult() {
        int result = calculator.subtract(10, 4);
        assertEquals(6, result);
    }

    @AfterEach
    void tearDown() {
        calculator.reset();
    }
}

Assertions: بررسی نتایج در JUnit

Assertions — روش‌هایی استاتیک هستند که نتیجه فعلی را با نتیجه مورد انتظار مقایسه می‌کنند و در صورت ناتجام بودن، استثناء ایجاد می‌کنند. JUnit 5 کلاس org.junit.jupiter.api.Assertions را با بیش از 25 روش برای سناریوهای مختلف بررسی ارائه می‌دهد — از مقایسه ساده مقادیر تا بررسی مهل‌های زمانی و assertion‌های گروهی.

  • assertEquals(expected, actual) — بررسی برابری از طریق equals().
  • assertTrue(condition) — بررسی درست بودن شرط.
  • assertFalse(condition) — بررسی نادرست بودن شرط.
  • assertNotNull(object) — بررسی اینکه شیئٔ null نباشد.
  • assertNull(object) — بررسی اینکه شیئٔ برابر null است.
  • assertThrows(exception, executable) — بررسی اینکه کد استثناء مشخصی را تولید می‌کند.
  • assertAll(executables) — چندین بررسی را گروه‌بندی کرده و همه را بدون توقف در اولین خطا اجرا می‌کند.

assertThrows برای بررسی استثناء‌ها

روش assertThrows سزاوار توجه ویژه است که امکان بررسی اینکه کد وضعیت‌های خطا را به طور صحیح مدیریت می‌کند را فراهم می‌کند — تقسیم بر صفر، ارسال null، تجاوز از حدود.

java
@Test
void divisionByZeroShouldThrowException() {
    Calculator calc = new Calculator();

    ArithmeticException exception = assertThrows(
        ArithmeticException.class,
        () -> calc.divide(10, 0)
    );

    assertEquals("Cannot divide by zero", exception.getMessage());
}

آزمون‌های پارامتریزه در JUnit

آزمون‌های پارامتریزه امکان اجرای یک روش آزمون مشابه را با مجموعه‌های مختلفی از ارگومان فراهم می‌کنند. در JUnit 5 از انوتاشان @ParameterizedTest در ترکیب با منبع داده — @ValueSource، @CsvSource، @MethodSource یا @EnumSource استفاده می‌شود.

این رویکرد تکرار کد را به طور چشمگیری کاهش می‌دهد: به جای ده آزمون یکسان برای مقادیر مختلف، یک روش پارامتریزه نوشته می‌شود. به گزارش Google Testing Blog، پارامتریزه حجم کد آزمون را 40–60% بدون از دست دادن پوشش کاهش می‌دهد.

نمونه با CsvSource

انوتاشان @CsvSource چندین سطر را با جداکننده کاما به آزمون ارسال می‌کند. هر سطر مربوط به یک اجرای آزمون است. JUnit به طور خودکار مقادیر رشته‌ای را به انواع مورد نیاز تبدیل می‌کند: int، long، String و غیره.

java
@ParameterizedTest
@CsvSource({
    "1,    1,   2",
    "2,    3,   5",
    "10,  20,  30",
    "-1,   1,   0"
})
void additionWithMultipleInputs(int a, int b, int expected) {
    assertEquals(expected, a + b);
}

MethodSource برای شیئ‌های پیچیده

زمانی که داده‌های ورودی بیش از اعداد یا رشته‌های ساده پیچیده‌تر هستند، از @MethodSource استفاده می‌شود. آن به یک روش استاتیک ارجاع می‌دهد که Streamی از ارگومان‌ها را برمی‌گرداند — به عنوان مثال، Stream of Arguments یا Stream از شیئ‌های User برای آزمون لایه DAO.

ادغام JUnit با پروژه‌های Android

در توسعه Android، JUnit همراه با AndroidX Test استفاده می‌شود که افزونه‌هایی برای آزمون Activity، Content Provider و سایر مؤلفه‌های Android فراهم می‌کند. JUnit مسئول آزمون‌های واحد (unit tests) است که در JVM بدون شبیه‌ساز اجرا می‌شوند، و AndroidX Test مسئول آزمون‌های ابزاری روی دستگاه است.

تنظیمات Gradle

برای اضافه JUnit 5 به پروژه Android، کافی است وابستگی org.junit.jupiter:junit-jupiter را به build.gradle در سطح ماژول اضافه کنید. افزونه Gradle AGP از اجرای آزمون‌های JUnit 5 روی JVM از طریق Test Runner استاندارد پشتیبانی می‌کند.

kotlin
// build.gradle.kts
android {
    testOptions {
        unitTests.isIncludeAndroidResources = true
    }
}

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
    testImplementation("androidx.test:core-ktx:1.6.1")
}

آزمون ViewModel با JUnit

در عمل، JUnit بیشتر برای آزمون ViewModel و مخزن‌ها — لایه‌هایی که به زمینه Android یا شبیه‌ساز نیاز ندارند استفاده می‌شود. چنین آزمونی در چند میلی‌ثانیه اجرا شده و می‌تواند صدها بار بدون تلف زمان اجرا شود.

  • ViewModel — بررسی وضعیت‌ها: loading, success, error.
  • Repository — بررسی نقشه‌بندی داده‌ها و مدیریت خطا.
  • UseCase — بررسی منطق کسب‌وکار با mock وابستگی‌ها.

JUnit 4 در مقابل JUnit 5: تفاوت‌های کلیدی

JUnit 5 (Jupiter) — فقط یک نسخه جدید نیست، بلکه یک پلتفرم کاملاً بازنویسی شده است که به سه ماژول تقسیم شده: JUnit Platform (اجرای آزمون‌ها روی JVM)، JUnit Jupiter (API برای نوشتن آزمون‌ها) و JUnit Vintage (سازگاری باعکس با JUnit 4). چنین ماژول‌بندی امکان اتصال مختلف Test Engine را فراهم می‌کند — به عنوان مثال، Spek برای Kotlin یا TestNG.

ویژگیJUnit 4JUnit 5
بستهorg.junitorg.junit.jupiter
انوتاشان پایه@Test (از junit.framework)@Test (از org.junit.jupiter.api)
Before/After@Before, @After, @BeforeClass@BeforeEach, @AfterEach, @BeforeAll
Parameterized@RunWith(Parameterized.class)@ParameterizedTest + @ValueSource
Extension@Rule, @ClassRule@ExtendWith, API انعطاف‌پذیرتر
Java minJava 5Java 8+

مهاجرت از JUnit 4 به JUnit 5 نیازی به تمامی آزمون‌ها ندارد — کافی است JUnit Vintage Engine را متصل کنید و آزمون‌های قدیمی به کار خود ادامه خواهند داد. توصیه می‌شود آزمون‌های جدید را در JUnit 5 بنویسید تا از افزونه‌ها، لامبدا در assertion‌ها و پشتیبانی داخلی از پارامتریزه استفاده کنید.

سؤالات متداول

تفاوت JUnit با Mockito چیست؟

JUnit — چارچوبی برای نوشتن و اجرای آزمون‌هاست و Mockito کتابخانه‌ای برای ایجاد شیئ‌های mock است. آنها با هم استفاده می‌شوند: JUnit اجرای آزمون را مدیریت می‌کند و Mockito وابستگی‌های کلاس مورد آزمون را جایگزین می‌کند.

آیا می‌توان از JUnit 5 در پروژه‌های Android استفاده کرد؟

بله، JUnit 5 کاملاً با پروژه‌های Android سازگار است. برای آزمون‌های واحد کافی است وابستگی junit-jupiter را به build.gradle اضافه کنید. آزمون‌های ابزاری همچنان از طریق AndroidX Test Runner کار می‌کنند.

حداقل مجموعه انوتاشان‌های مورد نیاز برای آزمون چیست؟

حداقل یک انوتاشان @Test قبل از روش کافی است. برای مقدمه‌چینی و پاک‌سازی @BeforeEach و @AfterEach توصیه می‌شوند، اما اجباری نیستند.

Test Runner در JUnit چیست؟

Test Runner — مؤلفه‌ای از JUnit است که classpath را اسکن می‌کند، روش‌هایی را با انوتاشان @Test پیدا می‌کند، از کلاس‌های آزمون نمونه ایجاد می‌کند و آزمون‌ها را اجرا می‌کند. در JUnit 5 این نقش را JUnit Platform با Test Engine‌های متصل ایفا می‌کند.

چگونه بررسی کنیم که یک روش استثناء تولید می‌کند؟

از assertThrows(Class, Executable) استفاده کنید — آن نوع استثناء مورد انتظار و لامبدایی با فراخوانی روش را می‌پذیرد. JUnit بررسی می‌کند که استثناء واقعاً تولید شده است و آن را برای بررسی بیشتر بازمی‌گرداند.

نتیجه‌گیری

  • JUnit — چارچوب استاندارد آزمون واحد برای Java و Kotlin، پایه اکوسیستم xUnit.
  • انوتاشهای @Test, @BeforeEach, @AfterEach چرخه زندگی کلاس آزمون را مدیریت می‌کنند.
  • Assertions — assertEquals, assertTrue, assertThrows صحت نتایج را بررسی می‌کنند.
  • آزمون‌های پارامتریزه با @CsvSource و @MethodSource تکرار کد را کاهش می‌دهند.
  • JUnit 5 — معماری ماژولایی با پلتفرم، Jupiter API و پشتیبانی از افزونه‌ها.
  • ادغام با Android — JUnit روی JVM از طریق Test Runner استاندارد بدون شبیه‌ساز کار می‌کند.
  • Test Runner به طور خودکار روش‌های @Test را کشف و اجرا می‌کند و نتایج را گزارش می‌دهد.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید