JUnit: bu nima, asosiy tushunchalar va qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-04-08 O'qish vaqti: 8 daq

JUnit — Java va Kotlin ekotizimidagi modul testlash uchun standart freymvork bo‘lib, Android-ishlab chiqishda biznes mantiqni izolyatsiya qilingan komponentlar darajasida tekshirish uchun ishlatiladi. Freymvork avtomatik testlarni aniqlash va bajarish uchun annotatsiyalar, assertion metodlari va Test Runner to‘plamini taqdim etadi. JUnit.org ma’lumotlariga ko‘ra, kutubxona JVM ekotizimidagi unit-testlar uchun eng mashhur yechim bo‘lib qolmoqda: Java loyihalarining 70% dan ortig‘i har qanday versiyada JUnit dan foydalanadi.

Asosiylari

  • JUnit — Java va Kotlin kodi uchun ochiq manbali modul testlash freymvorki.
  • Annotatsiyalar — @Test, @BeforeEach, @BeforeAll test sinfining hayot sikli ni boshqaradi.
  • Assertions — assertEquals, assertTrue, assertThrows kutilgan natijalarni tekshiradi.
  • Parametrlangan testlar — bir testni turli kirish ma’lumotlari to‘plamlari bilan ishga tushirishga imkon beradi.
  • Test Runner — JUnit infratuzilmasi avtomatik ravishda barcha testlarni topadi va ishga tushiradi.

JUnit nima?

JUnit — Java va Kotlin tillarida takrorlanadigan modul testlarini yozish va ishga tushirish uchun ochiq manbali freymvorkdir. U xUnit ekotizimiga kiradi — Kent Beck va Erich Gamma arxitekturasiga asoslangan freymvorklar oilasi va Android Studio va IntelliJ IDEA da standart test vositasi hisoblanadi.

JUnit ning asosiy vazifasi kichik kod qismini (metod, sinf) izolyatsiya qilish va uning xatti-harakatini boshqariladigan sharoitlarda tekshirishdir. Testlar annotatsiyalar bilan oddiy Java/Kotlin sinflari ko‘rinishida yoziladi va freymvork testlarni aniqlash, ularning hayot siklini boshqarish va bajarish statistikasini to‘plashni o‘z zimmasiga oladi.

JUnit ning birinchi versiyasi 1997 yilda paydo bo‘ldi va Test-Driven Development (TDD) amaliyotlarini ommalashtirib, rivojlanish yondashuvini tubdan o‘zgartirdi. Bugungi kunda JUnit 5 (Jupiter) modul arxitekturasi bilan Java 8+ va kengaytmalarni qo‘llab-quvvatlab, to‘liq qayta ishlangan joriy versiyadir.

JUnit qanday ishlaydi

Mexanizm JUnit bajarilishi Test Runner namunasi asosida ishlaydi, u classpath ni skanerlaydi, @Test annotatsiyasi bo‘lgan metodlarni topadi, test sinfining namunasini yaratadi va metodlarni belgilangan tartibda ishga tushiradi. Test Runner hayot siklini boshqaradi: BeforeAll → BeforeEach → Test → AfterEach → AfterAll.

Test sinfining hayot sikli

JUnit har bir test metodini alohida sinf namunasiga o‘raydi, bu testlar o‘rtasida izolyatsiyani kafolatlaydi. Bu sinf maydonlari turli @Test metodlari o‘rtasida holatni saqlamasligini anglatadi — har bir test toza obyektdan boshlanadi.

Testning asosiy tuzilishi

JUnit dagi eng oddiy test @Test annotatsiyasi bo‘lgan metod ko‘rinishida bo‘lib, uning ichida sinovdan o‘tkazilayotgan kod chaqiriladi va natija assertion orqali tekshiriladi. Agar assertion o‘tmasa — test muvaffaqiyatsiz hisoblanadi va JUnit xato haqida xabar beradi.

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

Test Runner avtomatik ravishda bunday metodni topadi, uni ishga tushiradi va natija haqida xabar beradi. Agar metod istisno chiqarmasa — test o‘tdi (green). Agar assertion ishlamasa — test muvaffaqiyatsiz (red).

JUnit annotatsiyalari: test hayot sikli

Annotatsiyalar JUnit test kodi qachon va qanday bajarilishi kerakligini belgilaydi. JUnit 5 da annotatsiyalar org.junit.jupiter.api paketida joylashgan va barcha bosqichlarni qamrab oladi: ma’lumotlarni tayyorlash, testni bajarish, resurslarni tozalash.

AnnotatsiyaMaqsadBajarilishi
@TestTest metodini belgilaydiHar bir chaqiruvda bir marta
@BeforeEachHar bir testdan oldin tayyorgarlikHar bir @Test dan oldin
@BeforeAllSinfni bir martalik boshlashBarcha testlardan oldin bir marta
@AfterEachHar bir testdan keyin tozalashHar bir @Test dan keyin
@AfterAllSinfni bir martalik yakunlashBarcha testlardan keyin bir marta
@DisplayNameTestning o‘qiladigan nomiDekoratsiya

Annotatsiyalardan foydalanish namunasi

To‘g‘ri hayot sikli bilan to‘liq test sinfini ko‘rib chiqamiz. setUp metodi har bir testdan oldin yangi Calculator namunasini yaratadi, tearDown esa resurslarni bo‘shatadi — masalan, fayl deskriptorlari yoki ma’lumotlar bazasi ulanishlarini yopadi.

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 da natijalarni tekshirish

Assertions — haqiqiy natijani kutilgan bilan solishtiradigan va mos kelmaslikda istisno chiqaradigan statik metodlardir. JUnit 5 org.junit.jupiter.api.Assertions sinfini 25 dan ortiq metod bilan taklif qiladi — oddiy qiymatlarni solishtirishdan tortib, timeout va guruhli assertionlarni tekshirishgacha bo‘lgan turli tekshirish stsenariylari uchun.

  • assertEquals(expected, actual) — equals() orqali tenglikni tekshiradi.
  • assertTrue(condition) — shartning to‘g‘riligini tekshiradi.
  • assertFalse(condition) — shartning noto‘g‘riligini tekshiradi.
  • assertNotNull(object) — obyektning null emasligini tekshiradi.
  • assertNull(object) — obyektning null ekanligini tekshiradi.
  • assertThrows(exception, executable) — kodning ko‘rsatilgan istisnoni chiqarishini tekshiradi.
  • assertAll(executables) — bir nechta tekshiruvni guruhlaydi va hammasini birinchi xatoda to‘xtamasdan bajaradi.

assertThrows istisnolarni tekshirish uchun

assertThrows metodi alohida e’tiborga loyiq — u kodning xato vaziyatlarni — nolga bo‘lish, null uzatish, limitlardan oshib ketishni to‘g‘ri boshqarishini tekshirishga imkon beradi.

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 da parametrlangan testlar

Parametrlangan testlar bir xil test metodini turli argumentlar to‘plami bilan ishga tushirishga imkon beradi. JUnit 5 da buning uchun @ParameterizedTest annotatsiyasi ma’lumot manbasi bilan birga ishlatiladi — @ValueSource, @CsvSource, @MethodSource yoki @EnumSource.

Bu yondashuv kod takrorlanishini tubdan kamaytiradi: turli qiymatlar uchun o‘nta bir xil test o‘rniga bitta parametrlangan metod yoziladi. Google Testing Blog ma’lumotlariga ko‘ra, parametrlash test kodining hajmini 40–60% ga qamrovni yo‘qotmasdan kamaytiradi.

CsvSource bilan namuna

@CsvSource annotatsiyasi vergul ajratgichli bir nechta qatorlarni testga uzatadi. Har bir qator bitta test ishga tushirilishiga mos keladi. JUnit qator qiymatlarini avtomatik ravishda kerakli turlarga o‘zgartiradi: int, long, String va boshqalar.

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);
}

Murakkab obyektlar uchun MethodSource

Kirish ma’lumotlari oddiy sonlar yoki satrlardan murakkabroq bo‘lganda @MethodSource ishlatiladi. U argumentlar Streamini qaytaruvchi statik metodga murojaat qiladi — masalan, Arguments Streami yoki DAO qatlamini testlash uchun User obyektlari Streami.

JUnit ni Android loyihalari bilan integratsiyasi

Android-ishlab chiqishda JUnit AndroidX Test bilan birga ishlatiladi, u Activity, Content Provider va boshqa Android komponentlarini testlash uchun kengaytmalarni taqdim etadi. JUnit emulyatorsiz JVM da bajariladigan modul testlari (unit tests) uchun javobgar, AndroidX Test esa qurilmada instrumental testlar uchun javobgar.

Gradle sozlamalari

Android loyihasida JUnit 5 ni ulash uchun modul darajasidagi build.gradle ga org.junit.jupiter:junit-jupiter bog‘liqligini qo‘shish kifoya. AGP Gradle plagini standart Test Runner orqali JVM da JUnit 5 testlarini ishga tushirishni qo‘llab-quvvatlaydi.

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 ni JUnit bilan testlash

Amalda JUnit eng ko‘p ViewModel va repositorylarni testlash uchun ishlatiladi — Android konteksti yoki emulyator talab qilmaydigan qatlamlar. Bunday test millisekundlarda bajariladi va vaqt yo‘qotmasdan yuzlab marta ishga tushirilishi mumkin.

  • ViewModel — holatlarni tekshirish: loading, success, error.
  • Repository — ma’lumotlar xaritalash va xato boshqaruvini tekshirish.
  • UseCase — bog‘liqliklarning mocklari bilan biznes mantiqni tekshirish.

JUnit 4 vs JUnit 5: asosiy farqlar

JUnit 5 (Jupiter) — shunchaki yangi versiya emas, balki uch modulga bo‘lingan to‘liq qayta ishlangan platforma: JUnit Platform (JVM da testlarni ishga tushirish), JUnit Jupiter (test yozish uchun API) va JUnit Vintage (JUnit 4 bilan orqaga qarab moslik). Bunday modullik turli Test Engine larni ulashga imkon beradi — masalan, Kotlin uchun Spek yoki TestNG.

XarakteristikaJUnit 4JUnit 5
Paketorg.junitorg.junit.jupiter
Asosiy annotatsiya@Test (junit.framework dan)@Test (org.junit.jupiter.api dan)
Before/After@Before, @After, @BeforeClass@BeforeEach, @AfterEach, @BeforeAll
Parameterized@RunWith(Parameterized.class)@ParameterizedTest + @ValueSource
Extension@Rule, @ClassRule@ExtendWith, moslashuvchan API
Java minJava 5Java 8+

JUnit 4 dan JUnit 5 ga o‘tish barcha testlarni qayta yozishni talab qilmaydi — JUnit Vintage Engine ni ulash kifoya va eski testlar ishlashda davom etadi. Yangi testlarni JUnit 5 da yozish tavsiya etiladi, chunki u kengaytmalar, assertionlarda lambdalar va parametrlash uchun o‘rnatilgan qo‘llab-quvvatlashdan foydalanish imkonini beradi.

Tez-tez so‘raladigan savollar

JUnit Mockito dan qanday farq qiladi?

JUnit — testlarni yozish va ishga tushirish uchun freymvork, Mockito esa mock obyektlarni yaratish uchun kutubxona. Ular birgalikda ishlatiladi: JUnit testning bajarilishini boshqaradi, Mockito esa test qilinayotgan sinfning bog‘liqliklarini almashtiradi.

JUnit 5 ni Android loyihalarida ishlatish mumkinmi?

Ha, JUnit 5 Android loyihalari bilan to‘liq mos keladi. Unit-testlar uchun build.gradle ga junit-jupiter bog‘liqligini qo‘shish kifoya. Instrumental testlar hali ham AndroidX Test Runner orqali ishlaydi.

Test uchun minimal annotatsiyalar to‘plami qanday?

Minimal darajada metod oldida bitta @Test annotatsiyasi kifoya. Boshlash va tozalash uchun @BeforeEach va @AfterEach tavsiya etiladi, lekin ular majburiy emas.

JUnit da Test Runner nima?

Test Runner — classpath ni skanerlaydigan, @Test annotatsiyasi bo‘lgan metodlarni topadigan, test sinflari namunalarini yaratadigan va testlarni ishga tushiradigan JUnit komponenti. JUnit 5 da bu rolni ulangan Test Engine bilan JUnit Platform bajaradi.

Metodning istisno chiqarishini qanday tekshirish mumkin?

assertThrows(Class, Executable) dan foydalaning — u kutilgan istisno turini va metod chaqiruvi bilan lambdani qabul qiladi. JUnit istisnoning haqiqatan ham chiqarilganligini tekshiradi va qo‘shimcha tekshirish uchun uni qaytaradi.

Xulosa

  • JUnit — Java va Kotlin uchun standart modul testlash freymvorki, xUnit ekotizimining asosi.
  • Annotatsiyalar @Test, @BeforeEach, @AfterEach test sinfining hayot siklini boshqaradi.
  • Assertions — assertEquals, assertTrue, assertThrows natijalarning to‘g‘riligini tekshiradi.
  • Parametrlangan testlar @CsvSource va @MethodSource bilan kod takrorlanishini kamaytiradi.
  • JUnit 5 — platforma, Jupiter API va kengaytmalarni qo‘llab-quvvatlash bilan modul arxitektura.
  • Android integratsiyasi — JUnit emulyatorsiz standart Test Runner orqali JVM da ishlaydi.
  • Test Runner avtomatik ravishda @Test metodlarini aniqlaydi va ishga tushiradi, natijalar haqida xabar beradi.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing