Вступ до тестування в Java
Maria Milusheva
Senior Software Engineer
Досі ми писали тести лише після продакшн-коду.
У TDD тести пишуть до будь-якого продакшн-коду
Навіщо TDD?
1. Спершу напишіть тест, що падає, перед будь-яким продакшн-кодом
2. Пишіть якнайкоротший можливий тест
3. Не пишіть більше продакшн-коду, ніж потрібно, щоб тест пройшов
Застосовуйте ці кроки послідовно = один цикл TDD
Розробка відбувається через повторювані цикли TDD
Припустімо, нам треба метод, що перевіряє, чи є ціле число паліндромом
Приклади паліндромних чисел: 12321, 0, 3333
@Test
public void isPalindrome_nonPalindromicInt_returnsFalse() {
int number = 1234;
assertFalse(isPalindrome(number)); // isPalindrome() is not yet written
}
Тест — це як примітка для майбутнього себе, що нагадує про вимоги до проєкту.
public boolean isPalindrome(int num) {
return false; // Напишіть мінімальний код, що задовольняє вимоги тесту.
}
Тест тепер проходить. Можна переходити до наступного циклу TDD.
Новий тест — нова вимога до функціоналу:
@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
int number = 1234321; // Тепер пишемо складніший тестовий випадок.
assertTrue(isPalindrome(number)); // На цьому етапі isPalindrome() впаде.
}
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;
}
TDD чудово підходить для виправлення багів!
Метод, який ми щойно написали, повертає true для number = -121. Це неправильно!
Пишемо модульний тест, щоб показати баг:
@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
int number = -121; // Не паліндром, адже -121 не дорівнює 121-.
assertFalse(isPalindrome(number));
}
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