Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Основы тестирования

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

Где лежат

ПапкаЧто в ней
tests/TestCase/ControllerТесты контроллеров
tests/TestCase/Model/TableТесты таблиц
tests/FixtureФикстуры — тестовые данные

Тестовая база

Тесты работают с отдельной базой, чтобы не испортить рабочие данные. Создайте пустую базу blog_test и укажите её в подключении test:

// config/app_local.php
'Datasources' => [
    'test' => [
        'host' => 'localhost',
        'username' => 'root',
        'password' => 'secret',
        'database' => 'blog_test',
    ],
],

Таблицы в ней создаются перед запуском тестов в файле tests/bootstrap.php. Чтобы они строились по вашим миграциям, замените там строку с SchemaLoader на (new \Migrations\TestSuite\Migrator())->run();.

Создание теста

bin/cake bake test Controller Articles

Команда создаёт tests/TestCase/Controller/ArticlesControllerTest.php с заготовками методов. Оставьте в нём один тест:

// tests/TestCase/Controller/ArticlesControllerTest.php
namespace App\Test\TestCase\Controller;
 
use Cake\TestSuite\IntegrationTestTrait;
use Cake\TestSuite\TestCase;
 
class ArticlesControllerTest extends TestCase
{
    use IntegrationTestTrait;
 
    public function testIndex(): void
    {
        $this->get('/articles');
 
        $this->assertResponseOk();
    }
}

get() выполняет запрос к приложению без браузера, assertResponseOk() проверяет, что ответ успешный. Имя метода теста начинается со слова test.

Запуск

vendor/bin/phpunit

PHPUnit печатает точку за каждый пройденный тест и итог: OK (1 test, 1 assertion). При неудаче вместо точки будет F и описание того, что не совпало.

Фикстуры

Фикстура заполняет таблицу перед каждым тестом и очищает после. Её создаёт команда bin/cake bake fixture Articles:

// tests/Fixture/ArticlesFixture.php
namespace App\Test\Fixture;
 
use Cake\TestSuite\Fixture\TestFixture;
 
class ArticlesFixture extends TestFixture
{
    public array $records = [
        [
            'title' => 'Первая статья',
            'body' => 'Текст статьи.',
            'published' => true,
            'created' => '2026-03-01 10:00:00',
            'modified' => '2026-03-01 10:00:00',
        ],
    ];
}

Подключите её в тесте и проверьте, что статья видна на странице:

protected array $fixtures = ['app.Articles'];
 
public function testIndex(): void
{
    $this->get('/articles');
 
    $this->assertResponseOk();
    $this->assertResponseContains('Первая статья');
}

Проверка формы

public function testAdd(): void
{
    $this->enableCsrfToken();
 
    $this->post('/articles/add', ['title' => 'Новая статья', 'body' => 'Текст']);
 
    $this->assertRedirect(['action' => 'index']);
}

enableCsrfToken() добавляет в запрос токен формы. Тест проверяет, что после сохранения происходит перенаправление на список.

Проверки

МетодЧто проверяет
assertResponseOk()Код ответа 2xx
assertResponseCode(404)Конкретный код
assertResponseContains('…')Текст в ответе
assertRedirect(…)Перенаправление

Частая ошибка

Если подключение test указывает на рабочую базу, тесты очистят её таблицы. Перед первым запуском убедитесь, что в Datasources.test записана отдельная база с другим именем.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.