← Назад к вопросам

Что такое TDD?

2.0 Middle🔥 241 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Test-Driven Development (TDD) в Java

TDD — это методология разработки, при которой тесты пишутся ДО написания рабочего кода. Это фундаментальная практика agile-разработки, которая обеспечивает более качественный, тестируемый и поддерживаемый код.

Цикл TDD (Red-Green-Refactor)

ТDD следует трём этапам, повторяемым итеративно:

1. Red (Красная фаза) — написание падающего теста Вы пишете тест, который проверяет требуемую функциональность. На этом этапе тест ДОЛЖЕН провалиться, потому что функционал ещё не реализован. Это гарантирует, что тест реально проверяет что-то важное.

2. Green (Зелёная фаза) — написание минимального кода Вы пишете самый простой код, который сделает тест зелёным. Не думайте об оптимизации — цель лишь пройти тест.

3. Refactor (Рефакторинг) — улучшение кода Теперь, когда тест проходит, вы улучшаете код: убираете дублирование, упрощаете логику, улучшаете читаемость. Тесты при этом должны оставаться зелёными.

Пример: простой калькулятор

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

public class CalculatorTest {
    private Calculator calculator = new Calculator();
    
    // Red: тест падает, потому что метода нет
    @Test
    public void testAdd() {
        int result = calculator.add(2, 3);
        assertEquals(5, result);
    }
    
    @Test
    public void testAddNegativeNumbers() {
        int result = calculator.add(-2, -3);
        assertEquals(-5, result);
    }
    
    @Test
    public void testSubtract() {
        int result = calculator.subtract(10, 3);
        assertEquals(7, result);
    }
}

Сначала эти тесты падают. Затем пишем минимальный код:

public class Calculator {
    // Green: простейшая реализация
    public int add(int a, int b) {
        return a + b;
    }
    
    public int subtract(int a, int b) {
        return a - b;
    }
}

Тесты проходят. На этапе Refactor улучшаем код (если нужно).

Преимущества TDD

Лучший дизайн: Когда вы пишете тесты сначала, вы думаете о том, как код будет использоваться, что приводит к более чистому API и лучшей архитектуре.

Меньше багов: Код покрыт тестами с самого начала. Это снижает количество ошибок в production.

Документация: Тесты служат живой документацией. Другой разработчик может прочитать тесты и понять, как работает код.

Рефакторинг без страха: Когда вся функциональность покрыта тестами, вы можете смело рефакторить код.

Быстрое обнаружение проблем: Регрессии обнаруживаются сразу, а не на поздних стадиях.

Инструменты для TDD в Java

  • JUnit 4/5 — стандартный фреймворк для написания тестов
  • Mockito — для создания mock-объектов
  • AssertJ — для fluent assertions
  • TestNG — альтернатива JUnit
  • Spock — для BDD (Behaviour-Driven Development)
import static org.mockito.Mockito.*;

public class UserServiceTest {
    @Test
    public void testUserCreation() {
        UserRepository mockRepository = mock(UserRepository.class);
        UserService service = new UserService(mockRepository);
        
        User user = new User("John", "john@example.com");
        service.createUser(user);
        
        verify(mockRepository).save(user);
    }
}

Вызовы и недостатки TDD

Медленнее на начальном этапе: TDD требует больше времени в начале разработки.

Требует опыта: Начинающим сложно писать хорошие тесты.

Хрупкие тесты: Плохо написанные тесты могут быть зависимы от реализации, что затрудняет рефакторинг.

Тем не менее, долгосрочные выгоды TDD значительно превышают начальные затраты.