Мақаланың басы: JRTB-3 жазу . Енді тестілеу туралы ойлануымыз керек. Функционалдық біз күткендей жұмыс істейтініне сенімді болу үшін барлық қосылған code сынақтармен қамтылуы керек. Алдымен SendBotMessageService қызметі үшін бірлік сынақтарын жазамыз.
Бірлік сынағы қолданбаның кейбір шағын бөлігінің логикасын тексеретін сынақ: әдетте бұл әдістер. Және бұл әдіске ие барлық қосылымдар мазақтардың көмегімен жалғанға ауыстырылады.
Енді бәрін көресіз. Сол пакетте, тек ./src/test/java қалтасында біз сынайтын сыныппен бірдей атаумен класс жасаймыз және соңында Test қосамыз . Яғни, SendBotMessageService үшін бізде осы сыныпқа арналған барлық сынақтарды қамтитын SendBotMessageServiceTest болады . Оны тестілеудегі идея келесідей: біз жалған (жалған) JavaRushTelegarmBot-қа енеміз, содан кейін біз орындау әдісі осындай аргументпен шақырылды ма, жоқ па деп сұраймыз. Міне, оқиға:
Mockito көмегімен мен жалған JavaRushBot нысанын жасадым, мен оны қызметіміздің конструкторына бердім. Содан кейін мен бір тест жаздым (Тест annotationсы бар әрбір әдіс жеке сынақ болып табылады). Бұл әдістің құрылымы әрқашан бірдей - ол ешқандай аргументтерді қажет етпейді және бос мәнді қайтарады. Сынақ атауы не сынап жатқанымызды көрсетуі керек. Біздің жағдайда бұл: хабарламаны дұрыс жіберу керек - хабарламаны дұрыс жіберу керек. Біздің тестіміз үш бөлікке бөлінеді:
блок //берілген - мұнда біз тестке қажеттінің бәрін дайындаймыз;
блок //қашан - тестілеуді жоспарлаған әдісті іске қосамыз;
//содан кейін блок - мұнда әдіс дұрыс жұмыс істегенін тексереміз.
Біздің қызметтегі логика әзірге қарапайым болғандықтан, осы сыныпқа бір сынақ жеткілікті болады. Енді CommandContainer үшін тест жазамыз:
Бұл өте айқын сынақ емес. Ол контейнер логикасына сүйенеді. Бот қолдайтын барлық пәрмендер CommandName тізімінде және контейнерде болуы керек. Сондықтан мен барлық CommandName айнымалыларын алдым, Stream API-ге бардым және әрқайсысы үшін контейнерден пәрмен іздедім. Егер мұндай пәрмен болмаса, Белгісіз пәрмен қайтарылады. Бұл жолда біз мынаны тексереміз:
UnknownCommand әдепкі болатынын тексеру үшін сізге бөлек сынақ қажет - shouldReturnUnknownCommand . Мен сізге осы сынақтарды қайта жазуға және талдауға кеңес беремін. Әзірге командалар үшін жартылай ресми сынақтар болады, бірақ оларды жазу керек. Логика SendBotMessageService сынағымен бірдей болады, сондықтан мен жалпы сынақ логикасын AbstractCommandTest сыныбына жылжытамын және әрбір нақты сынақ сыныбы мұраланып, оған қажет өрістерді анықтайды. Барлық сынақтар бір типті болғандықтан, әр уақытта бірдей нәрсені жазу оңай емес, сонымен қатар бұл жақсы codeтың белгісі емес. Жалпыланған дерексіз класс осылай болды:
Көріп отырғаныңыздай, бізде үш дерексіз әдіс бар, оны анықтағаннан кейін әрбір команда осында жазылған сынақты іске қосып, дұрыс орындауы керек. Бұл негізгі логика абстрактілі класста болған кезде, бірақ егжей-тегжейлер ұрпақтарда анықталған кезде ыңғайлы тәсіл. Міне, нақты сынақтардың орындалуы:
HelpCommandTest:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.HELP;importstaticcom.github.javarushcommunity.jrtb.command.HelpCommand.HELP_MESSAGE;@DisplayName("Unit-level testing for HelpCommand")publicclassHelpCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return HELP.getCommandName();}@OverrideStringgetCommandMessage(){return HELP_MESSAGE;}@OverrideCommandgetCommand(){returnnewHelpCommand(sendBotMessageService);}}
NoCommandTest:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.NO;importstaticcom.github.javarushcommunity.jrtb.command.NoCommand.NO_MESSAGE;@DisplayName("Unit-level testing for NoCommand")publicclassNoCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return NO.getCommandName();}@OverrideStringgetCommandMessage(){return NO_MESSAGE;}@OverrideCommandgetCommand(){returnnewNoCommand(sendBotMessageService);}}
StartCommandTest:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.START;importstaticcom.github.javarushcommunity.jrtb.command.StartCommand.START_MESSAGE;@DisplayName("Unit-level testing for StartCommand")classStartCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return START.getCommandName();}@OverrideStringgetCommandMessage(){return START_MESSAGE;}@OverrideCommandgetCommand(){returnnewStartCommand(sendBotMessageService);}}
StopCommandTest:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.CommandName.STOP;importstaticcom.github.javarushcommunity.jrtb.command.StopCommand.STOP_MESSAGE;@DisplayName("Unit-level testing for StopCommand")publicclassStopCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return STOP.getCommandName();}@OverrideStringgetCommandMessage(){return STOP_MESSAGE;}@OverrideCommandgetCommand(){returnnewStopCommand(sendBotMessageService);}}
UnknownCommandTest:
packagecom.github.javarushcommunity.jrtb.command;importorg.junit.jupiter.api.DisplayName;importstaticcom.github.javarushcommunity.jrtb.command.UnknownCommand.UNKNOWN_MESSAGE;@DisplayName("Unit-level testing for UnknownCommand")publicclassUnknownCommandTestextendsAbstractCommandTest{@OverrideStringgetCommandName(){return"/fdgdfgdfgdbd";}@OverrideStringgetCommandMessage(){return UNKNOWN_MESSAGE;}@OverrideCommandgetCommand(){returnnewUnknownCommand(sendBotMessageService);}}
Ойынның шамға тұрарлық екені анық және AbstractCommandTest арқасында біз жазуға оңай және түсінуге оңай қарапайым және түсінікті сынақтармен аяқталдық. Сонымен қатар, біз codeты қажетсіз қайталаудан құтылдық (ҚҰРҒУ -> Өзіңізді қайталамау принципіне сәлем). Сонымен қатар, қазір бізде қосымшаның өнімділігін бағалай алатын нақты сынақтар бар. Сондай-ақ, боттың өзі үшін тест жазу жақсы болар еді, бірақ бәрі оңай болмайды және жалпы алғанда, олар айтқандай, ойын шамға тұрарлық емес шығар. Сондықтан бұл кезеңде тапсырмамызды орындаймыз. Соңғы және сүйікті нәрсе - біз міндеттеме жасаймыз, хабарлама жазады: JRTB-3: Telegram Bot командаларын өңдеуге арналған пәрмен үлгісі қосылды Және әдеттегідей - Github бұрыннан біледі және тарту сұрауын жасауды ұсынады: құрастыру өтті және сіз қазірдің өзінде жасай аласыз. біріктіру... Бірақ жоқ! Мен жоба нұсқасын жаңартуды және оны RELEASE_NOTES ішінде жазуды ұмытып қалдым. Біз жаңа нұсқасы бар жазбаны қосамыз - 0.2.0-SNAPSHOT: Бұл нұсқаны pom.xml ішінде жаңартамыз және жаңа міндеттеме жасаймыз: Жаңа міндеттеме: JRTB-3: жаңартылған RELEASE_NOTES.md Енді итеріп, құрастырудың аяқталуын күтіңіз. Құрылым аяқталды, сіз оны біріктіре аласыз: мен тармақты жоймаймын, сондықтан сіз әрқашан не өзгергенін қарап, салыстыра аласыз. Тапсырмалар тақтасы жаңартылды:
қорытындылар
Бүгін біз үлкен нәрсе жасадық: жұмыс үшін команда үлгісін енгіздік. Барлығы реттелді, енді жаңа команда қосу қарапайым және қарапайым процесс болады. Біз бүгін тестілеу туралы да айттық. Біз командалар үшін әртүрлі сынақтарда codeты қайталамай біраз ойнадық. Әдеттегідей, мен GitHub сайтында тіркелуді және осы серияны және мен онда жұмыс істеп жатқан басқа жобаларды қадағалау үшін тіркелгімді орындауды ұсынамын. Мен сондай-ақ жаңа мақалалар шығарылымын қайталайтын телеграм арнасын құрдым . Бір қызығы, code әдетте мақаланың өзінен бір апта бұрын шығарылады, мен арнада мен мақаланы оқымас бұрын codeты анықтауға мүмкіндік беретін жаңа тапсырма аяқталған сайын жазамын. Жақында мен ботты тұрақты түрде шығаратын боламын, ал телеграм каналына жазылғандар бұл туралы бірінші болып біледі ;) Оқығандарыңызға рахмет, жалғасы.
GO TO FULL VERSION