В 13-ом уроке мы изучим одну из самых важных тем для профессиональной разработки, это тестирование в Yii 2. Если вы хотите создавать надежные приложения, которые не ломаются после каждого изменения, этот урок станет вашим верным спутником. Мы разберем настройку Codeception, научимся писать unit-тесты для моделей и функциональные тесты, эмулирующие действия пользователей. А еще запустим всё это и научимся анализировать результаты.
Настройка Codeception для тестирования
Перед тем как писать тесты, нужно подготовить окружение. В Yii 2 для этого используется Codeception это мощный фреймворк для тестирования PHP-приложений. Он уже включен в базовую установку Yii 2, так что нам останется только настроить его под наши нужды.
Первым делом убедимся, что Codeception установлен. Откроем терминал в корне проекта и выполним:
composer require "codeception/codeception" --dev
Если вы создавали проект через yii2-app-basic или yii2-app-advanced, Codeception, скорее всего, уже присутствует. Проверим это, запустив:
./vendor/bin/codecept --version
Если видите версию (например, 4.x или 5.x), всё в порядке.
Теперь инициализируем Codeception в проекте:
./vendor/bin/codecept bootstrap
Эта команда создаст папку tests с базовой структурой:
unit/для юнит-тестов.functional/для функциональных тестов.acceptance/для приемочных тестов (мы их пока не трогаем)._support/вспомогательные классы._data/фикстуры (тестовые данные).
Далее настроим конфигурационные файлы. Откроем tests/unit.suite.yml и проверим настройки:
actor: UnitTester modules: enabled: - Asserts - Yii2: part: [orm, fixtures] # Подключаем ORM и фикстуры configFile: 'config/test.php' # Путь к конфигу Yii для тестов
Аналогично для tests/functional.suite.yml:
actor: FunctionalTester modules: enabled: - Yii2: configFile: 'config/test.php'
Практическая задача:
- Создайте конфигурационный файл
config/test.php, который будет использовать тестовую базу данных. - Запустите команду
./vendor/bin/codecept build, чтобы сгенерировать классы тестеров.
Написание unit-тестов для моделей
Юнит-тесты проверяют работу отдельных компонентов приложения, например моделей. Предположим, у нас есть модель User и мы хотим убедиться, что её методы валидации работают корректно.
Создадим тест для модели. В папке tests/unit создадим файл UserTest.php:
<?php
namespace tests\unit;
use app\models\User;
use tests\UnitTester;
class UserTest extends \Codeception\Test\Unit
{
protected UnitTester $tester;
public function testValidation()
{
$user = new User();
// Проверка обязательных полей
$user->username = null;
$this->assertFalse($user->validate(['username'])); // Ожидаем ошибку
$user->email = 'invalid-email';
$this->assertFalse($user->validate(['email'])); // Некорректный email
// Корректные данные
$user->username = 'testuser';
$user->email = 'test@example.com';
$this->assertTrue($user->validate()); // Всё должно быть ок
}
}
Как это работает:
- Мы создаем экземпляр модели и проверяем её валидацию.
- Метод
assertFalseожидает, что валидация провалится (например, если полеusernameне заполнено). assertTrueпроверяет, что модель валидна при корректных данных.
Практическая задача:
- Напишите unit-тест для метода
findByUsername()вашей модели User. - Проверьте, что метод возвращает
null, если пользователя не существует и корректный объект, если он есть.
Functional-тесты: эмуляция действий пользователя
Функциональные тесты проверяют сценарии взаимодействия пользователя с приложением. Например, регистрацию, вход в систему или отправку формы. В Yii 2 для этого используется модуль Yii2, который эмулирует HTTP-запросы.
Допустим, мы хотим протестировать форму входа. Создадим файл tests/functional/LoginCest.php:
<?php
namespace tests\functional;
use tests\FunctionalTester;
class LoginCest
{
public function testLogin(FunctionalTester $I)
{
$I->amOnPage('/site/login');
$I->see('Вход'); // Проверяем заголовок страницы
// Заполняем форму неверными данными
$I->fillField('Логин', 'wronguser');
$I->fillField('Пароль', 'wrongpass');
$I->click('Войти');
$I->see('Неверный логин или пароль');
// Заполняем форму верными данными
$I->fillField('Логин', 'admin');
$I->fillField('Пароль', 'admin123');
$I->click('Войти');
$I->see('Выход (admin)'); // Проверяем, что вошли
}
}
Пояснение:
amOnPage()переход на указанный URL.fillField()заполнение поля формы.click()клик по кнопке или ссылке.see()проверка наличия текста на странице.
Практическая задача:
- Напишите функциональный тест для формы регистрации пользователя.
- Проверьте, что после успешной регистрации происходит редирект на страницу профиля.
Запуск и анализ тестов
Тесты готовы, пора их запустить. В терминале выполните:
# Запуск всех тестов ./vendor/bin/codecept run # Только unit-тесты ./vendor/bin/codecept run unit # Конкретный тест ./vendor/bin/codecept run tests/unit/UserTest.php
После запуска вы увидите отчет в терминале:
Unit Tests (1) ------------------------------- ✔ UserTest: Validation (0.12s) ---------------------------------------------- Functional Tests (1) ------------------------- ✔ LoginCest: Test login (0.25s) ----------------------------------------------
Если тест падает, Codeception покажет подробную ошибку. Например:
1) LoginCest: Test login Test tests/functional/LoginCest.php:testLogin Step See "Выход (admin)" Fail Failed asserting that contains "Выход (admin)".
Совет: Используйте -vv для вывода подробной информации:
./vendor/bin/codecept run -vv
Практическая задача:
- Запустите все тесты и убедитесь, что они проходят.
- Намеренно сломайте код модели User и посмотрите, как Codeception сообщит об ошибке.
Тестирование это необходимость для любого серьёзного проекта. Сегодня вы научились настраивать Codeception, писать unit-тесты для моделей и функциональные тесты, эмулирующие действия пользователей. Обязательно практикуйтесь: добавляйте тесты для новых фич и рефакторите старые.
Хотите узнать больше? Переходите к полному курсу по Yii 2 для начинающих, где мы разбираем всё, от основ MVC до сложных REST-API.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


