Урок 13: Тестирование (Unit и Functional) в Yii 2

В 13-ом уроке мы изучим одну из самых важных тем для профессиональной разработки, это тестирование в Yii 2. Если вы хотите создавать надежные приложения, которые не ломаются после каждого изменения, этот урок станет вашим верным спутником. Мы разберем настройку Codeception, научимся писать unit-тесты для моделей и функциональные тесты, эмулирующие действия пользователей. А еще запустим всё это и научимся анализировать результаты.

Настройка Codeception для тестирования

Перед тем как писать тесты, нужно подготовить окружение. В Yii 2 для этого используется Codeception это мощный фреймворк для тестирования PHP-приложений. Он уже включен в базовую установку Yii 2, так что нам останется только настроить его под наши нужды.

Первым делом убедимся, что Codeception установлен. Откроем терминал в корне проекта и выполним:

bash
composer require "codeception/codeception" --dev

Если вы создавали проект через yii2-app-basic или yii2-app-advanced, Codeception, скорее всего, уже присутствует. Проверим это, запустив:

bash
./vendor/bin/codecept --version

Если видите версию (например, 4.x или 5.x), всё в порядке.

Теперь инициализируем Codeception в проекте:

bash
./vendor/bin/codecept bootstrap

Эта команда создаст папку tests с базовой структурой:

  • unit/ для юнит-тестов.
  • functional/ для функциональных тестов.
  • acceptance/ для приемочных тестов (мы их пока не трогаем).
  • _support/ вспомогательные классы.
  • _data/ фикстуры (тестовые данные).

Далее настроим конфигурационные файлы. Откроем tests/unit.suite.yml и проверим настройки:

yaml
actor: UnitTester
modules:
    enabled:
        - Asserts
        - Yii2:
            part: [orm, fixtures] # Подключаем ORM и фикстуры
            configFile: 'config/test.php' # Путь к конфигу Yii для тестов

Аналогично для tests/functional.suite.yml:

yaml
actor: FunctionalTester
modules:
    enabled:
        - Yii2:
            configFile: 'config/test.php'

Практическая задача:

  1. Создайте конфигурационный файл config/test.php, который будет использовать тестовую базу данных.
  2. Запустите команду ./vendor/bin/codecept build, чтобы сгенерировать классы тестеров.

Написание unit-тестов для моделей

Юнит-тесты проверяют работу отдельных компонентов приложения, например моделей. Предположим, у нас есть модель User и мы хотим убедиться, что её методы валидации работают корректно.

Создадим тест для модели. В папке tests/unit создадим файл UserTest.php:

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 проверяет, что модель валидна при корректных данных.

Практическая задача:

  1. Напишите unit-тест для метода findByUsername() вашей модели User.
  2. Проверьте, что метод возвращает null, если пользователя не существует и корректный объект, если он есть.

Functional-тесты: эмуляция действий пользователя

Функциональные тесты проверяют сценарии взаимодействия пользователя с приложением. Например, регистрацию, вход в систему или отправку формы. В Yii 2 для этого используется модуль Yii2, который эмулирует HTTP-запросы.

Допустим, мы хотим протестировать форму входа. Создадим файл tests/functional/LoginCest.php:

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() проверка наличия текста на странице.

Практическая задача:

  1. Напишите функциональный тест для формы регистрации пользователя.
  2. Проверьте, что после успешной регистрации происходит редирект на страницу профиля.

Запуск и анализ тестов

Тесты готовы, пора их запустить. В терминале выполните:

bash
# Запуск всех тестов
./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 для вывода подробной информации:

bash
./vendor/bin/codecept run -vv

Практическая задача:

  1. Запустите все тесты и убедитесь, что они проходят.
  2. Намеренно сломайте код модели User и посмотрите, как Codeception сообщит об ошибке.

Тестирование это необходимость для любого серьёзного проекта. Сегодня вы научились настраивать Codeception, писать unit-тесты для моделей и функциональные тесты, эмулирующие действия пользователей. Обязательно практикуйтесь: добавляйте тесты для новых фич и рефакторите старые.

Хотите узнать больше? Переходите к полному курсу по Yii 2 для начинающих, где мы разбираем всё, от основ MVC до сложных REST-API.

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий