Налаштування · Pest
Файл Pest.php - це конфігураційний файл, у якому описано налаштування вашого набору тестів. Він лежить у теці tests вашого проєкту і автоматично завантажується Pest під час запуску тестів. Хоча в ньому можна визначати глобальні хуки або власні очікування, основне його призначення - вказати базовий клас тесту, який використовується у вашому наборі тестів.
Коли ви працюєте з Pest, змінна $this, доступна всередині замикань, переданих у тестові функції, привʼязана до конкретного класу тест-кейсу, зазвичай це PHPUnit\Framework\TestCase. Завдяки цьому тести, написані у функціональному стилі Pest, мають доступ до нижчого рівня - API тверджень PHPUnit, що спрощує співпрацю з розробниками, які краще знають фреймворк PHPUnit.
it('has home', function () {
echo get_class($this); // \PHPUnit\Framework\TestCase
$this->assertTrue(true);
});
Проте ви можете повʼязати окрему теку або й увесь набір тестів з іншим базовим класом тест-кейсу і в такий спосіб змінити значення $this всередині тестів. Для цього скористайтеся функцією pest() і методом in() у вашому конфігураційному файлі Pest.php.
// tests/Pest.php
pest()->extend(Tests\TestCase::class)->in('Feature');
// tests/Feature/ExampleTest.php
it('has home', function () {
echo get_class($this); // \Tests\TestCase
});
Крім того, Pest підтримує glob-шаблони у методі in(). Це дозволяє задати кілька тек або файлів одним шаблоном. Glob-шаблони - це рядкові представлення, які можуть збігатися з різними шляхами до файлів, подібно до символів підстановки. Якщо ви не знайомі з glob-шаблонами, зверніться до посібника PHP тут.
// tests/Pest.php
pest()->extend(Tests\TestCase::class)->in('Feature/*Job*.php');
// Це застосує Tests\TestCase до всіх тестових файлів у теці "Feature", які містять "Job" в імені файлу.
Складніший приклад - використання шаблону, який збігається з кількома теками в різних модулях, із застосуванням кількох класів тест-кейсів і трейтів:
// tests/Pest.php
pest()
->extend(DuskTestCase::class)
->use(DatabaseMigrations::class)
->in('../Modules/*/Tests/Browser');
// Це застосує клас DuskTestCase і трейт DatabaseMigrations до всіх тестових файлів усередині теки "Browser" будь-якого модуля.
Будь-який метод, оголошений у вашому базовому класі тест-кейсу як public або protected, доступний усередині тестового замикання.
use PHPUnit\Framework\TestCase as BaseTestCase;
// tests/TestCase.php
class TestCase extends BaseTestCase
{
public function performThis(): void
{
//
}
}
// tests/Pest.php
pest()->extend(TestCase::class)->in('Feature');
// tests/Feature/ExampleTest.php
it('has home', function () {
$this->performThis();
});
Трейт можна привʼязати до тесту або теки так само, як і класи. Наприклад, у Laravel ви можете застосувати трейт RefreshDatabase, щоб скидати базу даних перед кожним тестом. Щоб підключити трейт до тесту, передайте його імʼя в метод pest()->use().
<?php
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
pest()->extend(TestCase::class)->use(RefreshDatabase::class)->in('Feature');
Щоб повʼязати конкретний тест із певним класом тест-кейсу або трейтом, скористайтеся методами pest()->extend() і pest()->use() усередині того конкретного тестового файлу, не використовуючи метод in().
pest()->extend(Tests\MySpecificTestCase::class);
it('has home', function () {
echo get_class($this); // \Tests\MySpecificTestCase
});
Далі: одна з можливостей, доступних під час налаштування набору тестів, - групування тек. Вона дозволяє фільтрувати запущені тести за допомогою опції --group: Групування тестів
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.