Розробка, керована тестами

Вступ до тестування в Java

Maria Milusheva

Senior Software Engineer

Test-Driven Development

Досі ми писали тести лише після продакшн-коду.

  • Test-Driven Development (TDD) — це підхід до проєктування, де тести визначають дизайн
  • У TDD тести пишуть до будь-якого продакшн-коду

  • Навіщо TDD?

Вступ до тестування в Java

Переваги TDD

  • Розробка з TDD краще забезпечує відповідність вимогам
  • Миттєва перевірка — на весь код уже є тести
  • Кодування від тестів веде до чистішого, ліпше структурованого коду
Вступ до тестування в Java

Закони TDD

1. Спершу напишіть тест, що падає, перед будь-яким продакшн-кодом

2. Пишіть якнайкоротший можливий тест

3. Не пишіть більше продакшн-коду, ніж потрібно, щоб тест пройшов

Застосовуйте ці кроки послідовно = один цикл TDD

Розробка відбувається через повторювані цикли TDD

1 https://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
Вступ до тестування в Java

Тестування на паліндроми

  • Припустімо, нам треба метод, що перевіряє, чи є ціле число паліндромом

  • Приклади паліндромних чисел: 12321, 0, 3333

Вступ до тестування в Java

Напишіть тест, що падає, перед будь-яким кодом

@Test
public void isPalindrome_nonPalindromicInt_returnsFalse() {
    int number = 1234;

    assertFalse(isPalindrome(number)); // isPalindrome() is not yet written
}

Тест — це як примітка для майбутнього себе, що нагадує про вимоги до проєкту.

Вступ до тестування в Java

Пишіть мінімальний код, щоб тест пройшов

public boolean isPalindrome(int num) {
    return false; // Напишіть мінімальний код, що задовольняє вимоги тесту.
}

Тест тепер проходить. Можна переходити до наступного циклу TDD.

Вступ до тестування в Java

Напишіть ще один тест

Новий тест — нова вимога до функціоналу:

@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
    int number = 1234321; // Тепер пишемо складніший тестовий випадок.

    assertTrue(isPalindrome(number)); // На цьому етапі isPalindrome() впаде.
}
Вступ до тестування в Java

Реалізуйте метод

public boolean isPalindrome(int num) {
    int inverted = 0;
    while (num != 0) {
        // На кожній ітерації беріть останню цифру числа за допомогою % 10
        // і додавайте її до inverted * 10.
        inverted = inverted * 10 + num % 10;
        // Після обробки останньої цифри відкиньте її через / 10.
        num = num / 10;
    }
    return inverted;
}
Вступ до тестування в Java

Виправлення багів із TDD

TDD чудово підходить для виправлення багів!

Метод, який ми щойно написали, повертає true для number = -121. Це неправильно!

Пишемо модульний тест, щоб показати баг:

@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
    int number = -121; // Не паліндром, адже -121 не дорівнює 121-.

    assertFalse(isPalindrome(number));
}
Вступ до тестування в Java

Виправлення багів із TDD

public boolean isPalindrome(int num) {
    if (num < 0) { 
        return false; // Додаємо умову, щоб для від'ємних значень повертати false.
    }
    int inverted = 0;
    while (num != 0) {
        inverted = inverted * 10 + num % 10;
        num = num / 10;
    }
    return inverted;
}
Вступ до тестування в Java

Давайте потренуємось!

Вступ до тестування в Java

Preparing Video For Download...