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

Введение в тестирование на 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; // Write minimal code that fulfills the requirements of the test.
}

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

Введение в тестирование на Java

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

Новый тест — новое требование к функции:

@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.
}
Введение в тестирование на Java

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

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;
}
Введение в тестирование на Java

Исправление ошибок с помощью TDD

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));
}
Введение в тестирование на Java

Исправление ошибок с помощью TDD

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

Давайте потренируемся!

Введение в тестирование на Java

Preparing Video For Download...