Bosh sahifa Wiki Java testing

Java testing

Java testing — Java dasturidagi class, method va komponentlar kutilgan contract bo‘yicha ishlashini avtomatik tekshirish amaliyotidir. Ekotizimda JUnit test lifecycle va assertionlarni, Mockito test doublelarni, build vositalari esa testlarni topish hamda CI ichida bajarishni ta’minlaydi.

JUnit modeli

JUnit 5 test platformasi, Jupiter programming modeli va legacy engine qismlaridan tuzilgan. @Test methodni test sifatida belgilaydi, @BeforeEach va @AfterEach har test atrofidagi setup hamda cleanupni bajaradi. @BeforeAll kabi class scope hooklar odatda static bo‘ladi yoki per-class instance lifecycle talab qiladi.

@Test
void rejectsNegativeAmount() {
    var error = assertThrows(IllegalArgumentException.class,
        () -> account.withdraw(-10));
    assertEquals("amount", error.getMessage());
}

assertThrows faqat berilgan blokdagi exceptionni qabul qiladi. Juda keng exception turi noto‘g‘ri failure’ni ham muvaffaqiyat deb ko‘rsatadi. Object tengligini equals contracti orqali, collectionni esa element va tartib talabi bo‘yicha tekshirish zarur.

Test instance va izolyatsiya

JUnit odatda har test method uchun yangi class instance yaratadi. Bu fieldlarning testlar orasida qolishini kamaytiradi. Static cache, singleton, system property va umumiy database esa baribir shared state bo‘lib qoladi. Har test ularni qayta tiklashi yoki boshqariladigan extension orqali ajratishi kerak.

Test tartibiga tayanish yashirin dependency yaratadi. Bir test yaratgan yozuvni keyingisi kutsa, suite yakka test yoki parallel rejimda buziladi. Fixture minimal bo‘lib, testning o‘zida maqsadga tegishli qiymatlar ko‘rinadi.

Parameterized test

@ParameterizedTest bir methodni turli argumentlar bilan bajaradi. @ValueSource, @CsvSource, @MethodSource yoki custom argument provider input yaratadi. Har invocation display name bilan ajratilsa qaysi case xato bergani aniq ko‘rinadi.

Boundary, null, Unicode va noto‘g‘ri format case’lari bitta contractga tegishli bo‘lsa parametrization qulay. Turli setup yoki turli sababni tekshiradigan case’larni bitta jadvalga yig‘ish testni murakkablashtiradi.

Mockito va dependency chegarasi

Mockito interface yoki collaborator xatti-harakatini boshqaradi. Stub methodga qiymat yoki exception beradi, verify esa chaqiruvni tekshiradi. Har ichki methodni mocklash testni implementationga bog‘laydi. Network client, clock yoki message publisher kabi tashqi chegara test double uchun tabiiyroq joydir.

Strict stubbing ishlatilmagan stubni aniqlab, eskirgan setupni topishga yordam beradi. ArgumentCaptor yuborilgan obyektni tekshiradi, lekin callerning ichki ketma-ketligini haddan ortiq tekshirish refactoringni qiyinlashtiradi. Integration test serialization, transaction va framework konfiguratsiyasini realroq muhitda qamrab oladi.

Build va test qatlamlari

Maven Surefire odatda unit testlarni, Failsafe esa integration test lifecycle’ini bajaradi. Gradle test taski source set va test engine bilan ishlaydi. Fayl yoki class nomi plugin patterniga mos kelmasa test topilmasligi mumkin; CI collected va executed sonlarni ko‘rsatadi.

Unit test tez va process ichida ishlaydi. Integration test database, HTTP stack yoki container bilan qatlamlararo moslikni tekshiradi. Testcontainers vaqtinchalik real service versiyasini ishga tushirishi mumkin, ammo image versioni pin qilinadi va container cleanup bajariladi.

Parallel bajarish va diagnostika

Parallel test thread-safe production kodini tezroq tekshiradi, lekin umumiy port, katalog va schema nomlari collision yaratadi. Resource lock yoki noyob identifier ishlatiladi. Tasodifiy timingga tayangan Thread.sleep o‘rniga latch, future va timeout bilan hodisa kutiladi.

Failure report assertion farqi, stack trace, test parametri va zarur logni ko‘rsatadi. Secret yoki shaxsiy ma’lumot test logiga kiritilmaydi. Coverage qaysi code path bajarilganini bildiradi, lekin assertionning talabni to‘g‘ri ifodalaganini kafolatlamaydi.

Bog‘liq tushunchalar

JUnit, Mockito, Maven Surefire, Gradle, Parameterized test, Testcontainers, Code coverage