Онлайн java тестінің кіру деңгейі. Бағдарламаны тестілеу, JUnit. Java Test Prerequisites

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

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

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

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

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

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

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

Сонымен, мен интеграция және бірлік тестілеу үшін пайдаланатын 12 құрал бар.

Тесттерді орындау

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

Қосымша:

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

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

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

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

Қосымша:

  • 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 әдісі теріс факторлық мәндер үшін IllegalArgumentException шығарылатынын тексереді. Todo әдісі еленбейді. Кодпен тәжірибе жасағанда @Ignore аннотациясын алып тастап көріңіз.

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

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

Біздің қазіргі әлем IDE жобадағы сынақтарды тауып, жай ғана іске қоса алады. Бірақ егер сіз оларды бағдарлама кодын пайдаланып қолмен іске қосқыңыз келсе ше? Ол үшін Runner қолданбасын пайдалануға болады.Мәтіндік нұсқалары бар – 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 ұрпағын жасау қажет болды. Содан кейін параметр ретінде Жолды қабылдайтын конструкторды анықтау керек болды - әдіс атауы - және оны ата-аналық сыныпқа беру. Әрбір сынақ әдісі префикс сынағымен басталуы керек еді. SetUp және tearDown әдістері ресурстарды инициализациялау және босату үшін пайдаланылды. Қысқасы, сұмдық. Енді бәрі қарапайым, иә.

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




Жоғарғы