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.
Чтобы создать новый тест, используйте команду artisan make:test
. По умолчанию тесты будут помещены в каталог tests/Feature
:
php artisan make:test UserTest
Если вы хотите создать тест в каталоге tests/Unit
, вы можете использовать параметр --unit
при выполнении команды make:test
:
php artisan make:test UserTest --unit
{tip} Заготовки тестов можно настроить с помощью публикации заготовок.
После того, как тест был сгенерирован, вы можете определить методы тестирования, как обычно, используя 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);
}
}
{note} Если вы определяете свои собственные методы
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 выполняют ваши тесты последовательно в рамках одного процесса. Однако вы можете значительно сократить время, необходимое для запуска тестов, за счет одновременного выполнения тестов в нескольких процессах. Для начала добавьте параметр --parallel
при выполнении команды test
Artisan:
php artisan test --parallel
По умолчанию Laravel создает столько процессов, сколько ядер ЦП доступно на вашем компьютере. Однако вы можете настроить количество процессов, используя параметр --processes
:
php artisan test --parallel --processes=4
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\ParallelTesting;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Загрузка любых служб приложения.
*
* @return void
*/
public function boot()
{
ParallelTesting::setUpProcess(function ($token) {
// ..
});
ParallelTesting::setUpTestCase(function ($token, $testCase) {
// ..
});
ParallelTesting::tearDownTestCase(function ($token, $testCase) {
// ..
});
ParallelTesting::tearDownProcess(function ($token) {
// ..
});
}
}
Если вы хотите получить доступ к токену текущего процесса из любого другого места в коде теста вашего приложения, то вы можете использовать метод token
:
$token = ParallelTesting::token();