JavaRush /Java blogi /Random-UZ /JavaRush uchun JUnit yoki uyda sinov haqida bir oz.
Sdu
Daraja

JavaRush uchun JUnit yoki uyda sinov haqida bir oz.

Guruhda nashr etilgan
Vazifangizni tekshirish uchun konsolga o'nlab marta test ma'lumotlarini kiritishdan charchadingizmi? Mushukga xush kelibsiz, men sizga u bilan nima qilishingiz mumkinligini aytaman. Ushbu materialning yakuniy maqsadi turli parametrlar bilan echilayotgan vazifani ishga tushirishni avtomatlashtirish va uning manba kodiga o'zgartirishlar kiritmasdan natijalarni tekshirish bo'ladi. Sarlavhadan allaqachon tushunganingizdek, bu juda oddiy masalada bizning asosiy yordamchimiz JUnit bo'ladi . Agar siz hali birlik testlari va birlik testlari haqida eshitmagan bo'lsangiz , men sizga bir oz tanaffus qilishingizni va ushbu tushunchalar bilan tanishishingizni maslahat beraman, xayriyatki, Internetda etarli ma'lumot mavjud. Yo'q, xohlamaysizmi? Xo'sh, menimcha, bu nima bo'layotganini tushunish uchun katta muammo bo'lib qolmaydi. Axir test va umuman sinov nima ekanligini bilasizmi? Siz buni har safar vazifangizni ishga tushirganingizda qilasiz, dastlabki ma'lumotlarni kiritasiz va natijani kutganingiz bilan solishtirasiz.
Salom, dunyo JUnit!
JUnit nima? Loyihaning rasmiy veb-saytida biz quyidagi tavsifni o'qishimiz mumkin:
JUnit - bu takrorlanadigan testlarni yozish uchun oddiy ramka. Bu birliklarni sinovdan o'tkazish uchun ramkalar uchun xUnit arxitekturasining namunasidir.
Biz uchun bu metodlari bizning dasturimiz bilan o'zaro ta'sir qiladigan maxsus mo'ljallangan sinflarni yozish, olingan natijani mos yozuvlar bilan solishtirish va agar ular mos kelmasa, bizga xabar berish qobiliyatini anglatadi. Printsipni tushunish uchun oddiy misolni ko'rib chiqing. Faraz qilaylik, bizda yordamchi sinf bor, uning usullaridan biri int tipidagi ikkita o‘zgaruvchini oladi va ularning yig‘indisini qaytaradi: JavaRush uchun JUnit yoki uyda sinov haqida bir oz.  - 1 Bu biz sinab ko‘rmoqchi bo‘lgan funksionallik. Yaxshiyamki, bizning sevimli IDEA-da testlarni tezda yaratish uchun kerak bo'lgan hamma narsa allaqachon mavjud, bizga kerak bo'lgan narsa kursorni sinf deklaratsiyasi qatoriga qo'yish, "Alt + Enter" tugmachalarini bosing va kontekst menyusida "Test yaratish" ni tanlang: Qayerni belgilaganingizdan so'ng JavaRush uchun JUnit yoki uyda test haqida bir oz.  - 2 . siz test yaratishingiz kerak, IDEA test kutubxonasini tanlashni taklif qiladi (ushbu materialda men JUnit4 dan foydalanaman; kutubxona sinflari loyihaga ulanishi uchun siz "Tuzat" tugmasini bosishingiz kerak), sinovdan o'tkaziladigan usullar va qo'shimcha variantlari. JavaRush uchun JUnit yoki uyda test haqida bir oz.  - 3 IDE test klassi shablonini yaratadi: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush uchun JUnit yoki uyda test haqida bir oz.  - 4 Biz faqat usul tanasini to'ldirishimiz kerak. JUnit tomonidan taqdim etilgan "Tasdiqlar" deb ataladigan usullar bunga yordam beradi . Soddalashtirilgan tarzda ularning ishi quyidagicha ko'rinadi: kutilgan natija va tekshirilayotgan usulni chaqirish natijasi .assert* usuliga o'tkaziladi, qulaylik uchun birinchi parametr sifatida tushuntirish xabarini qo'shishingiz mumkin. Agar test davomida parametrlar mos kelmasa, bu haqda sizga xabar beriladi. Siz oddiy sinf kabi sinov sinfini ishga tushirishingiz mumkin, men Ctrl+Shift+F10 tugmalar birikmasidan foydalanishni afzal ko'raman. JavaRush uchun JUnit yoki uyda test haqida bir oz.  - 5
Keling, vazifani aniqlaymiz
Nazariy jihatdan, hamma narsa sodda va chiroyli, ammo taklif qilingan misol kontekstida bu juda zarur emas, biz kompyuterga ikkita raqam qo'shishga ishonishimiz mumkin. Bizni ko'proq JavaRush talabalari tomonidan hal qilinadigan haqiqiy muammolar qanday ketishi qiziqtiradi, masalan, men sevimli level05.lesson12.bonus03 ni olishni taklif qilaman.
/* Algoritmlar bo'yicha masala Dastur tuzing, u: 1. konsoldan N > 0 raqamini kiritadigan 2. so'ng konsoldan N sonni kiritadigan 3. kiritilgan N sonning maksimalini ko'rsatadi. */
Musbat, manfiy sonlar va aralash to'plam uchun uchta test yozishimiz kerak.
Qanchalik uzoqroq bo'lsa, o'rmonga ...
Bu erda bizni kutilmagan hodisalar kutmoqda: 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); } }
  • Dastur mantig'i main() usulida joylashgan
  • Manba ma'lumotlari usulga o'tkazilmaydi, lekin klaviaturadan kiritiladi.
  • main() usuli natijani qaytarmaydi, lekin uni konsolga chiqaradi.
Agar birinchi nuqta ayniqsa muammoli bo'lmasa (biz odatdagidek main() usulini chaqirishimiz mumkin), keyingi ikkitasi bizni mavzuga chuqurroq kirishga va miyamizni zo'riqtirishga majbur qiladi. Muammoning bir nechta echimlarini topdim:
  1. Maksimalni topish uchun mantiqni alohida usulga o'tkazish.
    • Taroziga soling: Refaktoring nuqtai nazaridan to'g'ri yondashuv
    • Kamchiliklari: Dastur kod, keraksiz tuzilmalar bilan to'lib ketadi, hech bo'lmaganda massiv yoki ArrayList qo'shiladi (ta'm va rangga qarab ...). Faqat maksimalni topish mexanizmi sinovdan o'tkaziladi, ma'lumotlarni kiritish va chiqarish tekshirilmaydi.
  2. System.in/System.out uchun o'ramlarni yozish.
    • Taroziga soling: Biz uchinchi tomon kutubxonalaridan foydalanmaymiz.
    • Kamchiliklari: yo'l yangi boshlanuvchilar uchun emas. Sinovni amalga oshirishning nisbiy murakkabligi; testdagi kod miqdori sinovdan o'tayotgan vazifadan ko'proq bo'lishi mumkin.
  3. Sinovlar uchun qo'shimcha kutubxonalardan foydalanish.
    • Taroziga soling: Testlardagi toza kod, test yozishning nisbatan qulayligi. Sinov qilinayotgan sinfning manba kodi o'zgartirilmaydi.
    • Kamchiliklari: loyihaga uchinchi tomon kutubxonalarini ulash kerak.
Rostini aytsam, uchinchi variant menga ko'proq yoqdi, shuning uchun uni amalga oshirishga harakat qilaylik.
Tizim qoidalari
Qisqa qidiruv meni http://stefanbirkner.github.io/system-rules/ sahifasiga olib keldi va bu menga kerak bo'lgan narsa ekanligi darhol ma'lum bo'ldi.
Java.lang.System ishlatadigan kodni sinash uchun JUnit qoidalari to'plami.
Shunday qilib, keling kutubxonani yuklab olaylik . Tizim qoidalari ishlashi uchun zarur bo'lgan Commons IO kutubxonasini yuklab oling . Biz ikkala kutubxonani loyihamizga ulaymiz (Fayl -> Loyiha tuzilmasi -> Kutubxonalar -> + -> Java) va haykaltaroshlikni boshlaymiz: Ishga tushirilgandan so'ng, bizning vazifamiz konsoldan N+1 raqamlarini kiritishingizni so'raydi, bu erda birinchi raqam sizga aytadi. unga qancha raqamlar ergashadi. Tizim qoidalarida bu maqsadlar uchun TextFromStandardInputStream sinfidan foydalaniladi.Dastavval test sinfimizga shu turdagi maydonni qo‘shishimiz va uni @Rule izohi bilan belgilashimiz kerak: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Keyin to‘g‘ridan-to‘g‘ri test usulida kerakli ma’lumotlarni ko‘rsatamiz: systemInMock.provideText("4\n2\n6\n1\n3\n"); Ko'rib turganingizdek, raqamlar matn shaklida uzatiladi va "\n" qatorlari bilan ajratiladi. Shunga asoslanib, N 4 ga teng bo'ladi va biz {2, 6, 1, 3} raqamlaridan maksimalni qidiramiz. Keyinchalik, sinov ostidagi sinfning namunasini yaratishimiz va main() usulini chaqirishimiz kerak. Bizning dasturimiz systemInMock-dan ma'lumotlarni o'qiydi, uni qayta ishlaydi va natijani chop etadi va biz qilishimiz kerak bo'lgan narsa uni o'qish va standart bilan solishtirishdir. Buning uchun tizim qoidalari bizga StandardOutputStreamLog sinfini taqdim etadi. Belgilangan turdagi maydonni qo'shamiz: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Siz chop etilgan ma'lumotlarni .getLog() usuli yordamida o'qishingiz mumkin, shu bilan birga siz yangi satr belgilarining mavjudligini hisobga olishingiz kerak bo'lsa, yakuniy variantlar quyidagicha bo'lishi mumkin: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Testlar o'rtasida, ma'lumotlarni qatlamlashdan qoching, siz jurnalni tozalashingiz kerak log.clear(); Test sinfimning to'liq matni: 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 ishga tushiramiz va zavqlanamiz. -=!!! MUHIM!!!=- Ushbu material FAQAT ma'lumot olish uchun taqdim etilgan; Agar topshiriq bilan paketda begona sinf mavjud bo'lsa, men vazifani serverda muvaffaqiyatli sinovdan o'tkazishga kafolat bermayman. Tasdiqlash uchun vazifani serverga yuborishdan oldin, barcha keraksiz narsalarni olib tashlang: keraksiz fayllar, keraksiz sinflar, sharhlangan kod. Siz yaratgan testlarning muvaffaqiyatli yakunlanishi serverdagi testlarning muvaffaqiyatli yakunlanishiga kafolat bermaydi. Men nazariy materialni ataylab chaynamadim: birlik testi nazariyasi, JUnit annotatsiyalari, assert va boshqalar, barcha materiallar matnda keltirilgan havolalarda. Ehtimol, sizda o'zingizning test sinovlari usullari bor, men ularni sharhlarda siz bilan muhokama qilishdan xursand bo'laman.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION