Тестування: Початок роботи

Вступ

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

За замовчуванням, директорія tests вашого застосунку містить дві директорії: Feature та Unit. Юніт-тести — це тести, які зосереджені на дуже малій, ізольованій частині вашого коду. Насправді, більшість юніт-тестів, ймовірно, зосереджені на одному методі. Тести в директорії "Unit" не запускають ваш застосунок Laravel і, отже, не можуть отримати доступ до бази даних вашого застосунку або інших сервісів фреймворку.

Тестування функціоналу може перевіряти більшу частину вашого коду, включаючи те, як кілька об'єктів взаємодіють один з одним або навіть повний HTTP-запит до JSON-ендпоінту. Загалом, більшість ваших тестів повинні бути тестами функціоналу. Ці типи тестів надають найбільшу впевненість у тому, що ваша система в цілому функціонує як задумано.

Файл ExampleTest.php надається як у директорії Feature, так і в директорії Unit тестів. Після встановлення нового Laravel застосунку виконайте команди vendor/bin/pest, vendor/bin/phpunit або php artisan test для запуску ваших тестів.

Середовище

Коли виконуються тести, Laravel автоматично встановить конфігураційне середовище на testing через змінні середовища, визначені у файлі phpunit.xml. Laravel також автоматично налаштовує сесію та кеш на драйвер array, щоб жодні дані сесії або кешу не зберігалися під час тестування.

Ви можете вільно визначати інші значення конфігурації тестового середовища за потреби. Змінні середовища testing можуть бути налаштовані у файлі phpunit.xml вашого застосунку, але переконайтеся, що очистили кеш конфігурації за допомогою команди Artisan config:clear перед запуском ваших тестів!

Файл середовища .env.testing

Крім того, ви можете створити файл .env.testing у корені вашого проекту. Цей файл буде використовуватися замість файлу .env при запуску тестів Pest і PHPUnit або виконанні команд Artisan з опцією --env=testing.

Створення Тестів

Щоб створити новий тестовий випадок, використовуйте команду Artisan make:test. За замовчуванням тести будуть розміщені в каталозі tests/Feature:

php artisan make:test UserTest

Якщо ви хочете створити тест у каталозі tests/Unit, ви можете використовувати опцію --unit при виконанні команди make:test:

php artisan make:test UserTest --unit

Тестові заглушки можуть бути налаштовані за допомогою публікації заглушок.

Після того, як тест було згенеровано, ви можете визначити тест, як зазвичай, використовуючи Pest або PHPUnit. Щоб запустити ваші тести, виконайте команду vendor/bin/pest, vendor/bin/phpunit або php artisan test у вашому терміналі:

<?php
 
test('basic', function () {
expect(true)->toBeTrue();
});
<?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.

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

Як згадувалося раніше, після того як ви написали тести, ви можете запустити їх за допомогою pest або phpunit:

./vendor/bin/pest
./vendor/bin/phpunit

На додаток до команд pest або phpunit, ви можете використовувати команду Artisan test для запуску ваших тестів. Тестовий запуск Artisan надає детальні звіти про тести, щоб полегшити розробку та налагодження:

php artisan test

Будь-які аргументи, які можуть бути передані командам pest або phpunit, також можуть бути передані команді Artisan test:

php artisan test --testsuite=Feature --stop-on-failure

Запуск тестів паралельно

За замовчуванням, Laravel та Pest / 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

Коли тести виконуються паралельно, деякі опції Pest / 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

Паралельне тестування з Hook'ами

Іноді вам може знадобитися підготувати певні ресурси, які використовуються тестами вашого застосунку, щоб їх можна було безпечно використовувати кількома процесами тестування.

Використовуючи фасад 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