Введение в тестирование на 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; // Write minimal code that fulfills the requirements of the test.
}
Тест теперь проходит. Можно переходить к следующему циклу TDD.
Новый тест — новое требование к функции:
@Test
public void isPalindrome_PalindromicInt_ReturnsTrue() {
int number = 1234321; // Now write a more complex test case.
assertTrue(isPalindrome(number)); // At this point isPalindrome() will fail.
}
public boolean isPalindrome(int num) {
int inverted = 0;
while (num != 0) {
// At every iteration take the last digit of the number using % 10
// and add it to inverted * 10.
inverted = inverted * 10 + num % 10;
// Now that we have processed the last digit, discard it using / 10.
num = num / 10;
}
return inverted;
}
TDD отлично подходит для исправления ошибок!
Написанный метод возвращает true для number = -121. Это неверно!
Напишем модульный тест, воспроизводящий ошибку:
@Test
public void isPalindrome_NegativeNumber_ReturnsFalse() {
int number = -121; // Not a palindrome as -121 is not the same as 121-.
assertFalse(isPalindrome(number));
}
public boolean isPalindrome(int num) {
if (num < 0) {
return false; // We add a clause to return false for negative values.
}
int inverted = 0;
while (num != 0) {
inverted = inverted * 10 + num % 10;
num = num / 10;
}
return inverted;
}
Введение в тестирование на Java