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 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.
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.
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.
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.
@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).
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.
| Annotasiya | Təyinat | İcra |
|---|---|---|
| @Test | Test metodunu göstərir | Çağrış başına bir dəfə |
| @BeforeEach | Hər testdən əvvəl hazırlıq | Hər @Test-dən əvvəl |
| @BeforeAll | Sinfin birdəfəlik başlatması | Bütün testlərdən əvvəl bir dəfə |
| @AfterEach | Hər testdən sonra təmizlik | Hər @Test-dən sonra |
| @AfterAll | Sinfin birdəfəlik başa çatması | Bütün testlərdən sonra bir dəfə |
| @DisplayName | Testin oxunaqlı adı | Dekorasiya |
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.
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 — 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.
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.
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
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 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.
@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);
}
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.
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.
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.
// 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")
}
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.
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.
| Xarakteristika | JUnit 4 | JUnit 5 |
|---|---|---|
| Paket | org.junit | org.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 min | Java 5 | Java 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 — 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.
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.
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.
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.
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ə
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.
Həm də oxuyun