Java junit

Java JUnit. Вступ

JUnit - бібліотека для модульного тестування програмного забезпечення на мові Java. JUnit - простий і в той же час дуже потужний інструмент для написання unit тестів. Переважна кількість компаній, що розробляють програмне забезпечення на Java. використовують саме JUnit на етапі розробки ПО.

У даній статті ми будемо розглядати останню на даний момент версію JUnit. а саме 4.1.0. Завантажити JUnit 4.1.0 можна тут.

Для демонстрації основних можливостей JUnit Framework. напишемо невеликий клас:

public class Money

private int value;
private String type;

public Money (int v, String t) <
value = v;
type = t;
>

public Money add (Money m) <
return new Money (value + m. getValue (). type);
>

public int getValue () <
return value;
>
>

Давайте для цього класу напишемо тест:

import static org. junit. Assert. *;
import org.junit.Test;

public class TestMoney

@Test
public void testAdd () <
Money m1 = new Money (12. "USD");
Money m2 = new Money (14. "USD");
Money expected = new Money (26. "USD");
Money result = m1. add (m2);
if (. result. equals (expected))
fail ( "Not equals");
>

Що ми тут бачимо?

Метод testAdd () буде проводити тестування, так як на це вказує анотація @Test. Дана інструкція завжди позначає тестові методи. Всі методи тестування обов'язково є public void. В даному методі створюються два об'єкти типу Гроші. що мають значення Value12 і 14 відповідно. Потім створюється об'єкт expected. якому присвоюється очікувана сума двох попередніх об'єктів. Четвертому об'єкту типу Гроші присвоюється фактичне значення, отримане після підсумовування перших двох об'єктів методом add (int, String). Потім за допомогою оператора if ми порівнюємо очікувану і фактичну суму, і якщо вони не рівні, за допомогою методу fail (String) повідомляємо про це. Якщо в ході unit тестування буде досягнутий метод fail. то весь тест вважається заваленим і буде виведено повідомлення Not equals.

Оскільки в тесті таких перевірок з оператором if може бути досить багато, то щоб не нагромаджувати код, більш зручним представляється наступний спосіб:

import static org. junit. Assert. *;
import org.junit.Test;

public class TestMoney

@Test
public void testAdd () <
Money m1 = new Money (12. "USD");
Money m2 = new Money (14. "USD");
Money expected = new Money (26. "USD");
Money result = m1. add (m2);
assertTrue (expected. equals (result));
>

В даному випадку, якщо вираз expected.equals (result) поверне true. то тест буде пройдений, інакше - тест вважається заваленим.

Крім assertTrueJUnit пропонує багато інших способів перевірки:

import static org. junit. Assert. *;
import org.junit.Test;

public class TestMoney

@Test
public void testAdd () <
Money m1 = new Money (12. "USD");
Money m2 = new Money (14. "USD");
Money expected = new Money (26. "USD");
Money result = m1. add (m2);
assertFalse (. expected. equals (result)); // Якщо true - то тест завалений
assertEquals (expected, result); // Якщо не рівні - тест завалений
assertNotNull (new Money (10. "USD")); // Якщо null - тест завалений
assertNull (new Money (10. "USD")); // Якщо не null - тест завалений
assertNotSame (expected, result); // Якщо обидва об'єкти є однаковими (не одне і те ж, що рівні) - тест завалений
assertSame (expected, result); // Якщо обидва об'єкти не є однаковими - тест завалений
>

Для кожного з наведених assert-ів можна вставити першим параметром рядок, яка відбудеться з якщо тест буде завалений:

assertEquals ( "Error". expected, result);

Якби у нас в класі Money була б ось така функція:

public Money div (Money m) <
return new Money (value / m. getValue (). type);
>

Те цілком очікувано було перевірити, викидається чи виключення, якщо ми б ділили на 0. Це можна зробити наступним способом:

@Test (expected = Exception. Class)
public void testDiv () <
Money m1 = new Money (12. "USD");
Money m2 = new Money (0. "USD");
Money result = m1. div (m2);
>

Як бачите для цього ми створили окремий метод тестування (Власне, рекомендується для кожної тестованої функції створювати окрему функцію тестування). В анотації крім @Test ми вказали в дужках expected = Exception.class. Це означає, що ми чекаємо викиду винятку Exception. і якщо він не буде викинутий, то така поведінка тестируемой функції - невірне (ми явно вказали, що m2 в поле value матиме 0), а значить тест буде завалений.

Ви, напевно, помітили, що в кожної функції тестування нам доводилося спершу форматувати значення одних і тих же змінних. JUnit пропонує винести таку ініціалізацію в окремий метод, попереджання анотацією @Before.

@Before
public void setup () <
Money m1 = new Money (12. "USD");
Money m2 = new Money (14. "USD");
>

Таких методів з @Before може бути кілька, але всі вони повинні бути public void і будуть виконуватися до всіх тестів по черзі. Якщо після тестування нам необхідно також зробити деякі дії, то це також робиться в окремій функції з анотацією @After. Також є такі анотації, як @BeforeClass. @AfterClass - вони будуть викликані до і після створення екземпляра тест-класу відповідно і обов'язково повинні бути public static void. Крім цього є також дуже цікава анотація @Test (timeout = 1000). Після закінчення зазначеного в дужках часу, якщо тест не пройдений, він вважається заваленим. Час вказується в мілісекундах.

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

@Ignore
@Test (timeout = 1000)
public void testAdd () <
// код
>

Також, якщо помістити цю анотацію на клас, то всі тести в цьому класі будуть відключені.

Ну ось, майже все. Давайте тільки запустимо створений нами тест в середовищі Eclipse.

Створіть Java Project і назвіть його, наприклад, JUnitExample. Створіть в папці src клас Money і помістіть його в пакет main:

public class Money <
private int value;
private String type;

public Money (int v, String t) <
value = v;
type = t;
>

public Money add (Money m) <
return new Money (value + m. getValue (). type);
>

public Money div (Money m) <
return new Money (value / m. getValue (). type);
>

public int getValue () <
return value;
>
>

Як правило, тести поміщаються в окрему папку (Sourse Folder - папка з кодами), а потім в пакет з тим же ім'ям, що пакет тестованого класу. Для цього клікніть правою кнопкою по імені проекту і виберіть пункт New-> Source Folder. Дайте їй ім'я test і створіть в ній пакет main. Клацаємо правою кнопкою миші на пакеті main і вибираємо New-> JUnit Test Case (можливо даний пункт знадобитися знайти в Other. Але він там точно повинен бути). Виберіть ім'я для класу з тестами (як правило ім'я починається зі слова Test потім ім'я тестованого класу). Нехай буде TestMoney. Тут же можна поставити галочки навпроти методів setUpBeforeClass (). tearDownAfterClass (). setUp (). tearDown () і Eclipse сам створить методи з анотаціями @AfterClass. @BeforClass. @After. @Before. Далі кнопка ОК і описуємо клас тестів:

import static org. junit. Assert. *;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestMoney <
Money m1;
Money m2;
Money expected;
Money result;

@BeforeClass
public static void setUpBeforeClass () throws Exception <
>

@AfterClass
public static void tearDownAfterClass () throws Exception <
>

@Before
public void setUp () throws Exception <
m1 = new Money (12. "USD");
m2 = new Money (14. "USD");
expected = new Money (26. "USD");
result = m1. add (m2);
>

@After
public void tearDown () throws Exception <
>

@Test
public void testAdd () <
assertEquals ( "Error". expected, result);
>
>

Для запуску потрібно запустити програму в режимі Run As -> JUnit Test. Після цього запустяться всі тести. На вкладці JUnit ви побачите результат.

Схожі статті