Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти
Главная Laravel 10.x Тестирование: Начало работы

Тестирование: Начало работы

10.x 7 мар 2026 г.

#Введение

Laravel изначально ориентирован на тестирование. Поддержка тестирования с помощью PHPUnit включена по умолчанию, и файл phpunit.xml уже настроен для вашего приложения. Фреймворк также предоставляет удобные вспомогательные методы, позволяющие выразительно тестировать ваши приложения.

По умолчанию в директории tests вашего приложения содержатся две папки: Feature и Unit. Unit-тесты фокусируются на очень маленькой, изолированной части вашего кода. На самом деле, большинство unit-тестов, вероятно, проверяют один метод. Тесты в директории "Unit" не загружают ваше Laravel-приложение и поэтому не имеют доступа к базе данных или другим сервисам фреймворка.

Feature-тесты могут проверять более крупные части кода, включая взаимодействие нескольких объектов или даже полный HTTP-запрос к JSON-эндпоинту. В общем, большинство ваших тестов должны быть feature-тестами. Такие тесты дают наибольшую уверенность, что ваша система в целом работает как задумано.

Файл ExampleTest.php предоставлен как в директории Feature, так и в Unit. После установки нового Laravel-приложения выполните команды vendor/bin/phpunit или php artisan test для запуска тестов.

#Окружение

При запуске тестов Laravel автоматически устанавливает конфигурационное окружение в значение testing благодаря переменным окружения, определённым в файле phpunit.xml. Laravel также автоматически настраивает драйверы сессий и кэша на array, чтобы данные сессий и кэша не сохранялись во время тестирования.

Вы можете при необходимости определить другие значения конфигурации для тестового окружения. Переменные окружения для testing могут быть настроены в файле phpunit.xml вашего приложения, но обязательно очистите кэш конфигурации с помощью команды Artisan config:clear перед запуском тестов!

#Файл окружения .env.testing

Кроме того, вы можете создать файл .env.testing в корне проекта. Этот файл будет использоваться вместо .env при запуске тестов PHPUnit или выполнении команд Artisan с опцией --env=testing.

#Трейт CreatesApplication

Laravel включает трейт CreatesApplication, который применяется к базовому классу TestCase вашего приложения. Этот трейт содержит метод createApplication, который загружает Laravel-приложение перед запуском тестов. Важно оставить этот трейт в исходном месте, так как некоторые функции, например параллельное тестирование Laravel, зависят от него.

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

Для создания нового теста используйте Artisan-команду make:test. По умолчанию тесты будут размещены в директории tests/Feature:

php artisan make:test UserTest

Если вы хотите создать тест в директории tests/Unit, используйте опцию --unit при выполнении команды make:test:

php artisan make:test UserTest --unit

Если вы хотите создать тест с использованием Pest PHP, добавьте опцию --pest к команде make:test:

php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
Примечание

Заготовки тестов можно настроить с помощью публикации stub-файлов.

После генерации теста вы можете определить методы тестирования как обычно, используя PHPUnit. Для запуска тестов выполните команду vendor/bin/phpunit или php artisan test в терминале:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    /**
     * Пример базового теста.
     */
    public function test_basic_test(): void
    {
        $this->assertTrue(true);
    }
}
Внимание

Если вы определяете собственные методы setUp / tearDown в классе теста, обязательно вызывайте соответствующие методы parent::setUp() / parent::tearDown() родительского класса. Обычно parent::setUp() вызывается в начале вашего метода setUp, а parent::tearDown() — в конце метода tearDown.

#Запуск тестов

Как уже упоминалось, после написания тестов вы можете запускать их с помощью phpunit:

./vendor/bin/phpunit

Кроме команды phpunit, вы можете использовать Artisan-команду test для запуска тестов. Тестовый раннер Artisan предоставляет подробные отчёты, упрощающие разработку и отладку:

php artisan test

Любые аргументы, которые можно передать команде phpunit, также можно передавать команде Artisan test:

php artisan test --testsuite=Feature --stop-on-failure

#Параллельный запуск тестов

По умолчанию Laravel и PHPUnit выполняют тесты последовательно в одном процессе. Однако вы можете значительно сократить время выполнения тестов, запуская их одновременно в нескольких процессах. Для начала установите пакет Composer brianium/paratest как зависимость для разработки. Затем используйте опцию --parallel при выполнении команды Artisan test:

composer require brianium/paratest --dev

php artisan test --parallel

По умолчанию Laravel создаёт столько процессов, сколько доступно ядер CPU на вашей машине. Вы можете изменить количество процессов с помощью опции --processes:

php artisan test --parallel --processes=4
Внимание

При параллельном запуске тестов некоторые опции PHPUnit (например, --do-not-cache-result) могут быть недоступны.

#Параллельное тестирование и базы данных

Если у вас настроено основное подключение к базе данных, Laravel автоматически создаёт и мигрирует тестовую базу данных для каждого параллельного процесса, выполняющего тесты. Тестовые базы данных получают суффикс с уникальным токеном процесса. Например, при двух параллельных процессах Laravel создаст и будет использовать базы your_db_test_1 и your_db_test_2.

По умолчанию тестовые базы данных сохраняются между вызовами команды Artisan test, чтобы их можно было использовать повторно при последующих запусках test. Однако вы можете пересоздать их с помощью опции --recreate-databases:

php artisan test --parallel --recreate-databases

#Хуки параллельного тестирования

Иногда необходимо подготовить определённые ресурсы, используемые тестами вашего приложения, чтобы их можно было безопасно использовать в нескольких параллельных процессах.

С помощью фасада ParallelTesting вы можете указать код, который будет выполняться при setUp и tearDown процесса или тестового случая. Переданные замыкания получают переменные $token и $testCase, содержащие токен процесса и текущий тестовый случай соответственно:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Загрузка сервисов приложения.
     */
    public function boot(): void
    {
        ParallelTesting::setUpProcess(function (int $token) {
            // ...
        });

        ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
            // ...
        });

        // Выполняется при создании тестовой базы данных...
        ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
            Artisan::call('db:seed');
        });

        ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
            // ...
        });

        ParallelTesting::tearDownProcess(function (int $token) {
            // ...
        });
    }
}

#Доступ к токену параллельного тестирования

Если вы хотите получить текущий токен параллельного процесса из любого места в тестовом коде приложения, используйте метод token. Этот токен — уникальный строковый идентификатор отдельного тестового процесса и может использоваться для разделения ресурсов между параллельными процессами. Например, Laravel автоматически добавляет этот токен в конец имён тестовых баз данных, создаваемых каждым процессом параллельного тестирования:

$token = ParallelTesting::token();

#Отчёты о покрытии тестами

Внимание

Для этой функции требуется Xdebug или PCOV.

При запуске тестов приложения вы можете захотеть узнать, насколько ваши тесты покрывают код приложения и какая часть кода используется при выполнении тестов. Для этого можно использовать опцию --coverage при вызове команды test:

php artisan test --coverage

#Установка минимального порога покрытия

Вы можете использовать опцию --min для задания минимального порога покрытия тестами. Если порог не будет достигнут, тестовый набор завершится с ошибкой:

php artisan test --coverage --min=80.3

#Профилирование тестов

Тестовый раннер Artisan также включает удобный механизм для вывода списка самых медленных тестов вашего приложения. Запустите команду test с опцией --profile, чтобы получить список из десяти самых медленных тестов и легко определить, какие из них можно оптимизировать для ускорения тестового набора:

php artisan test --profile