JavaRush /Java Blogu /Random-AZ /JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.
Sdu
Səviyyə

JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.

Qrupda dərc edilmişdir
Tapşırığınızı yoxlamaq üçün test məlumatlarını onlarla dəfə konsola yazmaqdan bezdiniz? Pişiyə xoş gəldiniz, mən sizə onunla nə edə biləcəyinizi söyləyəcəyəm. Bu materialın son məqsədi həll olunan tapşırığın müxtəlif parametrlərlə işə salınmasını və onun mənbə koduna dəyişiklik etmədən nəticələrin yoxlanılmasını avtomatlaşdırmaq olacaq. Başlıqdan yəqin ki, başa düşdüyünüz kimi, bu olduqca sadə məsələdə əsas köməkçimiz JUnit olacaq . Əgər siz hələ də vahid sınağıvahid testləri haqqında eşitməmisinizsə , sizə bir az ara verməyi və bu anlayışlarla tanış olmağı təklif edirəm, xoşbəxtlikdən İnternetdə kifayət qədər məlumat var. Xeyr, istəmirsən? Yaxşı, yaxşı, düşünürəm ki, bu, baş verənləri başa düşmək üçün böyük bir problem olmayacaq. Axı, bilirsinizmi, imtahan və ümumiyyətlə imtahan nədir? Bunu hər dəfə tapşırığınızı işə saldığınız zaman edirsiniz, ilkin məlumatları daxil edin və nəticəni gözlədiyiniz nəticə ilə müqayisə edin.
Salam, dünya JUnit!
JUnit nədir? Layihənin rəsmi saytında aşağıdakı təsviri oxuya bilərik:
JUnit təkrarlanan testləri yazmaq üçün sadə bir çərçivədir. Bu, vahid test çərçivələri üçün xUnit arxitekturasının bir nümunəsidir.
Bizim üçün bu, metodları proqramımızla qarşılıqlı əlaqədə olacaq xüsusi hazırlanmış siniflər yazmaq, əldə edilən nəticəni istinad ilə müqayisə etmək və uyğun gəlmədikdə bizə məlumat vermək bacarığı deməkdir. Prinsipini başa düşmək üçün sadə bir nümunəyə nəzər salın. Tutaq ki, bizim köməkçi sinifimiz var, onun metodlarından biri int tipli iki dəyişən götürür və onların cəmini qaytarır: JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.  - 1 Bu, sınaqdan keçirəcəyimiz funksionallıqdır. Xoşbəxtlikdən, bizim sevimli IDEA-da tez bir zamanda testlər yaratmaq üçün lazım olan hər şey var, bizə lazım olan tək şey kursoru sinif bəyannamə sətirinə yerləşdirmək, "Alt + Enter" düymələrini sıxmaq və kontekst menyusunda "Test yarat" düyməsini seçməkdir: Harada olduğunu göstərdikdən JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.  - 2 sonra test yaratmalısınız, IDEA sınaq kitabxanası seçməyi təklif edir (bu materialda mən JUnit4-dən istifadə edirəm; kitabxana dərslərinin layihəyə qoşulması üçün “Düzelt” düyməsini sıxmaq lazımdır), sınaqdan keçiriləcək üsullar və əlavə seçimlər. JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.  - 3 IDE test sinfi şablonu yaradacaq: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.  - 4 Bizə sadəcə metodun gövdəsini doldurmaq lazımdır. JUnit tərəfindən təqdim edilən “Təsdiqlər” adlanan üsullar buna kömək edəcək . Sadələşdirilmiş şəkildə onların işi belə görünür: gözlənilən nəticə və yoxlanılan metodun çağırılmasının nəticəsi .assert* metoduna ötürülür, rahatlıq üçün ilk parametr kimi izahlı mesaj əlavə edə bilərsiniz. Test zamanı parametrlər uyğun gəlmirsə, bu barədə sizə məlumat veriləcək. Siz adi sinif kimi icra üçün test sinfini işə sala bilərsiniz, mən Ctrl+Shift+F10 düymələr kombinasiyasından istifadə etməyi üstün tuturam. JavaRush üçün JUnit və ya evdə sınaq haqqında bir az.  - 5
Tapşırığı dəqiqləşdirək
Teorik olaraq, hər şey sadə və gözəldir, lakin təklif olunan nümunənin kontekstində bu, həqiqətən də lazım deyil, kompüterə iki rəqəm əlavə etmək üçün etibar edə bilərik. Bizi JavaRush tələbələrinin həll etdiyi real problemlərlə işlərin necə gedəcəyi daha çox maraqlandırır, məsələn, mən sevimli level05.lesson12.bonus03-ü götürməyi təklif edirəm.
/* Alqoritmlər üzrə məsələ Proqram yazın ki: 1. konsoldan N > 0 rəqəmini daxil etsin 2. sonra konsoldan N ədədi daxil etsin 3. daxil edilmiş N ədədin maksimumunu ekrana çıxarsın. */
Müsbət, mənfi ədədlər və qarışıq dəst üçün üç test yazmalıyıq.
Meşəyə doğru...
Burada bizi bəzi sürprizlər gözləyir: public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • Proqram məntiqi main() metodunda yerləşdirilir
  • Mənbə məlumatları metoda ötürülmür, lakin klaviaturadan daxil edilir.
  • main() metodu nəticəni qaytarmır, onu konsola çıxarır.
Əgər birinci məqam xüsusilə problemli deyilsə (biz həmişəki kimi main() metodunu çağıra bilərik), onda sonrakı ikisi bizi mövzunun dərinliyinə getməyə və beynimizi gərginləşdirməyə məcbur edir. Problemin bir neçə həllini tapdım:
  1. Maksimumu tapmaq üçün məntiqin ayrı bir üsula köçürülməsi.
    • Pros: Refaktorinq baxımından düzgün yanaşma
    • Eksiler: Proqram kodlarla, lazımsız strukturlarla böyüyür, ən azı massiv və ya ArrayList əlavə olunur (zövqdən və rəngdən asılı olaraq...). Yalnız maksimumu tapmaq mexanizmi sınaqdan keçirilir, məlumatların daxil edilməsi və çıxışı yoxlanılmır.
  2. System.in/System.out üçün sarğıların yazılması.
    • Pros: Biz üçüncü tərəf kitabxanalarından istifadə etmirik.
    • Eksiler: Yol yeni başlayanlar üçün deyil. Testin həyata keçirilməsinin nisbi mürəkkəbliyi; testdəki kodun miqdarı yoxlanılan tapşırıqdan daha çox ola bilər.
  3. Testlər üçün əlavə kitabxanalardan istifadə.
    • Müsbət cəhətləri: Testlərdə təmiz kod, test yazmağın nisbi asanlığı. Test edilən sinfin mənbə kodu dəyişdirilmir.
    • Eksiler: Üçüncü tərəf kitabxanalarını layihəyə qoşmaq lazımdır.
Düzünü desəm, ən çox üçüncü variantı bəyəndim, gəlin onu həyata keçirməyə çalışaq.
Sistem Qaydaları
Qısa axtarış məni http://stefanbirkner.github.io/system-rules/ səhifəsinə apardı və dərhal aydın oldu ki, mənə lazım olan budur.
java.lang.System istifadə edən kodu test etmək üçün JUnit qaydaları toplusu.
Beləliklə, kitabxananı yükləyək . Sistem qaydalarının işləməsi üçün tələb olunan Commons IO kitabxanasını yükləyin . Biz hər iki kitabxananı layihəmizə bağlayırıq (Fayl -> Layihə Strukturu -> Kitabxanalar -> + -> Java) və heykəltəraşlığa başlayırıq: Başladıqdan sonra tapşırığımız sizdən konsoldan N+1 nömrələri daxil etməyi xahiş edir, burada ilk nömrə sizə deyir. onu neçə nömrə izləyəcək. Sistem Qaydalarında bu məqsədlər üçün TextFromStandardInputStream sinfindən istifadə olunur.İlk olaraq test sinfimizə bu tip sahə əlavə edib @Rule annotasiyası ilə qeyd etməliyik: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Sonra birbaşa test metodunda lazımi məlumatları göstəririk: systemInMock.provideText("4\n2\n6\n1\n3\n"); Gördüyünüz kimi, nömrələr mətn şəklində ötürülür və "\n" defis sətirləri ilə ayrılır. Buna əsasən məlum olur ki, N 4-ə bərabər olacaq və maksimumu {2, 6, 1, 3} rəqəmlərindən axtaracağıq. Sonra, sınaq altında olan sinfin nümunəsini yaratmalı və main() metodunu çağırmalıyıq. Proqramımız systemInMock-dan məlumatları oxuyur, onları emal edir və nəticəni çap edir və bizə sadəcə onu oxumaq və standartla müqayisə etmək qalır. Bunun üçün sistem qaydaları bizə StandardOutputStreamLog sinifini təqdim edir. Göstərilən tipdə bir sahə əlavə edirik: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Siz .getLog() metodundan istifadə edərək çap edilmiş məlumatları oxuya bilərsiniz, yeni sətir simvollarının mövcudluğunu nəzərə almalı olduğunuz halda, son seçimlər belə ola bilər: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Testlər arasında, verilənlərin qatlanmasından qaçın, siz jurnalı silməlisiniz log.clear(); Test sinfimin tam mətni: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } Biz işə salırıq və həzz alırıq. -=!!! ƏHƏMİYYƏTLİ!!!=- Bu material YALNIZ məlumat məqsədləri üçün verilir; Tapşırığı olan paketdə kənar sinif varsa, tapşırığın serverdə uğurlu sınaqdan keçirilməsinə zəmanət vermirəm. Serverə yoxlama üçün tapşırıq göndərməzdən əvvəl, kənar hər şeyi çıxarın: lazımsız fayllar, lazımsız siniflər, şərh edilmiş kod. Yaratdığınız testlərin müvəffəqiyyətlə tamamlanması serverdə testlərin uğurla başa çatmasına zəmanət vermir. Mən nəzəri materialı qəsdən çeynəmədim: vahid testi nəzəriyyəsi, JUnit annotasiyaları, assert və s., bütün materiallar mətndə verilmiş keçidlərdədir. Bəlkə də öz test üsullarınız var, mən onları şərhlərdə sizinlə müzakirə etməkdən məmnunam.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION