JavaRush /Java блогы /Random-KK /JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.
Sdu
Деңгей

JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.

Топта жарияланған
Тапсырмаңызды тексеру үшін консольге ондаған рет сынақ деректерін теруден шаршадыңыз ба? Мысыққа қош келдіңіз, мен сізге онымен не істеуге болатынын айтамын. Бұл материалдың түпкі мақсаты әртүрлі параметрлермен шешілетін тапсырманы іске қосуды автоматтандыру және оның бастапқы codeына өзгерістер енгізбей нәтижелерді тексеру болады. Тақырыптан түсінгеніңіздей, бұл қарапайым мәселеде біздің басты көмекшіміз JUnit болады . Егер сіз бірлік сынағы және бірлік сынақтары туралы әлі естімеген болсаңыз , мен сізге кішкене үзіліс жасап, осы ұғымдармен танысуды ұсынамын, бақытымызға орай, Интернетте ақпарат жеткілікті. Жоқ, қаламайсың ба? Жарайды, бұл не болып жатқанын түсіну үшін үлкен проблема болмайды деп ойлаймын. Ақыр соңында, сіз сынақ және жалпы тестілеудің не екенін білесіз бе? Сіз мұны тапсырманы іске қосқан сайын, бастапқы деректерді енгізген кезде және нәтижені күткеніңізбен салыстырған кезде жасайсыз.
Сәлем, әлем JUnit!
JUnit дегеніміз не? Жобаның ресми сайтында біз келесі сипаттаманы оқи аламыз:
JUnit - қайталанатын сынақтарды жазуға арналған қарапайым құрылым. Бұл бірлік тестілеу құрылымдарына арналған xUnit архитектурасының данасы.
Біз үшін бұл әдістемелері бағдарламамызбен өзара әрекеттесетін, алынған нәтижені анықтамалық нәтижемен салыстыратын және сәйкес келмесе, бізге хабарлайтын арнайы әзірленген сыныптарды жазу мүмкіндігін білдіреді. Принципті түсіну үшін қарапайым мысалды қарастырыңыз. Бізде көмекші класс бар делік, оның әдістерінің бірі int түріндегі екі айнымалыны қабылдайды және олардың сомасын қайтарады: JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.  - 1 Бұл біз сынауға тырысатын функционалдылық. Бақытымызға орай, біздің сүйікті IDEA-да тесттерді жылдам жасау үшін қажет нәрсенің бәрі бар, бізге тек курсорды сынып декларациясының жолына қою, «Alt + Enter» пернелерін басып, контекстік мәзірден «Тест жасау» пәрменін таңдау: Қай жерде екенін көрсеткеннен кейін JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.  - 2 . тест жасау керек, IDEA тестілеу кітапханасын таңдауды ұсынады (бұл материалда мен JUnit4 қолданамын; кітапхана сыныптары жобаға қосылу үшін «Түзету» түймесін басу керек), тексерілетін әдістер және қосымша опциялар. JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.  - 3 IDE сынақ сыныбы үлгісін жасайды: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.  - 4 Бізге тек әдіс мәтінін толтыру керек. Бұған JUnit ұсынған «Бекітулер» деп аталатын әдістер көмектеседі . Жеңілдетілген түрде олардың жұмысы келесідей көрінеді: күтілетін нәтиже және тексерілетін әдісті шақыру нәтижесі .assert* әдісіне беріледі, ыңғайлы болу үшін бірінші параметр ретінде түсіндірме хабарламасын қосуға болады. Тестілеу кезінде параметрлер сәйкес келмесе, бұл туралы сізге хабарланады. Орындау үшін сынақ сыныбын әдеттегі сынып сияқты іске қосуға болады, мен Ctrl+Shift+F10 пернелер тіркесімін пайдаланғым келеді. JavaRush үшін JUnit немесе үйде тестілеу туралы біраз.  - 5
Тапсырманы нақтылайық
Теорияда бәрі қарапайым және әдемі, бірақ ұсынылған мысалдың контекстінде бұл қажет емес, біз компьютерге екі санды қосуға сене аламыз. Бізді JavaRush студенттері шешетін нақты есептер қалай болатыны қызықтырады, мысалы, мен сүйікті level05.lesson12.bonus03 алуды ұсынамын.
/* Алгоритмдерге есептер: 1. консольден N > 0 санын енгізетін 2. содан кейін консольден N санды енгізетін 3. енгізілген N санның максимумын көрсететін программа жазыңыз. */
Оң, теріс сандар және аралас жиынтық үшін үш сынақ жазуымыз керек.
Орманға бұдан әрі қарай...
Бұл жерде бізді тосынсыйлар күтіп тұр: 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); } }
  • Бағдарлама логикасы main() әдісіне орналастырылған
  • Бастапқы деректер әдіске берілмейді, бірақ пернетақтадан енгізіледі.
  • main() әдісі нәтижені қайтармайды, бірақ оны консольге шығарады.
Егер бірінші тармақ ерекше проблемалық болмаса (біз негізгі() әдісін әдеттегідей атай аламыз), онда келесі екеуі бізді тақырыпқа тереңірек енуге және миымызды жүктемеуге мәжбүр етеді. Мен мәселенің бірнеше шешімін таптым:
  1. Максималды табу логикасын бөлек әдіске жылжыту.
    • Артықшылықтары: Рефакторингке қатысты дұрыс көзқарас
    • Кемшіліктері: Бағдарлама codeпен, қажетсіз құрылымдармен толып кетеді, кем дегенде массив немесе ArrayList қосылады (дәмі мен түсіне байланысты ...). Тек максималды табу механизмі сыналады, мәліметтерді енгізу және шығару тексерілмейді.
  2. System.in/System.out үшін орауыштарды жазу.
    • Артықшылықтары: Біз үшінші тарап кітапханаларын пайдаланбаймыз.
    • Жаман тұстары: жол жаңадан бастаушыларға арналмаған. Сынақты жүзеге асырудың салыстырмалы күрделілігі; сынақтағы code мөлшері сыналатын тапсырмаға қарағанда көбірек болуы мүмкін.
  3. Тесттер үшін қосымша кітапханаларды пайдалану.
    • Артықшылықтары: сынақтардағы таза code, тест жазудың салыстырмалы жеңілдігі. Тексерілетін сыныптың бастапқы codeы өзгертілмейді.
    • Кемшіліктері: жобаға үшінші тарап кітапханаларын қосу қажет.
Шынымды айтсам, маған үшінші нұсқа қатты ұнады, сондықтан оны жүзеге асыруға тырысайық.
Жүйе ережелері
Қысқа іздеу мені http://stefanbirkner.github.io/system-rules/ бетіне апарды және бұл маған қажет нәрсе екені бірден белгілі болды.
java.lang.System қолданатын codeты сынауға арналған JUnit ережелерінің жинағы.
Сонымен, кітапхананы жүктеп алайық . Жүйе ережелерінің жұмыс істеуі үшін қажет Commons IO кітапханасын жүктеп алыңыз . Біз екі кітапхананы да жобамызға қосамыз (Файл -> Жоба құрылымы -> Кітапханалар -> + -> Java) және мүсіндеуді бастаймыз: Іске қосылғаннан кейін біздің тапсырма консольден N+1 сандарын енгізуді сұрайды, мұнда бірінші нөмір сізге айтады. оның соңынан қанша сан шығады. Жүйе ережелерінде бұл мақсаттар үшін TextFromStandardInputStream сыныбы пайдаланылады.Алғашында сынақ сыныбына осы түрдегі өрісті қосып, оны @Rule annotationсымен белгілеу керек: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); Содан кейін тікелей сынақ әдісінде біз қажетті деректерді көрсетеміз: systemInMock.provideText("4\n2\n6\n1\n3\n"); Көріп отырғаныңыздай, сандар мәтін түрінде беріледі және «\n» дефис жолдарымен бөлінген. Осыған сүйене отырып, N 4-ке тең болады және максималды {2, 6, 1, 3} сандарынан іздейміз. Әрі қарай, сыналатын сыныптың данасын жасап, main() әдісін шақыруымыз керек. Біздің бағдарлама systemInMock-тен деректерді оқиды, оны өңдейді және нәтижені басып шығарады, біз оны оқып, стандартпен салыстыруымыз керек. Бұл әрекетті орындау үшін жүйе ережелері бізге StandardOutputStreamLog сыныбын береді. Көрсетілген түрдегі өрісті қосамыз: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); Басып шығарылған деректерді .getLog() әдісі арқылы оқуға болады, ал жаңа жол таңбаларының болуын ескеру қажет болса, соңғы опциялар келесідей болуы мүмкін: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); Тесттер арасында, деректерді қабаттасудан аулақ болыңыз, журналды тазалауыңыз керек log.clear(); Менің сынақ сыныбымның толық мәтіні: 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()); } } Біз іске қосамыз және ләззат аламыз. -=!!! МАҢЫЗДЫ!!!=- Бұл материал тек ақпараттық мақсатта берілген; Тапсырма бар пакетте бөгде сынып болса, мен serverде тапсырманы сәтті сынауға кепілдік бермеймін. Серверге тексеру үшін тапсырманы жібермес бұрын, барлық бөгде заттарды алып тастаңыз: қажет емес файлдар, қажет емес сыныптар, түсініктеме берілген code. Сіз жасаған сынақтардың сәтті аяқталуы serverдегі сынақтардың сәтті аяқталуына кепілдік бермейді. Мен теориялық материалды әдейі шайнаған жоқпын: бірлік тестілеу теориясы, JUnit annotationлары, assert және т.б., барлық материал мәтінде берілген сілтемелерде. Мүмкін сізде тестілеудің өзіндік әдістері бар шығар, мен оларды түсініктемелерде сіздермен талқылауға қуаныштымын.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION