Версия фреймворка: 8.x 5.4 4.2
Это скорректированный автоматический перевод, сделанный при помощи google translate.

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

Введение

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.testing в корне вашего проекта. Этот файл будет использоваться вместо .env при запуске тестов PHPUnit или выполнении команд Artisan с параметром --env=testing.

Трейт CreatesApplication

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
Заготовки тестов можно настроить с помощью публикации заготовок.

После того, как тест был сгенерирован, вы можете определить методы тестирования, как обычно, используя 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 выполняют ваши тесты последовательно в рамках одного процесса. Однако вы можете значительно сократить время, необходимое для запуска тестов, за счет одновременного выполнения тестов в нескольких процессах. Для начала добавьте параметр --parallel при выполнении команды test Artisan:

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();