1. Тестирование
  2. Тестирование: начало работы

Введение

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

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

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

В директории tests вашего приложения предоставляется файл 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

Примечание Шаблоны тестов могут быть настроены с использованием публикации шаблонов.

После того как тест был создан, вы можете определить методы тестирования, как обычно, с использованием 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() в родительском классе.

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

Как уже упоминалось, после написания тестов их можно запустить с использованием 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 в качестве "dev" зависимости. Затем включите опцию --parallel при выполнении команды Artisan test:

composer require brianium/paratest --dev
 
php artisan test --parallel

По умолчанию Laravel создаст столько процессов, сколько доступно ядер ЦП на вашем компьютере. Однако вы можете настроить количество процессов, используя опцию --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