#Введение
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();
#Отчёты о покрытии тестами
При запуске тестов приложения вы можете захотеть узнать, насколько ваши тесты покрывают код приложения и какая часть кода используется при выполнении тестов. Для этого можно использовать опцию --coverage при вызове команды test:
php artisan test --coverage
#Установка минимального порога покрытия
Вы можете использовать опцию --min для задания минимального порога покрытия тестами. Если порог не будет достигнут, тестовый набор завершится с ошибкой:
php artisan test --coverage --min=80.3
#Профилирование тестов
Тестовый раннер Artisan также включает удобный механизм для вывода списка самых медленных тестов вашего приложения. Запустите команду test с опцией --profile, чтобы получить список из десяти самых медленных тестов и легко определить, какие из них можно оптимизировать для ускорения тестового набора:
php artisan test --profile