Laravel построен с учетом требований тестирования. Фактически, поддержка тестирования с помощью PHPUnit включена прямо из коробки, и файл phpunit.xml
уже настроен для вашего приложения. Фреймворк также поставляется с удобными вспомогательными методами, позволяющими выразительно тестировать ваши приложения.
По умолчанию каталог tests
вашего приложения содержит два каталога: Feature
и Unit
. Модульные (юнит) тесты – это тесты, которые фокусируются на очень небольшой изолированной части вашего кода. Фактически, большинство модульных тестов, вероятно, сосредоточены на одном методе. Тесты в каталоге «Unit» тестов не загружают ваше приложение Laravel и, следовательно, не могут получить доступ к базе данных вашего приложения или другим службам фреймворка.
Функциональные тесты могут тестировать большую часть вашего кода, включая взаимодействие нескольких объектов друг с другом, или даже целый HTTP-запрос, возвращающий JSON. Как правило, большинство ваших тестов должны быть функциональными. Эти типы тестов обеспечивают максимальную уверенность в том, что ваша система в целом работает должным образом.
Файл ExampleTest.php
находится в каталогах тестов Feature
и Unit
. После установки нового приложения Laravel выполните команды vendor/bin/phpunit
или php artisan test
из командной строки для запуска ваших тестов.
При запуске тестов, Laravel автоматически устанавливает конфигурацию окружения как «тестовое» благодаря переменной окружения, определенной в файле phpunit.xml
. Laravel во время тестирования также автоматически настраивает для сессии и кеша драйверы array
, что означает, что во время тестирования данные сессии или кеша не сохраняются.
При необходимости вы можете определять другие значения конфигурации среды тестирования. Переменные окружения testing
могут быть настроены в файле phpunit.xml
, но перед запуском тестов не забудьте очистить кеш конфигурации с помощью команды config:clear
Artisan!
Кроме того, вы можете создать файл .env.testing
в корне вашего проекта. Этот файл будет использоваться вместо .env
при запуске тестов PHPUnit или выполнении команд Artisan с параметром --env=testing
.
Laravel содержит трейт CreatesApplication
, который применяется к базовому классу TestCase
вашего приложения. Этот трейт содержит метод createApplication
, который загружает приложение Laravel перед запуском ваших тестов. Важно, чтобы вы оставили этот трейт в его исходном месте, так как от него зависит некоторый функционал, например, функционал параллельного тестирования Laravel.
Чтобы сгенерировать новый тест, используйте команду make:test
Artisan. Эта команда поместит новый класс теста в каталог 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
{
/**
* Отвлеченный пример модульного теста.
*
* @return void
*/
public function test_basic_test()
{
$this->assertTrue(true);
}
}
Предупреждение
Если вы определяете свои собственные методыsetUp
/tearDown
в тестовом классе, обязательно вызывайте соответствующие методыparent::setUp()
/parent::tearDown()
родительского класса.
Как упоминалось ранее, после того, как вы написали тесты, вы можете запускать их с помощью phpunit
:
./vendor/bin/phpunit
В дополнение к команде phpunit
, вы можете использовать команду test
Artisan для запуска ваших тестов. Тестер Artisan отображает подробные отчеты о тестах для упрощения разработки и отладки:
php artisan test
Любые аргументы, которые могут быть переданы команде phpunit
, также могут быть переданы команде Artisan test
:
php artisan test --testsuite=Feature --stop-on-failure
По умолчанию Laravel и PHPUnit выполняют ваши тесты последовательно в рамках одного процесса. Однако вы можете значительно сократить время, необходимое для запуска тестов, за счет одновременного выполнения тестов в нескольких процессах. Для начала убедитесь, что в зависимостях вашего приложения имеется пакет nunomaduro/collision
версии ^5.3
или выше. При выполнении команды test
Artisan используйте параметр --parallel
:
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
.
По умолчанию тестовые базы данных сохраняются между вызовами команды test
Artisan, чтобы их можно было использовать снова при последующих вызовах 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;
class AppServiceProvider extends ServiceProvider
{
/**
* Загрузка любых служб приложения.
*
* @return void
*/
public function boot()
{
ParallelTesting::setUpProcess(function ($token) {
// ...
});
ParallelTesting::setUpTestCase(function ($token, $testCase) {
// ...
});
// Выполнится при создании тестовой базы данных ...
ParallelTesting::setUpTestDatabase(function ($database, $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function ($token, $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function ($token) {
// ...
});
}
}
Если вы хотите получить доступ к «токену» текущего процесса из любого другого места в коде теста вашего приложения, то вы можете использовать метод token
. Этот токен представляет собой уникальный строковый идентификатор для каждого из процессов тестирования и может использоваться для разделения подготавливаемых ресурсов процессов параллельного тестирования. Например, Laravel автоматически добавляет этот токен в конец тестовых баз данных, создаваемых каждым процессом параллельного тестирования:
$token = ParallelTesting::token();
При выполнении тестов приложения вы можете определить, действительно ли ваши тесты охватывают код приложения и сколько кода приложения используется при выполнении ваших тестов. Для этого вы можете указать флаг --coverage
при вызове команды test
:
php artisan test --coverage
Вы можете использовать параметр --min
, чтобы определить минимальный порог покрытия тестами вашего приложения. Набор тестов завершится ошибкой, если этот порог не будет достигнут:
php artisan test --coverage --min=80.3