Bosh sahifa Wiki JUnit

JUnit

JUnit — Java va JVM ekotizimida test yozish hamda ishga tushirish uchun ishlatiladigan test framework oilasi. U annotation, assertion, lifecycle hook, parametrli test va extension modelini taqdim etadi. JUnit unit testlardan tashqari integration va component testlarda ham ishlatilishi mumkin.

Zamonaviy JUnit arxitekturasida Platform, Jupiter va Vintage tushunchalari uchraydi.

JUnit Platform

Test frameworklarini JVMda topish va ishga tushirish uchun umumiy platforma.

Build tool va IDE Platform launcher orqali testlarni bajaradi.

Platform faqat JUnit Jupiter emas, boshqa test engine’larni ham ulashi mumkin.

JUnit Jupiter

Yangi programming va extension modeli.

Test annotationlari va assertion APIlarini beradi.

Keng annotationlar:

  • @Test;
  • @BeforeEach;
  • @AfterEach;
  • @BeforeAll;
  • @AfterAll;
  • @ParameterizedTest.

JUnit Vintage

Eski JUnit 3 va JUnit 4 testlarini yangi Platformda ishga tushirishga yordam beruvchi engine.

Migration davrida foydali.

Eski va yangi APIlarni cheksiz aralashtirish maintenance’ni qiyinlashtiradi.

Bosqichma-bosqich Jupiterga o‘tiladi.

Test class

Oddiy class ichida test methodlari yoziladi:

@Test
void addsNumbers() {
    assertEquals(5, sum(2, 3));
}

Test class va method visibility talablari JUnit avlodiga qarab farq qilishi mumkin.

Assertion

Keng assertionlar:

  • assertEquals;
  • assertTrue;
  • assertFalse;
  • assertNull;
  • assertNotNull;
  • assertThrows;
  • assertAll;
  • assertTimeout.

Expected va actual argument tartibi failure reportga ta’sir qiladi.

assertThrows

Ma’lum code exception chiqarishini tekshiradi.

Qaytgan exception objectining message yoki fieldlari ham tekshirilishi mumkin.

Juda umumiy parent exception expected qilinsa boshqa bug ham testdan o‘tib ketishi mumkin.

assertAll

Bir nechta assertionni guruhlab, hammasini bajarishga imkon beradi.

Birinchi failure’da darhol to‘xtamaydi.

Bitta objectning bir nechta fieldini tekshirishda qulay.

Bir assertion keyingisining prerequisite’i bo‘lsa oddiy tartib afzal.

Lifecycle

@BeforeEach har testdan oldin yangi setup bajaradi.

@AfterEach cleanup qiladi.

@BeforeAll va @AfterAll class bo‘yicha bir marta ishlaydi.

Shared mutable state parallel testda ehtiyotkor boshqariladi.

Test instance

Default lifecycle’da har test method uchun yangi class instance yaratilishi mumkin.

Bu field state’ning testlar orasida qolishini kamaytiradi.

Per-class lifecycle kerak bo‘lsa explicit belgilanadi.

U BeforeAllning instance method bo‘lishiga imkon berishi mumkin.

Parametrli test

Bitta behavior turli argument bilan tekshiriladi.

Source:

  • value;
  • CSV;
  • enum;
  • method;
  • argument provider.

Har case alohida display name oladi.

Katta data testni sekin va reportni og‘irlashtirishi mumkin.

Dynamic test

Runtime’da test case’lar yaratilishi mumkin.

Factory stream yoki collection qaytaradi.

Dynamic test lifecycle’i oddiy @Testdan farq qilishi mumkin.

Juda ko‘p dynamic logic test discovery’ni noaniq qiladi.

Nested test

@Nested ichki classlar behaviorlarni context bo‘yicha guruhlaydi.

Masalan:

When user is active
When user is blocked

Bu test nomini o‘qishni yaxshilaydi.

Nesting juda chuqurlashmasligi kerak.

Display name

Testga human-readable nom berish mumkin.

Failure report business behaviorni tushuntiradi.

Method nomi va display name bir-biriga zid bo‘lmasligi kerak.

CI reporter Unicode nomlarni to‘g‘ri saqlashi kerak.

Tag

@Tag testlarni guruhlaydi:

Build tool tag bo‘yicha include yoki exclude qiladi.

Tag naming jamoada standardlashtiriladi.

Assumption

Assumption bajarilmasa test failure emas, aborted yoki skipped bo‘ladi.

Masalan, faqat ma’lum OSda ishlaydigan test.

Business assertionni assumptionga aylantirish xatoni yashiradi.

Environment sharti uchun ishlatiladi.

Extension model

Jupiter extensionlar orqali:

qo‘shadi.

Database, dependency injection va mock frameworklar extension bilan integratsiya qilinadi.

Extension tartibi va scope muhim.

Mockito integration

Mockito mock va spy yaratish uchun keng ishlatiladi.

JUnit extension mock annotationlarni initialize qiladi.

Testdan keyin interaction va strictness tekshiriladi.

Haddan tashqari mock implementation detailga bog‘lanadi.

Timeout

Test ma’lum vaqt ichida tugashi kerak.

Timeout hang va juda sekin behaviorni topadi.

Preemptive timeout testni boshqa thread’da ishlatishi mumkin va thread-local transaction contextini buzishi ehtimoli bor.

Mos assertion tanlanadi.

Parallel execution

JUnit Platform testlarni parallel bajarishi mumkin.

Execution mode va worker konfiguratsiyasi belgilanadi.

Shared static state, database va portlar izolyatsiyalanadi.

Parallelizm barcha integration test uchun avtomatik xavfsiz emas.

Build tool

Maven Surefire/Failsafe yoki Gradle test task JUnit Platformni ishga tushiradi.

Unit va integration test naming hamda lifecycle bilan ajratilishi mumkin.

XML report CI tizimiga uzatiladi.

IDE va command-line bir xil engine’dan foydalanishi kerak.

Repeated test

Bir xil test bir necha marta bajarilishi mumkin. Bu random yoki race muammosini aniqlashga yordam beradi, ammo flaky testni yashirish uchun ishlatilmaydi. Har repetition nomi reportda ko‘rinadi.

Temporary directory

Temporary directory extension testga izolyatsiyalangan file path beradi. Test haqiqiy user directory yoki repository fayllarini o‘zgartirmaydi. Cleanup framework tomonidan boshqariladi.

Conditional test

OS, Java versioni yoki environment variable bo‘yicha testni yoqish mumkin. Shart release matrixni yashirmasligi kerak; muhim platforma CI’da alohida bajariladi.

Test order

Testlar default tartibga tayanmasligi kerak. Explicit order zarur bo‘lsa workflow aslida bitta integration scenario bo‘lishi mumkin. Har unit test mustaqil qoladi.

Bog‘liq tushunchalar

JUnit, JUnit Platform, JUnit Jupiter, JUnit Vintage, Java testing, Assertion, Parameterized test, Test lifecycle, Extension, Mockito, JVM