Основы тестирования
Тест — код, который проверяет другой код: открывает страницу, отправляет форму и сравнивает результат с ожидаемым. Тесты запускают одной командой после каждого изменения и сразу видят, не сломалось ли что-то. 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/phpunitPHPUnit печатает точку за каждый пройденный тест и итог: 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 записана отдельная база с другим именем.