Тест для Java-програмістів, або Чи не надто я суворий до претендентів? Тестування Java коду за допомогою JUnit - Туторіал Тест на знання java онлайн

Я вважаю, що розробка ПЗ - щось більше, ніж робота. Я бачу себе ремісником, який щодня намагається стати кращим. Найпростіший шлях для цього - знайти кілька хороших інструментівта відповісти на наступні питання:

  • Коли я повинен використовувати X інструмент?
  • Як я повинен використовувати X інструмент?

Автоматизоване тестування - дуже важлива частина розробки ПЗ, але в блогах програмістів трохи постів про інструменти, що використовуються. Ця ж стаття дозволить вам заглянути в мою «скриньку з інструментами». Я розповім про 12-ти бібліотеки та фреймворки, які я використовую для написання unit- та інтеграційних тестів, а також надам посилання на сторінки, які допоможуть вам зрозуміти, як їх використовувати.

Заглянемо в мою скриньку з інструментами

Перед тим, як ви зможете використовувати описані далі інструменти, ви повинні налаштувати складання, яке автоматично запускає інтеграційні та unit-тести. У мене є 2 нотатки на цю тему:

  • Інтеграційне тестування з Maven описує, як ми можемо налаштувати Maven-складання з інтеграційними та unit-тестами у різних директоріях.
  • Початок роботи з Gradle: інтеграційне тестування з плагіном TestSets описує те саме для Gradle.

Тепер ви готові подивитися на мої інструменти. Я розділив їх на категорії, щоб вам було легше орієнтуватися.

Отже, ось 12 інструментів, які я використовую при інтеграційному та unit-тестуванні.

Запуск тестів

AssertJ надає гнучкий API для написання тверджень з корисними повідомленнями про помилки, покращує читаність тестового коду, дозволяє перетворити тести на специфікації, що виконуються, які дотримуються потрібної предметно-орієнтованої мови.

Додатково:

  • Використання Hamcrest у тестуванні розповідає, як використовувати Hamcrest для написання тестів, а також як розширити його можливості за допомогою модулів користувача.
  • Перетворюємо твердження на предметно-орієнтовану мову розповідає, як створювати твердження користувача в AssertJ.
  • Пишемо чисті тести: заміна тверджень предметно-орієнтованою мовою. Розповідає, чому ми повинні замінити стандартні твердження JUnit на власні, які використовують вірну предметно-орієнтовану мову.

Тестування коду доступу до даних

Швидка БД корисна для написання інтеграційних тестів, які запускаються на локальній машині розробника.

Розширення для JUnit, яке може бути використане для ініціалізації БД у відомий стан перед виконанням кожного інтеграційного тесту та заповнення БД потрібними даними. DbUnit має свої недоліки, але це дуже корисний інструмент, що дозволяє розділити тестові дані та тестовий код.

Додатково:

  • описує ключові компоненти DbUnit, знання яких необхідне написання тестів з допомогою DbUnit.
  • надає п'ять правил написання найкращих тестівкод доступу до даних.

Java - об'єктно-орієнтована строготипізована мова програмування, розроблена компанією Sun Microsystems у 1991 році. Спочатку мова називалася Oak і призначалася для програмування побутової електроніки, проте пізніше була перейменована в Java. Офіційний випуск Java в 1995 році виявився дуже успішним і незабаром після цього мова Java зайняла сильні позиції як інструмент розробки серверних додатків.

В наш час Java використовують у всіх сферах розробки програмного забезпечення- серверні програми, десктопні програми, інструментальні засоби, веб-додатки - все це розробляється за допомогою Java і споріднених технологій.

Цільова аудиторія тесту з Java

Тест Java містить питання, відповіді на які знає більшість розробників з мінімальним досвідом програмування Java. Тест буде корисний багатьом, у тому числі людям, які не мають великого досвіду роботи з Java та хочуть отримати мінімальне уявлення про базових поняттяхцієї популярної мови програмування. Також цей тест може бути корисний студентам, які вивчають Java, для закріплення знань, отриманих у ВНЗ або ж в результаті самостійної роботи.

Попередні вимоги до тестування Java

Перед проходженням тесту з основ Java ви вже знаєте основні поняття, такі як "змінна", "цикл", "метод" і знаєте синтаксис основних мовних конструкцій. Якщо це не так, рекомендуємо вам ознайомитися з основами Java, шляхом прочитання вступного курсу.

Структура тесту з Java

Тест "Java - Основи" висвітлює такі теми:

Докладніше про тематики питань тесту можна прочитати нижче:

  • Об'єкти та класи: питання цієї тематики покривають такі поняття як клас, екземпляр класу (об'єкт), конструктори, методи та поля класу.
  • Синтаксис: питання цього розділу перевірять знання ключових слів мови, операторів, основних типів (примітиви, String), конструкцій, що управляють (if-else, while, for), а також розуміння обробки виняткових ситуацій (Exception).
  • Інше: цей розділ містить питання щодо основних понять, термінів та абревіатур, конвенцій іменування класів, змінних та методів. Також у цьому розділі розглядаються питання щодо файлів (.java, .class, .jar) та пакетів, життєвого циклу об'єктів, складання сміття (garbage collection).

Проходження онлайн тесту Java допомагає вам перевірити і закріпити знання основ Java, а також підводить вас до проходження складніших тестів з розділу тестів Java.

Сподіваємось, що даний тестбуде вам корисним і цікавим.

Подальший розвиток тесту з Java

Тест з Java постійно поповнюється новими питаннями.

У найближчих планах команди Quizful – створення тестів експертного рівня з Java. Можливо ще буде створено тест Java Puzzlers, але він, на жаль, дуже повільно наповнюється питаннями.

Якщо у Вас є зауваження щодо питань тесту, обов'язково пишіть нам. Хай щастить.

Тестування далеко не завжди буває веселим та цікавим. Цей процес зазвичай досить тривалий і часом сповнений монотонної роботи. Здається, ще зовсім недавно програмісти користувалися стандартним висновком або дебаггером для тестування java класів.

У цій статті я опишу бібліотеку JUnit 4, яка багато в чому спрощує та автоматизує процес написання тестів.

Для демонстрації основних можливостей JUnit Framework, напишемо примітивний клас мовою Java і знущатимемося над ним. Цей клас матиме два методи - знаходження факторіалу невід'ємного числа та суми двох чисел. Крім того, в екземплярі класу буде лічильник викликів методів.

Public class MathFunc ( int calls; public int getCalls() ( return calls; ) public long factorial(int number) ( calls++; if (number 1) ( for (int i = 1; i

Тепер напишемо Unit тести. Для цього створимо клас із деякою кількістю тестових методів. Звичайно, клас може містити і стандартні допоміжні способи. Щоб runner тестів міг визначити, хто є хто, тестові методи необхідно помічати антацією @Test.

Анотації можуть бути проставлені такі параметри:

  • expected - вказуємо який виняток буде згенеровано методом (див. приклад нижче);
  • timeout - через який час у мілісекундах припинити виконання тесту та зарахувати його як неуспішний.

Якщо ви хочете вказати, що певний тест необхідно пропустити, то позначте його анотацією @Ignore. Хоча можна просто видалити інструкцію @Test.

Буває таке, що для виконання кожного тестового сценарію вам потрібен певний контекст, наприклад, заздалегідь створені екземпляри класів. А після виконання необхідно звільнити зарезервовані ресурси. У цьому випадку вам знадобляться антотації @Before і @After. Метод, помічений @Before, буде виконуватися перед кожним тестовим випадком, а метод, помічений @After - після кожного тестового випадку.

Якщо ж ініціалізацію та звільнення ресурсів потрібно зробити всього один раз – відповідно до та після всіх тестів – то використовуйте пару анотацій @BeforeClass та @AfterClass.

А ось і сам тестовий клас із декількома тестовими сценаріями:

Public class MathFuncTest ( private 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); ( 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); ) )

Метод calls тестує правильність лічильника дзвінків. Метод factorial перевіряє правильність обчислення факторіалу для деяких стандартних значень. Метод factorialNegative перевіряє, що для негативних значень факотріалу буде кинуто IllegalArgumentException. Метод todo буде проігноровано. Спробуйте прибрати анотацію @Ignore, коли експериментуватимете з кодом.

Метод assertTrue перевіряє, чи є результат виразу вірним. Деякі інші методи, які можуть стати в нагоді:

  • assertEquals - очікуваний результат та отриманий результат збігаються;
  • assertNull - результатом виразу є null;
  • assertNotNull - результат виразу відмінний від null;
  • AssertSame - очікуваний і отриманий об'єкт є одним і тим же об'єктом.
  • fail – метод генерує виняток AssertionError – додаємо туди, куди не повинен дійти хід виконання програми.

В нашому сучасному світі IDE вміють знаходити та просто запускати тести в проекті. Але що робити, якщо ви хочете запустити їх вручну за допомогою програмного коду. Для цього можна скористатися Runner"ом. Бувають текстовий - junit.textui.TestRunner, графічні версії - junit.swingui.TestRunner, junit.awtui.TestRunner.

Але більш сучасний метод - це використання класу JUnitCore. Додайте наступний метод main у клас MathFuncTest:

Public static void main(String args) throws Exception ( JUnitCore runner = new JUnitCore(); Result result = runner.run(MathFuncTest.class); System.out.println("run tests: " + result.getRunCount()); System.out.println("failed tests: " + result.getFailureCount()); System.out.println("ignored tests: " + result.getIgnoreCount()); System.out.println("success: " + result .wasSuccessful()); )

І результат виконання:

Run tests: 3 failed tests: 0 ignored tests: 1 success: true

У більш ранніх версіях JUnit для написання тестового класу необхідно створити спадкоємця junit.framework.TestCase. Потім необхідно було визначити конструктор, який приймає як параметр String - назву методу - і передати його батьківському класу. Кожен тестовий спосіб повинен був починатися з префіксу test. Для ініціалізації та звільнення ресурсів використовувалися методи setUp та tearDown. Коротше, жах. Ну, а зараз все просто, так.

Ось і все сьогодні. Впевнений, JUnit Framework багато в чому допоможе вам. Коментарі та питання щодо статті вітаються.

У пошуках тестових завдань для java-програмістів натрапив на цікавий сайт ( користувачам Avastне ходити, визначається скриптовий троян, іншим мабуть можна) - http://www.betterprogrammer.com. Він перевіряє кваліфікацію ява-програмістів найпростішим, зате автоматичним способом: пропонуючи написати кілька функцій (методів) складності, що підвищується, і скопіювати код в TextArea. Далі движок сайту щось робить із завданнями (не інакше як юніт-тестит), обчислює за критеріями "швидкість-якість" певний індекс кваліфікації та видає кінцеву оцінку в такому вигляді:

Далі починаються питання. Сам я на Java програмував вдруге в житті (а тому складні завдання просто поскипав), так що 82% цього тесту відповідають рівню не-java програміст. Скільки ж тоді повинні набирати Java Junior, Java Programmer і особливо Java Senior?! Який результат очікувати від справжнього Java-програміста - 90, 95, 99? І нарешті, як бути, якщо "програміст" набирає менше 82, але тим не менш претендує на якусь роботу?!

Ноутбуки