Вы когда-нибудь выпускали обновление на продакшн и молились, чтобы ничего не сломалось? А потом получали шквал ошибок от пользователей? Знакомо. В этой статье я расскажу, как подружить Yii2 с Codeception и сделать тестирование неотъемлемой частью разработки. Без воды, с примерами и лайфхаками.

Digital-студия WNDER

Что такое Codeception и зачем он нужен в Yii2

Codeception — это фреймворк для тестирования на PHP. Он умеет всё: от юнит-тестов до приёмочных (end-to-end). В Yii2 он встроен с коробки, что делает жизнь разработчика проще. Представьте, что вы строите дом. Юнит-тесты — это проверка кирпичей, функциональные — проверка стен, а приёмочные — проверка всего дома на прочность. Codeception позволяет делать все три уровня.

Почему именно Codeception? Потому что он дружелюбный. Вам не нужно быть гуру тестирования, чтобы начать. Плюс Yii2 имеет готовые модули для работы с базой данных, аутентификацией и т.д.

Установка и настройка Codeception в Yii2

Если вы создали проект через composer create-project --prefer-dist yiisoft/yii2-app-basic, то Codeception уже в require-dev. Если нет — добавляем:

composer require --dev codeception/codeception codeception/module-yii2 codeception/module-asserts

После установки нужно сгенерировать конфиги. В корне проекта выполните:

vendor/bin/codecept init

Мастер задаст несколько вопросов. Выбираем "Yii2" и соглашаемся на создание тестов для всех уровней. В итоге получите папку tests с подпапками unit, functional, acceptance и файлами конфигурации *.suite.yml.

Теперь настроим подключение к тестовой базе. В config/test.php (или config/test-local.php) укажите отдельную БД, чтобы не портить данные разработки. Например:

return [
    'components' => [
        'db' => [
            'dsn' => 'mysql:host=localhost;dbname=yii2_test',
            'username' => 'root',
            'password' => '',
        ],
    ],
];
Правило: Всегда используйте отдельную базу для тестов. Иначе рискуете потерять данные или получить ложные результаты.

Пишем первый тест: от юнита до приёмочного

Начнём с юнит-теста. Допустим, у нас есть модель User с методом getFullName(). Создадим тест:

first_name = 'Иван';
        $user->last_name = 'Петров';
        $this->assertEquals('Иван Петров', $user->getFullName());
    }
}

Запускаем: vendor/bin/codecept run unit. Если всё ок — увидите зелёный результат.

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

amOnPage('/site/signup');
    }

    public function signupWithValidData(\FunctionalTester $I)
    {
        $I->fillField('SignupForm[username]', 'testuser');
        $I->fillField('SignupForm[email]', 'test@example.com');
        $I->fillField('SignupForm[password]', 'secret123');
        $I->click('Signup');
        $I->see('Ваш аккаунт создан');
        $I->seeRecord(User::class, ['username' => 'testuser']);
    }
}

Приёмочный тест (acceptance) эмулирует действия реального пользователя в браузере. Требует Selenium или WebDriver. Пример:

amOnPage('/site/login');
        $I->fillField('LoginForm[username]', 'admin');
        $I->fillField('LoginForm[password]', 'admin123');
        $I->click('Login');
        $I->see('Logout');
    }
}

Лайфхаки и полезные приёмы

Вот несколько фишек, которые сэкономят вам часы.

  • Используйте фикстуры для подготовки данных. В Yii2 есть yii\test\Fixture. Например, создайте UserFixture и загружайте её в тестах.
  • Не забывайте про транзакции. В функциональных тестах Codeception автоматически оборачивает каждый тест в транзакцию, если включен модуль Yii2 с настройкой cleanup: true. Это ускоряет тесты и изолирует их.
  • Группируйте тесты. Можно помечать тесты аннотацией @group и запускать только нужные группы.
  • Используйте codecept build после изменения конфигурации, чтобы обновить акторов (Actors).
Лайфхак: Для отладки используйте $I->pause() в приёмочных тестах — это остановит выполнение и позволит посмотреть, что происходит в браузере.

Сравнение типов тестов:

Тип теста Что проверяет Скорость Сложность
Юнит Отдельные методы, классы Быстро Низкая
Функциональный Контроллеры, БД, формы Средне Средняя
Приёмочный UI, JS, браузер Медленно Высокая

Что в итоге

Тестирование с Codeception в Yii2 — это не так страшно, как кажется. Начните с малого: напишите пару юнит-тестов, затем функциональные. Постепенно вы почувствуете уверенность в коде. Главное — регулярность. Запускайте тесты перед каждым коммитом, и багов станет меньше.

Помните: тесты — это ваша страховка. Они не заменят голову, но сэкономят нервы и время. Удачи в разработке!

Студия WNDER