Тестування Java з JUnit: приклади та поради для ефективного тестування

На курсі QA від Mate academy ми навчаємо, що тестування є важливою частиною розробки програмного забезпечення, оскільки воно допомагає забезпечити якість та надійність коду.

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

Що таке JUnit

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

Налаштування тестового середовища JUnit

Для початку вам потрібно встановити JUnit у ваш проект. Якщо ви використовуєте Maven або Gradle, додайте залежність JUnit у ваш файл налаштувань. Нижче наведений приклад для Maven:

Основи та приклади написання тестів з JUnit

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

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


import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @Test
    public void testAddition() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result, "2 + 3 should equal 5");
    }
}

Використання асерцій

Асерції в JUnit дозволяють перевіряти, чи відповідає результат роботи вашого коду очікуваному. Якщо асерція не вдається, тест вважається невдалим. Для асерцій використовуйте клас org.junit.jupiter.api.Assertions.


@Test
public void testSubtraction() {
    Calculator calculator = new Calculator();
    int result = calculator.subtract(5, 3);
    assertEquals(2, result, "5 - 3 should equal 2");
}

Тестування винятків

JUnit дозволяє перевіряти, чи виникають відповідні винятки під час виконання коду. Використовуйте метод assertThrows() для цього.


@Test
public void testDivisionByZero() {
    Calculator calculator = new Calculator();
    assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0), "Division by zero should throw ArithmeticException");
}

Використання параметризованих тестів

Параметризовані тести дозволяють запускати один тестовий метод з різними наборами даних. Вони корисні для перевірки багатьох випадків, що використовують однакову логіку. Використовуйте анотації @ParameterizedTest та @ValueSource, @CsvSource або @MethodSource для цього.


import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class PrimeNumberTest {

    private PrimeNumberChecker checker = new PrimeNumberChecker();

    @ParameterizedTest
    @ValueSource(ints = {2, 3, 5, 7, 11, 13, 17})
    public void testPrimeNumbers(int number) {
        assertTrue(checker.isPrime(number), number + " should be a prime number");
    }
}

Використання тестових життєвих циклів

JUnit дозволяє використовувати методи, які викликаються перед та після кожного тесту або всього тестового класу. Вони корисні для ініціалізації та очищення ресурсів. Використовуйте анотації @BeforeEach, @AfterEach, @BeforeAll та @AfterAll для цього.


import org.junit.jupiter.api.*;

public class DatabaseTest {

    private DatabaseConnection connection;

    @BeforeAll
    public static void setupClass() {
        // Виконати дії перед усіма тестами у класі
    }

    @BeforeEach
    public void setup() {
        connection = new DatabaseConnection();
        connection.connect();
        // Виконати дії перед кожним тестом
    }

    @Test
    public void testDatabaseQuery() {
        // Тестування запиту до бази даних
    }

    @AfterEach
    public void tearDown() {
        connection.disconnect();
        // Виконати дії після кожного тесту
    }

    @AfterAll
    public static void tearDownClass() {
        // Виконати дії після усіх тестів у класі
    }
}

Використання вкладених тестів

Вкладені тести дозволяють групувати тести у вкладених класах. Це корисно для структурування тестів та уникнення дублювання коду.


import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

public class ShoppingCartTest {

    @Nested
    class AddingItems {

        @Test
        public void testAddSingleItem() {
            // Тестування додавання одного товару
        }

        @Test
        public void testAddMultipleItems() {
            // Тестування додавання декількох товарів
        }
    }

    @Nested
    class RemovingItems {

        @Test
        public void testRemoveItem() {
            // Тестування видалення товару
        }

        @Test
        public void testRemoveNonExistingItem() {
            // Тестування видалення неіснуючого товару
        }
    }
}

Налаштування та налагодження тестів

JUnit дозволяє налаштувати та налагоджувати тести за допомогою анотацій @Timeout, @Disabled та @DisplayName.


@Test
@Timeout(5) // Встановити часовий ліміт виконання тесту
@DisplayName("Кастомний текстовий опис тесту")
public void testLongRunningOperation() {
    // Тестування тривалої операції
}

@Test
@Disabled("Причина відключення тесту")
public void testDisabled() {
    // Тест, який тимчасово відключений
}

Заключення

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

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

Site Footer