Читали ли вы книгу по TDD Кента Бека?

Ответ

Да, я читал "Test-Driven Development by Example" Кента Бека. Это фундаментальная работа, которая сформировала мой подход к разработке. Я применяю цикл "красный-зелёный-рефакторинг" в ежедневной работе.

Практический пример из моего опыта (на PHP с PHPUnit):

  1. Красная фаза: Пишу минимальный тест для новой функциональности.

    // tests/CalculatorTest.php
    public function testItAddsTwoNumbers(): void
    {
        $calculator = new Calculator();
        $this->assertEquals(5, $calculator->add(2, 3));
    }

    Запускаю тест — он падает, так как класса или метода ещё не существует.

  2. Зелёная фаза: Пишу минимальную реализацию, чтобы тест прошёл.

    // src/Calculator.php
    class Calculator
    {
        public function add(int $a, int $b): int
        {
            return $a + $b;
        }
    }

    Теперь тест проходит.

  3. Рефакторинг: Улучшаю код, сохраняя зелёный статус тестов.

    // Добавляю проверку на переполнение или расширяю функциональность, предварительно написав новый тест.

Книга научила меня мыслить через интерфейсы и контракты, которые диктуют тесты, что в итоге приводит к более чистому и слабо связанному дизайну. Для современных PHP-проектов я комбинирую эти принципы с использованием таких инструментов, как PHPUnit для модульных тестов и Behat для поведенческих.

Ответ 18+ 🔞

Э, слушай, а ты читал эту классику — «Test-Driven Development by Example» от Кента Бека? Ну, ту самую, которая мозги на место ставит. Это ж, блядь, не просто книжка, а прямо фундамент, на котором я теперь всё строю. Без этого цикла «красный-зелёный-рефакторинг» я как без рук, честное слово.

Вот, смотри, как это в жизни выглядит, на примере из моего прошлого проекта (PHP, PHPUnit):

  1. Красная фаза, ёпта. Сажусь и пишу самый простой, самый тупой тест на новую фичу. Просто чтобы было от чего оттолкнуться.

    // tests/CalculatorTest.php
    public function testItAddsTwoNumbers(): void
    {
        $calculator = new Calculator();
        $this->assertEquals(5, $calculator->add(2, 3));
    }

    Запускаю — и, естественно, получаю ни хуя себе, потому что класса Calculator ещё в проекте нет. Тест падает, как подстреленный. Отлично, план есть.

  2. Зелёная фаза. Теперь надо сделать так, чтобы эта мартышлюшка наконец-то заработала. Пишу ровно столько кода, сколько нужно для прохождения теста, и ни байта больше. Никаких умных движений.

    // src/Calculator.php
    class Calculator
    {
        public function add(int $a, int $b): int
        {
            return $a + $b;
        }
    }

    Запускаю снова — о, чудо! Теперь зелёный, красота. Задача выполнена, можно выдохнуть.

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

    // Ну, например, добавляю проверку на переполнение, но только после того, как напишу под это новый тест, понятное дело.

Вот эта книга, она, блядь, не просто про тесты. Она про то, как заставить твой э бошка думай по-другому. Ты сначала думаешь, что ты хочешь от кода (и пишешь тест), а уж потом — как это сделать. Получается такой дизайн, где всё на своих местах, и одна часть за другую не цепляется, как хитрая жопа. Для современных PHP-шных дел я это всё смешиваю: PHPUnit для модульных проверок и Behat, когда нужно описать поведение системы для бизнеса. Работает — пизда рулю.