Unit test yazma qaydaları, JUnit kitabaxanası 1 ci hissə

Novruz Jafarov
4 min readJul 17, 2022

--

Bu məqalədə Unit test yazdığımız zaman əməl etməli olduğumuz qaydalardan danışacağıq və JUnit kitabxanasından istifadə etməyi biryerdə öyrənəcəyik. Test nədir? Unit test nədir? Nə üçün yazmalıyıq kimi sualların cavabı üçün əvvəlki məqaləni oxumağınızı tövsiyyə edirəm. Məqalənin sonunda əvvəlki məqalənin linkini qeyd etmişəm.

Unit test yazarkən bəzi qaydaları əməl etməliyik ki, onlar aşağıdakılardır:

  • Ən kiçik hissə (parça) test edilməlidir.
  • Yalnız bir situasiya test edilir.
  • İstifadə olunan addımlar (GİVEN, WHEN, THEN)
  • Test metodunun adı, test edilən situasiyanı açıq şəkildə göstərməlidir.

JUnit kitabaxanası

Biz test sinifimizi yazarkən JUnit kitabaxanasından istifadə edəcəyik. Bunun üçün proyektimizin içərisində test paketi altında test siniflərimizi yaratmalıyıq. Çox vaxt IDE bu prosesi bizim üçün özü avtomatik olaraq edir. Qısaca Junit kitabxanasından danışsaq org.junit paketi altında gələn annotasiyalar üzərinə qurulu bir Java kitabxanasıdır. Biz nümunələrdə Java kodlarından istifadə etdiyimizə görə Junit kitabxanasından istifadə edəcəyik. Bəzi annotasiyalara misal çəksək:

  • @Test — bir metodun test metodu olduğunu bildirir.
  • @Rule — testlərin hansı şərtlər altında işləyəciyini təyin edir.
  • @Before — hər test metodunu işə salmadan öncə, bu annotsiya ilə təyin etdiyimiz metodu çağırır.
  • @After — hər test metodundan sonra, bu annotasiya ilə təyin etdiyimiz metodu çağırır.
  • @BeforeClass — sadəcə sinif yaradıldıqda testlərdən əvvəl birdəfə bu metod çağırılır.
  • @AfterClass — testlərin sonunda birdəfə çağırılır.

Junit kitabxanası və istifadəsi haqqında dahada ətraflı növbəti məqalələrdə danışacağıq.

Ən kiçik parça test edilməlidir

Ən kiçik hissə dedikdə siniflər və onlarında ən kiçik hissəsi olan metodlar nəzərdə tutulur. Yəni ki, bir test metodu içərisində birdən çox metodu test etmək düzgün hesab olunmur. Biz nümunə olaraq bir Car sinifindən istifadə edəcəyik və onun üzərinə test yazmağa çalışacağıq. Sadə Car sinifimizin kodları aşağıdakı kimidir:

İndi isə şəkildə CarTest sinifimizə baxaq və nəyi düzgün etmədiyimizi görək.

Şəkildə gördüyümüz kimi Car sinifimizdə maşının işə salınma metodunu və maşının dayandırılması metodunu bir metod üzərində test edirik. Bu, bizim birinci qaydamıza uyğun deyil və biz yalnız bir test metodu içərisində yalnız bir metodu test etməliyik. Bu problemi həll etmək üçün hər bir metod üçün ayrı-ayrı test metodları yazmalıyıq. Assert sinifi Junit kitabaxnasına aiddir və içərisində xeyli metodlar var ki, biz boolean bir dəyəri yoxladığımız üçün assertTrueassertFalse metodlarından istifadə etmişik. Bu metodlar, şərtlərimizə uyğun şəkildə nəticələr qaytararsa, test mərhələsi uğurla başa çatır, əks halda isə test xəta ilə nəticələnir.

Yalnız bir situasiya test edilməlidir

Bir test metodu içərisində birdən çox situasiya test edilməməlidir. Aşağıdakı nümunəyə baxaq:

Nümunədə gördüyümüz kimi maşının sürətinin azaldılması halını iki dəfə test edirik və bunu bir test metodu içərinsdə qeyd etmişik. Bu test metodu heç bir problemsiz işləyəcək, çünki şərtlərimiz düzgündür. Şərtlərdən, məsələn birinci şərtimiz yanlış olsaydı, 40 yerinə 41 yazsaydıq xəta ilə qarşılaşacağdıq və test metodu ikinci vəziyyəti test etmədən sonlandıracaqdı. Buna görədə hər bir situasiya üçün ayrı-ayrı testlər yazmaq düzgün hesab olunur:

GIVEN, WHEN, THEN

Test metodlarımızın içərisi müəyyən bir ardıcıllığa görə yazılmaldır. Bunun üçün GIVEN, WHEN, THEN üsulundan istifadə edə bilərik:

GIVEN — lazımı situasiyanın hazırlanması

WHEN — situasıyanın baş verdiyi yer

THEN — necə davranış göstərildiyi yer

Əvvəlki nümunəmizdəki testSpeedDecrease() metodunu bu qaydaya əsasən göstərsək aşağıdakı kimi olar:

Test metodunun adlanırılması

Test metodunun adı, test edilən situasiyanı bizə düzgün şəkildə çatdırmalıdır. Bunun üçün bir çox fərqli adlandırma standartlarından istifadə etmək olar:

  1. test{situasiyanın ümümi adı}

Məsələn: testPozitivƏdədləriToplasaqPozitivOlar()

2. Should{davranış}When{şərt}

Məsələn: shouldPozitivQaytarWhenPozitivƏdədVerilərsə

3. When{şərt}Expect{davranış}

Məsələn: whenPozitivƏdədVerilərsəExceptPozitivQaytar

4. Given{hazırılıq}When{Şərt}Then{davranış}

Məsələn:

givenCarWhenStartThenAcceleraedIsTrue

--

--