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 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.
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.
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.
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.
@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).
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.
| Annotatsiya | Maqsad | Bajarilishi |
|---|---|---|
| @Test | Test metodini belgilaydi | Har bir chaqiruvda bir marta |
| @BeforeEach | Har bir testdan oldin tayyorgarlik | Har bir @Test dan oldin |
| @BeforeAll | Sinfni bir martalik boshlash | Barcha testlardan oldin bir marta |
| @AfterEach | Har bir testdan keyin tozalash | Har bir @Test dan keyin |
| @AfterAll | Sinfni bir martalik yakunlash | Barcha testlardan keyin bir marta |
| @DisplayName | Testning o‘qiladigan nomi | Dekoratsiya |
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.
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 — 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.
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.
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
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 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.
@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);
}
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.
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.
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.
// 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")
}
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.
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.
| Xarakteristika | JUnit 4 | JUnit 5 |
|---|---|---|
| Paket | org.junit | org.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 min | Java 5 | Java 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 — 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.
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.
Minimal darajada metod oldida bitta @Test annotatsiyasi kifoya. Boshlash va tozalash uchun @BeforeEach va @AfterEach tavsiya etiladi, lekin ular majburiy emas.
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.
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
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.