Onlayn java testi giriş səviyyəsi. Proqram testi, JUnit. Java Test Tələbləri

İnanıram ki, proqram təminatının inkişafı işdən daha çox şeydir. Mən özümü hər gün daha yaxşı olmağa çalışan usta kimi görürəm. Bunu etməyin "ən asan" yolu bəzi yaxşı alətlər tapmaq və aşağıdakı suallara cavab verməkdir:

  • Alət X nə vaxt istifadə etməliyəm?
  • X alətindən necə istifadə etməliyəm?

Avtomatlaşdırılmış test proqram təminatının inkişafının çox vacib hissəsidir, lakin proqramçıların bloqlarında istifadə olunan alətlər haqqında yazılar azdır. Eyni məqalə sizə mənim “alət qutuma” baxmağa imkan verəcək. Mən vahid və inteqrasiya testlərini yazmaq üçün istifadə etdiyim 12 kitabxana və çərçivəni əhatə edəcəyəm və onlardan necə istifadə edəcəyinizi anlamağa kömək edəcək səhifələrə keçidlər təqdim edəcəyəm.

Gəlin mənim alətlər qutuma baxaq

Aşağıda təsvir olunan alətlərdən istifadə etməzdən əvvəl inteqrasiya və vahid testlərini avtomatik həyata keçirən quruluş qurmalısınız. Bu mövzuda 2 qeydim var:

  • Maven ilə İnteqrasiya Testi müxtəlif qovluqlarda inteqrasiya və vahid testləri ilə Maven quruluşunu necə qura biləcəyimizi təsvir edir.
  • Gradle ilə işə başlamaq: TestSets Plugin ilə inteqrasiya testi Gradle üçün eyni şeyi əhatə edir.

İndi alətlərimə daha yaxından nəzər salmağa hazırsınız. Naviqasiyanızı asanlaşdırmaq üçün onları kateqoriyalara ayırdım.

Beləliklə, inteqrasiya və vahid testi üçün istifadə etdiyim 12 alət var.

Çalışan testlər

AssertJ faydalı səhv mesajları ilə təsdiqlərin yazılması üçün çevik API təmin edir, test kodunun oxunuşunu yaxşılaşdırır və testləri istədiyiniz domenə xas dilə uyğun gələn icra edilə bilən spesifikasiyalara çevirməyə imkan verir.

Əlavə olaraq:

  • Testdə Hamcrest-dən istifadə testləri yazmaq üçün Hamcrest-dən necə istifadə etməyi, həmçinin onun imkanlarını xüsusi modullarla genişləndirməyi əhatə edir.
  • Təsdiqləri Domain-Xüsusi Dilə çevirmək AssertJ-də fərdi təsdiqlərin necə yaradılacağını izah edir.
  • Təmiz Testlərin Yazılması: Təsdiqləri Domain Xüsusi Dillə əvəz etmək. JUnit-in standart müddəalarını niyə domenə xas düzgün dildən istifadə edən özümüzlə əvəz etməli olduğumuzu izah edir.

Məlumat Giriş Kodu Testi

Çalışan inteqrasiya testlərini yazmaq üçün faydalı olan sürətli verilənlər bazası yerli maşın inkişaf etdirici.

Hər inteqrasiya testini keçirməzdən əvvəl verilənlər bazasını məlum vəziyyətə gətirmək və verilənlər bazasını lazımi məlumatlarla doldurmaq üçün istifadə edilə bilən JUnit-in genişləndirilməsi. DbUnit-in çatışmazlıqları var, lakin çox faydalı alət, bu, test məlumatlarını və test kodunu ayırmağa imkan verir.

Əlavə olaraq:

  • DbUnit-dən istifadə edərək testlər yazmaq üçün bilməli olduğunuz DbUnit-in əsas komponentlərini təsvir edir.
  • verilənlərə giriş kodu üçün ən yaxşı testlərin yazılması üçün beş qayda təqdim edir.

Java proqramçıları üçün test tapşırıqlarını axtararkən maraqlı bir saytla qarşılaşdım (Avast istifadəçiləri getməməlidir, skript Trojan aşkarlanıb, digərləri yəqin ki, yaxşıdır) - http://www.betterprogrammer.com. Java proqramçılarının ixtisaslarını ən sadə şəkildə yoxlayır, lakin avtomatik şəkildə: artan mürəkkəbliyin bir neçə funksiyasını (metodlarını) yazmağı və kodu TextArea-ya köçürməyi təklif edir. Bundan sonra, sayt mühərriki tapşırıqlarla bir şey edir (vahid testindən az olmayaraq), "sürət keyfiyyəti" meyarlarına əsasən müəyyən bir ixtisas indeksini hesablayır və yekun balı aşağıdakı formada verir:

Sonra suallar başlayır. Mən özüm həyatımda ikinci dəfə Java-da proqramlaşdırdım (və buna görə də sadəcə mürəkkəb tapşırıqları atladım), buna görə də bu testdə 82% səviyyəyə uyğundur java olmayan proqramçı. Beləliklə, Java Junior, Java Proqramçısı və daha çox Java Senior işə nə qədər cəlb edilməlidir?! Nə nəticə gözləmək olar indiki java proqramçısı - 90, 95, 99? Və nəhayət, əgər “proqramçı” 82-dən az bal toplayırsa, amma buna baxmayaraq, hansısa işə müraciət edirsə?!

Test həmişə əyləncəli və maraqlı olmur. Bu proses adətən kifayət qədər uzun və bəzən monoton işlərlə dolu olur. Görünür, bu yaxınlarda proqramçılar java siniflərini sınamaq üçün standart çıxışdan və ya sazlayıcıdan istifadə ediblər.

Bu yazıda testlərin yazılması prosesini xeyli asanlaşdıran və avtomatlaşdıran JUnit 4 kitabxanasını təsvir edəcəyəm.

JUnit Framework-ün əsas imkanlarını nümayiş etdirmək üçün Java-da primitiv sinif yazaq və onu ələ salaq. Bu sinifin iki üsulu olacaq - qeyri-mənfi ədədin faktorialını və iki ədədin cəmini tapmaq. Bundan əlavə, sinif nümunəsi metod çağırış sayğacını ehtiva edəcəkdir.

İctimai sinif MathFunc ( int zənglər; ictimai int getCalls() ( zəngləri qaytarmaq; ) ictimai uzun faktorial(int nömrə) ( zənglər++; if (nömrə 1) ( üçün (int i = 1; i)

İndi vahid testləri yazaq. Bunun üçün biz bir sıra test üsullarından ibarət sinif yaradacağıq. Təbii ki, sinifdə adi köməkçi metodlar da ola bilər. Test iştirakçısının kimin kim olduğunu müəyyən etməsi üçün test üsulları @Test ilə qeyd edilməlidir.

Annotasiya aşağıdakı parametrlərə malik ola bilər:

  • gözlənilən - metod tərəfindən hansı istisnanın yaradılacağını göstərin (aşağıdakı nümunəyə baxın);
  • vaxt aşımı - millisaniyələrdə neçə vaxtdan sonra test işləməyi dayandıracaq və onu uğursuz hesab edəcək.

Müəyyən bir testin atlanmalı olduğunu bildirmək istəyirsinizsə, onu @Ignore annotasiyası ilə qeyd edin. Baxmayaraq ki, siz sadəcə @Test annotasiyasını silə bilərsiniz.

Hər bir test işini yerinə yetirmək üçün əvvəlcədən yaradılmış sinif nümunələri kimi bəzi kontekstlərə ehtiyac duyduğunuz vaxtlar ola bilər. Və icradan sonra ehtiyatda olan resursları buraxmaq lazımdır. Bu halda sizə @Before və @After qeydləri lazımdır. @Before işarəsi ilə işarələnmiş metod hər bir test işindən əvvəl, @After işarəsi ilə işarələnmiş metod isə hər sınaq vəziyyətindən sonra icra ediləcək.

Resursların işə salınması və buraxılması yalnız bir dəfə - müvafiq olaraq, bütün testlərdən əvvəl və sonra - yerinə yetirilməlidirsə, bir cüt @BeforeClass və @AfterClass annotasiyalarından istifadə edin.

Və burada bir neçə test skripti ilə test sinifinin özü var:

İctimai sinif MathFuncTest ( şəxsi MathFunc riyaziyyatı; @İctimai ləğv etmədən əvvəl init() ( riyaziyyat = yeni MathFunc(); ) @İctimai boşluqdan sonra tearDown() ( math = null; ) @İctimai etibarsız çağırışları sınayın() ( assertEquals(0, riyaziyyat) .getCalls()); math.factorial(1); assertEquals(1, math.getCalls()); math.factorial(1); assertEquals(2, math.getCalls()); ) @Test public void faktorial() ( assertTrue(math.factorial(0) == 1); assertTrue(math.factorial(1) == 1); assertTrue(math.factorial(5) == 120); ) @Test(gözlənilən = IllegalArgumentException.class) public void factorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() ( assertTrue(math.plus(1, 1) == 3); ) )

Zənglər metodu zəng sayğacının etibarlılığını yoxlayır. Faktorial metod bəzi standart qiymətlər üçün faktorialın düzgün hesablandığını yoxlayır. factorialNegative metodu mənfi faktorial dəyərlər üçün IllegalArgumentException-ın atılacağını yoxlayır. Todo metodu nəzərə alınmayacaq. Kodla sınaqdan keçirərkən @Ignore annotasiyasını silməyə çalışın.

assertTrue metodu ifadənin nəticəsinin doğru olub olmadığını yoxlayır. Faydalı ola biləcək bəzi digər üsullar:

  • assertEquals - gözlənilən nəticə və alınan nəticə uyğunluğu;
  • assertNull - ifadənin nəticəsi sıfırdır;
  • assertNotNull - ifadənin nəticəsi nulldan fərqlidir;
  • assertSame - gözlənilən və qəbul edilən obyektlər eyni obyektdir.
  • uğursuzluq - metod AssertionError istisna yaradır - biz onu proqramın icrasının getməməli olduğu yerə əlavə edirik.

Bizim müasir dünya IDE-lər layihədə testləri tapa və sadəcə icra edə bilər. Bəs proqram kodundan istifadə edərək onları əl ilə işə salmaq istəsəniz nə olacaq. Bunun üçün Runner-dan istifadə edə bilərsiniz.Mətn versiyaları var - junit.textui.TestRunner, qrafik versiyaları - junit.swingui.TestRunner, junit.awtui.TestRunner.

Amma bir az daha müasir üsul JUnitCore sinifinin istifadəsidir. MathFuncTest sinfinə aşağıdakı əsas metodu əlavə edin:

Ümumi statik boş əsas(String args) İstisna atır ( JUnitCore runner = new JUnitCore(); Nəticə nəticə = runner.run(MathFuncTest.class); System.out.println("testləri işə salmaq: " + result.getRunCount()); System.out.println("uğursuz testlər: " + result.getFailureCount()); System.out.println("iqnor edilən testlər: " + result.getIgnoreCount()); System.out.println("uğur: " + nəticə .wasSuccessful()); )

Və icra nəticəsi:

Testləri yerinə yetirin: 3 uğursuz test: 0 nəzərə alınmayan test: 1 müvəffəqiyyət: doğru

Daha çox əvvəlki versiyalar JUnit test sinfini yazmaq üçün junit.framework.TestCase nəslini yaratmaq lazım idi. Sonra parametr kimi String götürən konstruktoru - metodun adını - təyin etmək və onu ana sinfə ötürmək lazım idi. Hər bir test üsulu prefiks testi ilə başlamalı idi. Resursları işə salmaq və buraxmaq üçün quraşdırma və tearDown metodlarından istifadə edilmişdir. Bir sözlə, dəhşət. Yaxşı, indi hər şey sadədir, bəli.

Bu gün üçün hamısı budur. Əminəm ki, JUnit Framework sizə çox kömək edəcək. Məqalə ilə bağlı şərhlər və suallar qəbul olunur.




Üst