Датасети · Pest
Набори даних (datasets) дають змогу описати масив тестових даних, і Pest автоматично запустить той самий тест для кожного набору. Це економить час і зусилля, бо не доводиться вручну повторювати той самий тест з різними даними.
it('has emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with(['enunomaduro@gmail.com', 'other@example.com']);
Під час запуску тестів Pest автоматично додає до тестів із наборами даних інформативні описи, де перелічені використані параметри. Це допомагає зрозуміти дані й знайти причину, якщо тест впаде.
Ви також можете передати кілька аргументів, надавши масив, що містить масиви аргументів.
it('has emails', function (string $name, string $email) {
expect($email)->not->toBeEmpty();
})->with([
['Nuno', 'enunomaduro@gmail.com'],
['Other', 'other@example.com']
]);
Щоб вручну додати власний опис до значення набору даних, достатньо призначити йому ключ.
it('has emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with([
'james' => 'james@laravel.com',
'taylor' => 'taylor@laravel.com',
]);
Якщо ключ додано, Pest використає його, коли формуватиме опис тесту.
Якщо назва тесту містить :dataset, опис буде підставлено в назву тесту саме в цьому місці.
✓ it validates the "first_name" field
✓ it validates the "email" field
Зверніть увагу: коли ви використовуєте closures у наборі даних, потрібно оголосити типи аргументів у замиканні, переданому тестовій функції.
it('can sum', function (int $a, int $b, int $result) {
expect(sum($a, $b))->toBe($result);
})->with([
'positive numbers' => [1, 2, 3],
'negative numbers' => [-1, -2, -3],
'using closure' => [fn () => 1, 2, 3],
]);
Для більших або складніших сценаріїв можна використати замикання.
// Повертаємо масив
test('The array contains only integers', function ($i) {
expect($i)->toBeInt();
})->with(fn (): array => range(1, 99));
// Використовуємо генератор
test('The generator produces only integers', function ($i) {
expect($i)->toBeInt();
})->with(function (): Generator {
for ($i = 1 ; $i < 100_000_000_000 ; $i++) {
yield $i;
}
});
Привʼязані набори даних
Привʼязані набори даних (bound datasets) у Pest дають набір, який резолвиться після методу beforeEach() ваших тестів. Це особливо зручно в Laravel-застосунках (як і в будь-якій іншій інтеграції з Pest), коли вам потрібен набір моделей App\Models\User, створених уже після того, як beforeEach() підготував схему бази даних.
it('can generate the full name of a user', function (User $user) {
expect($user->full_name)->toBe("{$user->first_name} {$user->last_name}");
})->with([
fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']),
fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']),
fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']),
]);
За потреби до тест-кейсу можна привʼязати й один окремий аргумент. Проте Pest вимагає, щоб він був повністю типізований в аргументах функції it|test.
-it('can generate the full name of a user', function ($user, $fullName) {
+it('can generate the full name of a user', function (User $user, $fullName) {
expect($user->full_name)->toBe($fullName);
})->with([
[fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']), 'Nuno Maduro'],
[fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']), 'Luke Downing'],
[fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']), 'Freek Van Der Herten'],
]);
Спільні набори даних
Якщо зберігати набори даних окремо, у теці tests/Datasets, їх легко відрізнити від коду тестів, і вони не захаращують основні тестові файли.
// tests/Unit/ExampleTest.php...
it('has emails', function (string $email) {
expect($email)->not->toBeEmpty();
-})->with(['enunomaduro@gmail.com', 'other@example.com']);
+})->with('emails');
// tests/Datasets/Emails.php...
+dataset('emails', [
+ 'enunomaduro@gmail.com',
+ 'other@example.com'
+]);
Привʼязані набори, ключі з описами та інші правила, які діють для вбудованих наборів даних, так само застосовні й до спільних.
Обмежені за областю набори даних
Буває, що набір даних стосується лише певної функціональності або групи тек. У такому разі замість того, щоб розкладати його глобально в теці Datasets, можна створити файл Datasets.php усередині потрібної теки й обмежити область дії набору даних лише цією текою.
// tests/Feature/Products/ExampleTest.php...
it('has products', function (string $product) {
expect($product)->not->toBeEmpty();
})->with('products');
// tests/Feature/Products/Datasets.php...
dataset('products', [
'egg',
'milk'
]);
Комбінування наборів даних
Складні набори даних легко отримати, поєднавши вбудовані (inline) та спільні (shared) набори. При цьому набори комбінуються за принципом декартового добутку.
У прикладі нижче ми перевіряємо, що всі вказані заклади зачинені в кожен із наведених днів тижня.
dataset('days_of_the_week', [
'Saturday',
'Sunday',
]);
test('business is closed on day', function(string $business, string $day) {
expect(new $business)->isClosed($day)->toBeTrue();
})->with([
Office::class,
Bank::class,
School::class
])->with('days_of_the_week');
Після запуску цього прикладу у виводі Pest буде опис кожної перевіреної комбінації.
Повторення тестів
Інколи тест треба прогнати кілька разів: для налагодження або щоб переконатися в його стабільності. Для таких випадків є метод repeat(), який повторює тест задану кількість разів.
it('can repeat a test', function () {
$result = /** Якийсь код, що може бути нестабільним */;
expect($result)->toBeTrue();
})->repeat(100); // Повторити тест 100 разів
Опанувавши набори даних у тестуванні, наступний важливий крок - розібратися, як тестувати винятки. Ідеться про перевірку того, що ваш код поводиться правильно й кидає відповідні винятки, коли отримує несподівані або помилкові вхідні дані: Винятки →
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.