JUnit: bu nədir, əsas anlayışlar və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-04-08 Oxuma vaxtı: 8 dəq

JUnit — Java və Kotlin ekosistemində modul testləri üçün standart çərçivədir, Android inkişafında təcrid olunmuş komponentlər səviyyəsində biznes məntiqini yoxlamaq üçün istifadə olunur. Çərçivə avtomatik test aşkarlanması və icrası üçün annotasiyalar, assertion metodları və Test Runner dəsti təqdim edir. JUnit.org məlumatlarına görə, kitabxana JVM ekosistemində unit-testlər üçün ən populyar həll olaraq qalır: Java layihələrinin 70%-dən çoxu hər hansı versiyada JUnit istifadə edir.

Başlıcaları

  • JUnit — Java və Kotlin kodu üçün açıq mənbəli modul test çərçivəsi.
  • Annotasiyalar — @Test, @BeforeEach, @BeforeAll test sinfinin həyat dövranını idarə edir.
  • Assertions — assertEquals, assertTrue, assertThrows gözlənilən nəticələri yoxlayır.
  • Parametrləşdirilmiş testlər — bir testi müxtəlif giriş məlumat dəstləri ilə işə salmağa imkan verir.
  • Test Runner — JUnit infrastrukturu avtomatik olaraq bütün testləri tapır və işə salır.

JUnit nədir?

JUnit — Java və Kotlin dillərində təkrarlana bilən modul testləri yazmaq və işə salmaq üçün açıq mənbəli çərçivədir. O, xUnit ekosisteminə daxildir — Kent Beck və Erich Gamma memarlığına əsaslanan çərçivələr ailəsi və Android Studio və IntelliJ IDEA-da standart test alətidir.

JUnit-in əsas vəzifəsi kiçik bir kod parçasını (metod, sinif) təcrid etmək və onun davranışını idarə olunan şəraitdə yoxlamaqdır. Testlər annotasiyalarla adi Java/Kotlin sinifləri şəklində yazılır və çərçivə testlərin aşkarlanmasını, onların həyat dövranının idarə edilməsini və icra statistikasının toplanmasını öz üzərinə götürür.

JUnit-in ilk versiyası 1997-ci ildə ortaya çıxdı və Test-Driven Development (TDD) təcrübələrini populyarlaşdıraraq inkişaf yanaşmasını köklü şəkildə dəyişdi. Bu gün JUnit 5 (Jupiter) modul memarlığı ilə Java 8+ və genişləndirmələr dəstəyi ilə tamamilə yenidən işlənmiş aktual versiyadır.

JUnit necə işləyir

Mexanizm JUnit icrası Test Runner nümunəsinə əsaslanır, o, classpath-i skan edir, @Test annotasiyası olan metodları tapır, test sinfinin nümunəsini yaradır və metodları müəyyən ardıcıllıqla işə salır. Test Runner həyat dövranını idarə edir: BeforeAll → BeforeEach → Test → AfterEach → AfterAll.

Test sinfinin həyat dövranı

JUnit hər bir test metodunu ayrıca sinif nümunəsinə büklür ki, bu da testlər arasında təcridi təmin edir. Bu o deməkdir ki, sinif sahələri müxtəlif @Test metodları arasında vəziyyəti qorumur — hər bir test təmiz bir obyektdən başlayır.

Testin əsas strukturu

JUnit-də ən sadə test @Test annotasiyası olan metod kimi görünür, onun içərisində test edilən kod çağrılır və nəticə assertion vasitəsilə yoxlanılır. Əgər assertion keçməzsə — test uğursuz sayılır və JUnit xəta barədə məlumat verir.

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

Test Runner avtomatik olaraq belə bir metodu tapır, işə salır və nəticə barədə məlumat verir. Əgər metod istisna törətməzsə — test keçdi (green). Əgər assertion işləməzsə — test uğursuz oldu (red).

JUnit annotasiyaları: testin həyat dövranı

Annotasiyalar JUnit test kodunun nə vaxt və necə icra edilməli olduğunu müəyyənləşdirir. JUnit 5-də annotasiyalar org.junit.jupiter.api paketində yerləşir və bütün mərhələləri əhatə edir: məlumat hazırlığı, testin icrası, resursların təmizlənməsi.

AnnotasiyaTəyinatİcra
@TestTest metodunu göstərirÇağrış başına bir dəfə
@BeforeEachHər testdən əvvəl hazırlıqHər @Test-dən əvvəl
@BeforeAllSinfin birdəfəlik başlatmasıBütün testlərdən əvvəl bir dəfə
@AfterEachHər testdən sonra təmizlikHər @Test-dən sonra
@AfterAllSinfin birdəfəlik başa çatmasıBütün testlərdən sonra bir dəfə
@DisplayNameTestin oxunaqlı adıDekorasiya

Annotasiyalardan istifadə nümunəsi

Doğru həyat dövranı olan tam test sinfini nəzərdən keçirək. setUp metodu hər testdən əvvəl təzə Calculator nümunəsi yaradır, tearDown isə resursları azad edir — məsələn, fayl deskriptorlarını və ya verilənlər bazası ilə əlaqələri bağlayır.

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-də nəticələrin yoxlanması

Assertions — faktiki nəticəni gözlənilənlə müqayisə edən və uyğunsuzluq halında istisna törədən statik metodlardır. JUnit 5 org.junit.jupiter.api.Assertions sinfini 25-dən çox metodla təklif edir — sadə dəyər müqayisəsindən tutmuş timeout və qrup assertion yoxlanışına qədər müxtəlif yoxlama ssenariləri üçün.

  • assertEquals(expected, actual) — equals() vasitəsilə bərabərliyi yoxlayır.
  • assertTrue(condition) — şərtin doğru olduğunu yoxlayır.
  • assertFalse(condition) — şərtin yanlış olduğunu yoxlayır.
  • assertNotNull(object) — obyektin null olmadığını yoxlayır.
  • assertNull(object) — obyektin null olduğunu yoxlayır.
  • assertThrows(exception, executable) — kodun göstərilən istisnanı törətdiyini yoxlayır.
  • assertAll(executables) — bir neçə yoxlamanı qruplaşdırır və hamısını ilk xətada dayanmadan icra edir.

İstisnaları yoxlamaq üçün assertThrows

assertThrows metodu xüsusi diqqətə layiqdir — o, kodun səhv vəziyyətlərini — sıfıra bölmə, null ötürülməsi, limitlərin aşılmasını düzgün idarə etdiyini yoxlamağa imkan verir.

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-də parametrləşdirilmiş testlər

Parametrləşdirilmiş testlər eyni test metodunu müxtəlif arqument dəstləri ilə işə salmağa imkan verir. JUnit 5-də bunun üçün @ParameterizedTest annotasiyası məlumat mənbəyi ilə birlikdə istifadə olunur — @ValueSource, @CsvSource, @MethodSource və ya @EnumSource.

Bu yanaşma kod təkrarlanmasını köklü şəkildə azaldır: müxtəlif dəyərlər üçün on eyni test əvəzinə bir parametrləşdirilmiş metod yazılır. Google Testing Blog məlumatlarına görə, parametrləşdirmə əhatəni itirmədən test kodunun həcmini 40–60% azaldır.

CsvSource ilə nümunə

@CsvSource annotasiyası vergül ayırıcısı ilə bir neçə sətri testə ötürür. Hər sətr bir test işə salmasına uyğun gəlir. JUnit sətr dəyərlərini avtomatik olaraq tələb olunan tiplərə çevirir: int, long, String və s.

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

Mürəkkəb obyektlər üçün MethodSource

Giriş məlumatları sadə ədəd və ya sətrlərdən mürəkkəb olduqda @MethodSource istifadə olunur. O, arqumentlərin Stream-ni qaytaran statik metoda istinad edir — məsələn, Arguments Stream və ya DAO qatını test etmək üçün User obyektlərinin Stream-i.

JUnit-in Android layihələri ilə inteqrasiyası

Android inkişafında JUnit AndroidX Test ilə birlikdə istifadə olunur, o, Activity, Content Provider və digər Android komponentlərinin test edilməsi üçün genişləndirmələr təqdim edir. JUnit emulyator olmadan JVM-də icra olunan modul testlərinə (unit tests) cavabdehdir, AndroidX Test isə cihazda instrumental testlərə cavabdehdir.

Gradle konfiqurasiyası

Android layihəsində JUnit 5-i qoşmaq üçün modul səviyyəsində build.gradle faylına org.junit.jupiter:junit-jupiter asılılığını əlavə etmək kifayətdir. AGP Gradle plaqini JVM-də standart Test Runner vasitəsilə JUnit 5 testlərinin işə salınmasını dəstəkləyir.

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

JUnit ilə ViewModel-in test edilməsi

Təcrübədə JUnit ən çox ViewModel və repozitoriyaların test edilməsi üçün istifadə olunur — Android konteksti və ya emulyator tələb etməyən qatlar. Belə bir test millisaniyələr ərzində yerinə yetirilir və vaxt itkisi olmadan yüzlərlə dəfə işə salına bilər.

  • ViewModel — vəziyyətlərin yoxlanması: loading, success, error.
  • Repository — məlumatların xəritələnməsi və xəta idarəsinin yoxlanması.
  • UseCase — asılılıqların mockları ilə biznes məntiqinin yoxlanması.

JUnit 4 vs JUnit 5: əsas fərqlər

JUnit 5 (Jupiter) — sadəcə yeni versiya deyil, üç modula bölünmüş tamamilə yenidən işlənmiş platformadır: JUnit Platform (JVM-də testlərin işə salınması), JUnit Jupiter (test yazmaq üçün API) və JUnit Vintage (JUnit 4 ilə geriyə uyğunluq). Belə modulluq müxtəlif Test Engine qoşmağa imkan verir — məsələn, Kotlin üçün Spek və ya TestNG.

XarakteristikaJUnit 4JUnit 5
Paketorg.junitorg.junit.jupiter
Əsas annotasiya@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, daha çevik API
Java minJava 5Java 8+

JUnit 4-dən JUnit 5-ə keçid bütün testlərin yenidən yazılmasını tələb etmir — JUnit Vintage Engine-i qoşmaq kifayətdir və köhnə testlər işləməyə davam edəcək. Yeni testləri genişləndirmələrdən, assertion-larda lambdalardan və parametrləşdirmə üçün daxili dəstəkdən istifadə etmək üçün JUnit 5-də yazmaq tövsiyə olunur.

Tez-tez verilən suallar

JUnit Mockito-dan nə ilə fərqlənir?

JUnit — testləri yazmaq və işə salmaq üçün çərçivə, Mockito isə mock-obyektlər yaratmaq üçün kitabxanadır. Onlar birlikdə istifadə olunur: JUnit testin icrasını idarə edir, Mockito isə test edilən sinfin asılılıqlarını əvəz edir.

JUnit 5 Android layihələrində istifadə oluna bilərmi?

Bəli, JUnit 5 Android layihələri ilə tam uyğun gəlir. Unit-testlər üçün build.gradle faylına junit-jupiter asılılığını əlavə etmək kifayətdir. Instrumental testlər hələ də AndroidX Test Runner vasitəsilə işləyir.

Test üçün minimum annotasiya dəsti hansıdır?

Minimum olaraq metod önündə bir @Test annotasiyası kifayətdir. İlkinləşdirmə və təmizlik üçün @BeforeEach və @AfterEach tövsiyə olunur, lakin onlar məcburi deyil.

JUnit-də Test Runner nədir?

Test Runner — classpath-i skan edən, @Test annotasiyası olan metodları tapan, test siniflərinin nümunələrini yaradan və testləri işə salan JUnit komponentidir. JUnit 5-də bu rolu qoşulmuş Test Engine ilə JUnit Platform yerinə yetirir.

Metodun istisna törətdiyini necə yoxlamaq olar?

assertThrows(Class, Executable) istifadə edin — o, gözlənilən istisna tipini və metod çağrışı ilə lambdanı qəbul edir. JUnit istisnanın həqiqətən törədildiyini yoxlayır və əlavə yoxlama üçün onu qaytarır.

Nəticə

  • JUnit — Java və Kotlin üçün standart modul test çərçivəsi, xUnit ekosisteminin əsası.
  • Annotasiyalar @Test, @BeforeEach, @AfterEach test sinfinin həyat dövranını idarə edir.
  • Assertions — assertEquals, assertTrue, assertThrows nəticələrin düzgünlüyünü yoxlayır.
  • Parametrləşdirilmiş testlər @CsvSource və @MethodSource ilə kod təkrarlanmasını azaldır.
  • JUnit 5 — platforma, Jupiter API və genişləndirmə dəstəyi ilə modul memarlıq.
  • Android inteqrasiyası — JUnit emulyatorsuz standart Test Runner vasitəsilə JVM-də işləyir.
  • Test Runner avtomatik olaraq @Test metodlarını aşkar edir və işə salır, nəticələr barədə məlumat verir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun