Тестування програми, junit

JUnit - бібліотека для модульного тестування програм Java. Створений Кентом Беком і Еріком Гамою, JUnit належить родині фреймворків xUnit для різних мов програмування, що бере початок в SUnit Кента Бека для Smalltalk. JUnit породив екосистему розширень - JMock, EasyMock, DbUnit, HttpUnit і т. Д.

JUnit - це Java фреймворк для тестування, т. Е. Тестування окремих ділянок коду, наприклад, методів або класів. Досвід, отриманий під час роботи з JUnit, важливий в розробці концепцій тестування програмного забезпечення.

Приклад тесту JUnit

Необхідність використання JUnit

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

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

Види тестування і місце JUnit тестування в класифікації

Тестування програмного забезпечення можна розділити на два види:

  • тестування чорного ящика;
  • тестування білого ящика.

Під час тестування програми як чорного ящика внутрішня структура додатки до уваги не береться. Все, що має значення, це функціональність, яку програма має забезпечити. При тестуванні програми як білого ящика до уваги береться внутрішня структура, тобто клас і методи. Крім цього, тестування можна розділити на чотири рівні:

  • юніт тести - тестування окремих ділянок коду;
  • інтеграційне тестування - тестування взаємодії і спільної роботи компонентів;
  • системне тестування - тестування всієї системи в цілому;
  • приймальне тестування - підсумкове тестування готової системи на відповідність вимогам.

Юніт тестування по визначенню є тестуванням білого ящика.

Використовується unit тестування в двох варіантах - JUnit 3 і JUnit 4. Розглянемо обидві версії, так як в старих проектах досі використовується 3-тя версія, яка підтримує Java 1.4.

Для створення тесту слід успадковувати тест-клас TestCase, перевизначити методи setUp і tearDown при необхідності, ну і найголовніше - розробити тестові методи, найменування яких повинно починатися з аббрівіатури "test". При запуску тесту спочатку створюється екземпляр тест-класу (для кожного тесту в класі окремий екземпляр класу), потім виконується метод setUp, запускається сам тест, ну і на завершення виконується метод tearDown. Якщо який-небудь з методів викликає виняток, тест вважається проваленим.

Примітка. тестові методи повинні бути public void, можуть бути static.

Тести складаються з виконання деякого коду і перевірок. Перевірки найчастіше виконуються з допомогою класу Assert хоча іноді використовують ключове слово assert.

Як приклад розглянемо утиліту для роботи з рядками, що включає методи для перевірки порожнього рядка і уявлення послідовності байт у вигляді 16-річної рядки:

Додаткові можливості, TestSuite

JUnit 3 має кілька додаткових можливостей. Наприклад, можна групувати тести. Для цього необхідно використовувати клас TestSuite:

Можна виконання тесту повторити кілька разів. Для цього використовується RepeatedTest:

Наслідуючи тест-клас від ExceptionTestCase, можна перевірити код на викид виключення:

Як видно з прикладів все досить просто і нічого зайвого - мінімум коду для JUnit тестування.

В JUnit 4 додана підтримка нових можливостей з Java 5.0; тести можуть бути оголошені за допомогою анотацій. При цьому існує зворотна сумісність з попередньою версією фреймворка. Практично всі розглянуті вище приклади будуть працювати і в JUnit 4 за винятком RepeatedTest, який відсутній в новій версії.

Які внесені зміни з'явилися в JUnit 4? Розглянемо той же приклад, але вже з використанням нових можливостей:

Що змінилося в JUnit 4?

  • Для спрощення роботи можна успадковуватися від класу Assert. хоча це необов'язково.
  • Анотація @Before позначає методи, які будуть викликані перед виконанням тестів. Методи повинні бути public void. Тут зазвичай розміщуються предустановки для тесту, в нашому випадку це генерація тестових даних (метод setUpToHexStringData).
  • Можна використовувати анотацію @BeforeClass. яка позначає методи, які будуть викликані до створення екземпляра тест-класу; методи повинні бути public static void. Дану анотацію (метод) має сенс використовувати для тестування в разі, коли клас містить кілька тестів, що використовують різні налаштування, або коли кілька тестів використовують одні і ті ж дані, щоб не витрачати час на їх створення для кожного тесту.
  • Анотація @After позначає методи, які будуть викликані після виконання тестів. Методи повинні бути public void. Тут розміщуються операції звільнення ресурсів після тесту; в нашому випадку - очищення тестових даних (метод tearDownToHexStringData).
  • Анотація @AfterClass пов'язана за змістом з @BeforeClass. але виконує методи після тестування класу. Як і у випадку з @BeforeClass. методи повинні бути public static void.
  • Анотація @Test позначає тестові методи. Як і раніше, ці методи повинні бути public void. Тут розміщуються самі перевірки. Крім того, в даній анотації можна використовувати два параметра, expected - задає очікуване виняток і timeout - задає час, по закінченню якого тест вважається проваленим.

Приклади використання анотацій з параметрами, JUnit Test:

Ігнорування виконання тесту, JUnit Ignore

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

Правила тастірованія, JUnit Rule

JUnit дозволяє використовувати певні розробником правила до і після виконання тесту, які розширюють функціонал. Наприклад, є вбудовані правила для завдання таймаута для тесту (Timeout), для завдання очікуваних винятків (ExpectedException), для роботи з тимчасовими файлами (TemporaryFolder) і ін.

Набори тестів, JUnit Suite, SuiteClasses

Запуск тесту може бути налаштований за допомогою анотації @RunWith. Тестові класи, які містять в собі тестові методи, можна об'єднати в набори тестів (Suite). Наприклад, створено два класи тестування об'єктів. TestFilter, TestConnect. Ці два тестових класу можна об'єднати в один тестовий клас TestWidgets.java:

Для настройки запускаються тестів використовується анотація @SuiteClasses, в яку включені тестові класи.

анотація Categories

Анотація, JUnit Parameterized

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

Параметрізірованіе методу. Theories.class, DataPoints, DataPoint, Theory

Анотація Theories параметрізірует тестовий метод, а не конструктор. Дані позначаються за допомогою @DataPoints і @DataPoint. тестовий метод - за допомогою @Theory. Тест, який використовує цей функціонал, може виглядати приблизно так:

Порядок виконання тестів

Якщо необхідно виконати тест в певному порядку, то можна скористатися інструкцією @FixMethodOrder (MethodSorters.NAME_ASCENDING), визначеної в JUnit 4.11. наприклад:

В іншому випадку можна використовувати наступні 2 підходи.

Схожі статті