Java-ға кіру деңгейін онлайн тестілеу. Бағдарламаны тестілеу, JUnit. Java тестінің алғышарттары

Менің ойымша, бағдарламалық жасақтаманы әзірлеу жұмыс емес. Мен өзімді күн сайын жақсы болуға тырысатын қолөнерші ретінде көремін. Мұны істеудің «ең оңай» жолы - жақсы құралдарды табу және келесі сұрақтарға жауап беру:

  • X құралын қашан пайдалануым керек?
  • X құралын қалай пайдалануым керек?

Автоматтандырылған тестілеу бағдарламалық жасақтаманы әзірлеудің өте маңызды бөлігі болып табылады, бірақ бағдарламашылар блогтарында қолданылатын құралдар туралы жазбалар аз. Сол мақала менің «құралдар қорабын» қарауға мүмкіндік береді. Мен бірлік және біріктіру сынақтарын жазу үшін пайдаланатын 12 кітапхана мен фреймворктарды қарастырамын және оларды қалай пайдалану керектігін түсінуге көмектесетін беттерге сілтемелер беремін.

Менің құралдар жинағыма назар аударайық

Төменде сипатталған құралдарды пайдаланбас бұрын, интеграция мен бірлік сынақтарын автоматты түрде іске қосатын құрылымды орнату керек. Менде бұл тақырып бойынша 2 ескертпелер бар:

  • Maven көмегімен интеграциялық тестілеу бөлек каталогтарда интеграция және бірлік сынақтары бар Maven құрылымын қалай орнатуға болатынын сипаттайды.
  • Gradle-мен жұмысты бастау: TestSets плагинімен интеграциялық тестілеу Gradle үшін бірдей сипаттайды.

Енді сіз менің құралдарымды мұқият қарауға дайынсыз. Шарлауды жеңілдету үшін мен оларды санаттарға бөлдім.

Міне, мен біріктіру және бірлік тестілеу үшін қолданатын 12 құрал.

Іске қосу сынақтары

AssertJ пайдалы қате хабарлары бар бекітулерді жазу үшін икемді API ұсынады, сынақ кодының оқылуын жақсартады және сынақтарды қажетті домен тіліне сәйкес келетін орындалатын спецификацияларға айналдыруға мүмкіндік береді.

Қосымша:

  • Тестілеу үшін Hamcrest пайдалану тесттерді жазу үшін Hamcrest пайдалану жолын және оны теңшелетін модульдермен қалай кеңейту керектігін түсіндіреді.
  • Бекітулерді доменге тән тілге айналдыру AssertJ бағдарламасында теңшелетін бекітулерді жасау жолын түсіндіреді.
  • Таза тесттерді жазу: бекітулерді доменге тән тілмен ауыстыру. Неліктен стандартты JUnit бекітулерін доменге қатысты дұрыс тілді қолданатын өз сөздерімен ауыстыру керектігін түсіндіреді.

Деректерге қол жеткізу кодын сынау

Жылдам ДҚ, жұмыс істейтін интеграциялық сынақтарды жазу үшін пайдалы жергілікті машинаәзірлеуші.

Әрбір біріктіру сынағын орындамай және дерекқорды қажетті деректермен толтырмас бұрын белгілі күйге дерекқорды инициализациялау үшін пайдалануға болатын JUnit кеңейтімі. DbUnit-тің кемшіліктері бар, бірақ бұл өте пайдалы құралСынақ деректері мен сынақ кодын бөлуге мүмкіндік беретін A.

Қосымша:

  • DbUnit көмегімен сынақтарды жазу үшін білу қажет DbUnit негізгі құрамдастарын сипаттайды.
  • деректерге қол жеткізу коды үшін ең жақсы сынақтарды жазудың бес ережесін береді.

Java бағдарламашыларына арналған тест тапсырмаларын іздеуде мен қызықты сайтқа тап болдым (Avast пайдаланушылары бармауы керек, сценарийлік троян анықталды, қалғандары мүмкін) - http://www.betterprogrammer.com. Ол Java бағдарламашыларының біліктілігін ең қарапайымымен тексереді, бірақ автоматты түрде: күрделілікті арттырудың бірнеше функцияларын (әдістерін) жазуды және кодты TextArea-ға көшіруді ұсыну. Содан кейін сайт қозғалтқышы тапсырмалармен бірдеңе жасайды (бірлікті тестілеуден басқа емес), «жылдамдық-сапа» критерийлері бойынша белгілі бір біліктілік индексін есептейді және осы нысанда қорытынды баға береді:

Содан кейін сұрақтар басталады. Мен өзім өмірімде екінші рет Java тілінде бағдарламаладым (сондықтан мен күрделі тапсырмаларды өткізіп жібердім), сондықтан бұл сынақтың 82% деңгейге сәйкес келеді. java емес бағдарламашы. Java Junior, Java Programmer және одан да көп Java Senior қанша алуы керек? Қандай нәтиже күтуге болады қазіргі java программист - 90, 95, 99? Ақырында, «бағдарламашы» 82-ден төмен балл жинаса да, әлдебір жұмысқа орналасса ше?!

Тестілеу әрқашан қызықты және қызықты бола бермейді. Бұл процесс әдетте өте ұзақ және кейде монотонды жұмысқа толы. Жақында бағдарламашылар java сыныптарын тексеру үшін стандартты шығысты немесе отладчикті пайдаланған сияқты.

Бұл мақалада мен тест жазу процесін айтарлықтай жеңілдететін және автоматтандыратын JUnit 4 кітапханасын сипаттайтын боламын.

JUnit Framework негізгі мүмкіндіктерін көрсету үшін Java тілінде қарабайыр класс жазып, оны мазақ етейік. Бұл сыныптың екі әдісі болады - теріс емес санның факториалы мен екі санның қосындысын табу. Бұған қоса, сынып данасы әдісті шақыру есептегішін қамтиды.

Жалпыға ортақ сынып MathFunc ( int қоңыраулар; public int getCalls() ( қайтару қоңыраулары; ) жалпы ұзақ факторлық(int нөмірі) ( calls++; if (1-сан) ( int i = 1; i үшін)

Енді бірлік сынақтарын жазайық. Ол үшін бірнеше сынақ әдістері бар класс құрайық. Әрине, сыныпта әдеттегі көмекші әдістер де болуы мүмкін. Сынақ жүргізушісі кімнің кім екенін анықтауы үшін сынақ әдістері @Test аннотациясымен түсіндірілуі керек.

Аннотацияда келесі параметрлер болуы мүмкін:

  • күтілетін - әдіс арқылы қандай ерекшелік шығарылатынын көрсетіңіз (төмендегі мысалды қараңыз);
  • күту уақыты - миллисекундпен қанша уақыттан кейін сынақты орындауды тоқтату және оны сәтсіз деп санау.

Белгілі бір сынақты өткізіп жіберу керек екенін көрсеткіңіз келсе, оны @Ignore аннотациясымен түсіндіріңіз. Сіз жай ғана @Test аннотациясын алып тастай аласыз.

Әрбір сынақ сценарийін орындау үшін сізге кейбір контекст қажет болады, мысалы, алдын ала жасалған сынып даналары. Ал орындағаннан кейін резервтелген ресурстарды босату керек. Бұл жағдайда сізге @Before және @After аннотациялары қажет болады. @Before белгісімен белгіленген әдіс әрбір сынақ жағдайының алдында орындалады және @After белгісімен белгіленген әдіс әрбір сынақ жағдайдан кейін орындалады.

Ресурстарды инициализациялау және шығаруды тек бір рет орындау қажет болса - сәйкесінше барлық сынақтарға дейін және кейін - @BeforeClass және @AfterClass аннотацияларының жұбын пайдаланыңыз.

Міне, бірнеше сынақ сценарийлері бар сынақ сыныбының өзі:

Жалпы сынып MathFuncTest ( жеке MathFunc math; @Before public void init() ( math = new MathFunc(); ) @After public void tearDown() ( math = null; ) @Test public void calls() ( assertEquals(0, math). .getCalls()); math.factorial(1); assertEquals(1, math.getCalls()); math.factorial(1); assertEquals(2, math.getCalls()); ) @Test public void факториалы() ( assertTrue(math.factorial(0) == 1); assertTrue(math.factorial(1) == 1); assertTrue(math.factorial(5) == 120); ) @Test(expected = IllegalArgumentException.class) public void factorialNegative() ( math.factorial(-1); ) @Ignore @Test public void todo() ( assertTrue(math.plus(1, 1) == 3); ) )

Қоңыраулар әдісі қоңырау есептегішінің дұрыстығын тексереді. Факторлық әдіс кейбір стандартты мәндер үшін факториалдың дұрыс есептелгенін тексереді. FactorialNegative әдісі Facotrial теріс мәндері үшін IllegalArgumentException шығарылатынын тексереді. Todo әдісі еленбейді. Кодпен тәжірибе жасағанда @Ignore аннотациясын жоюды қарастырыңыз.

assertTrue әдісі өрнектің нәтижесі ақиқат екенін тексереді. Пайдалы болуы мүмкін басқа әдістер:

  • assertEquals – күтілетін нәтиже мен алынған нәтиже бірдей;
  • assertNull – өрнектің нәтижесі нөлге тең;
  • assertNotNull – өрнектің нәтижесі нөл емес;
  • assertSame - күтілетін және қабылданған нысандар бірдей нысан.
  • сәтсіз - әдіс AssertionError ерекше жағдайын жасайды - біз оны бағдарламаның орындалуы жетпейтін жерге қосамыз.

Біздің қазіргі әлем IDE жобадағы сынақтарды тауып, оңай іске қоса алады. Бірақ егер сіз оларды бағдарлама кодын пайдаланып қолмен іске қосқыңыз келсе ше? Ол үшін Runner "th" қолданбасын пайдалануға болады. Мәтін бар - junit.textui.TestRunner, графикалық нұсқалары - junit.swingui.TestRunner, junit.awtui.TestRunner.

Бірақ сәл көбірек заманауи әдіс JUnitCore класын пайдалану болып табылады. MathFuncTest сыныбына келесі негізгі әдісті қосыңыз:

Жалпыға ортақ статикалық void main(String args) Ерекше жағдайды шығарады ( JUnitCore жүгірушісі = жаңа JUnitCore(); Нәтиже нәтижесі = runner.run(MathFuncTest.class); System.out.println("тексерулерді іске қосу: " + result.getRunCount()); System.out.println("сәтсіз сынақтар: " + result.getFailureCount()); System.out.println("елемеген сынақтар: " + result.getIgnoreCount()); System.out.println("сәтті: " + нәтиже .wasSuccessful()); )

Ал орындалу нәтижесі:

Сынақтарды орындау: 3 сәтсіз сынақ: 0 еленбеген сынақ: 1 сәтті: шын

JUnit бағдарламасының бұрынғы нұсқаларында сынақ сыныбын жазу үшін junit.framework.TestCase ішкі сыныбын жасау керек болды. Содан кейін параметр ретінде String – әдіс атауын қабылдайтын конструкторды анықтау және оны ата-аналық сыныпқа беру қажет болды. Әрбір сынақ әдісі сынақ префиксінен басталуы керек еді. SetUp және tearDown әдістері ресурстарды инициализациялау және босату үшін пайдаланылды. Қысқасы, сұмдық. Енді бәрі қарапайым, иә.

Бүгінгі күннің бәрі осы. JUnit Framework сізге көп көмектесетініне сенімдімін. Мақала бойынша пікірлер мен сұрақтар қабылданады.




Жоғарғы