Тестування бази даних
Вступ
Laravel надає різноманітні корисні інструменти та твердження, щоб полегшити тестування ваших застосунків, що працюють з базою даних. Крім того, фабрики моделей Laravel та сидери роблять створення тестових записів у базі даних безболісним, використовуючи моделі Eloquent вашого застосунку та зв'язки. Ми обговоримо всі ці потужні функції в наступній документації.
Скидання бази даних після кожного тесту
Перш ніж рухатися далі, давайте обговоримо, як скинути вашу базу даних після кожного з ваших тестів, щоб дані з попереднього тесту не заважали наступним тестам. Включена в Laravel властивість Illuminate\Foundation\Testing\RefreshDatabase подбає про це за вас. Просто використовуйте цю властивість у вашому тестовому класі:
<?php
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('basic example', function () {
$response = $this->get('/');
// ...
});
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* A basic functional test example.
*/
public function test_basic_example(): void
{
$response = $this->get('/');
// ...
}
}
Трейт Illuminate\Foundation\Testing\RefreshDatabase не мігрує вашу базу даних, якщо ваша схема актуальна. Натомість, він лише виконає тест у межах транзакції бази даних. Тому будь-які записи, додані до бази даних тестовими випадками, які не використовують цей трейт, можуть все ще існувати в базі даних.
Якщо ви хочете повністю скинути базу даних, ви можете використовувати трейти Illuminate\Foundation\Testing\DatabaseMigrations або Illuminate\Foundation\Testing\DatabaseTruncation. Однак обидва ці варіанти значно повільніші, ніж трейт RefreshDatabase.
Фабрики Моделей
Коли тестуєте, вам може знадобитися вставити кілька записів у вашу базу даних перед виконанням тесту. Замість того, щоб вручну вказувати значення кожного стовпця при створенні цих тестових даних, Laravel дозволяє визначити набір атрибутів за замовчуванням для кожної з ваших Eloquent моделей за допомогою фабрик моделей.
Щоб дізнатися більше про створення та використання фабрик моделей для створення моделей, будь ласка, ознайомтеся з повною документацією фабрик моделей. Після того, як ви визначили фабрику моделі, ви можете використовувати фабрику у вашому тесті для створення моделей:
use App\Models\User;
test('models can be instantiated', function () {
$user = User::factory()->create();
// ...
});
use App\Models\User;
public function test_models_can_be_instantiated(): void
{
$user = User::factory()->create();
// ...
}
Запуск Наповнювачів
Якщо ви хочете використовувати засівники бази даних для заповнення вашої бази даних під час функціонального тесту, ви можете викликати метод seed. За замовчуванням, метод seed виконає DatabaseSeeder, який повинен виконати всі ваші інші засівники. Альтернативно, ви можете передати конкретне ім'я класу засівника методу seed:
<?php use Database\Seeders\OrderStatusSeeder; use Database\Seeders\TransactionStatusSeeder; use Illuminate\Foundation\Testing\RefreshDatabase; uses(RefreshDatabase::class); test('orders can be created', function () { // Запустити DatabaseSeeder... $this->seed(); // Запустити конкретний наповнювач... $this->seed(OrderStatusSeeder::class); // ... // Запустити масив конкретних наповнювачів... $this->seed([ OrderStatusSeeder::class, TransactionStatusSeeder::class, // ... ]); });
<?php namespace Tests\Feature; use Database\Seeders\OrderStatusSeeder; use Database\Seeders\TransactionStatusSeeder; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { use RefreshDatabase; /** * Test creating a new order. */ public function test_orders_can_be_created(): void { // Run the DatabaseSeeder... $this->seed(); // Run a specific seeder... $this->seed(OrderStatusSeeder::class); // ... // Run an array of specific seeders... $this->seed([ OrderStatusSeeder::class, TransactionStatusSeeder::class, // ... ]); } }
Альтернативно, ви можете вказати Laravel автоматично засівати базу даних перед кожним тестом, який використовує трейт RefreshDatabase. Ви можете досягти цього, визначивши властивість $seed у вашому базовому класі тестування:
<?php namespace Tests; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { /** * Вказує, чи повинен запускатися типовий наповнювач перед кожним тестом. * * @var bool */ protected $seed = true; }
Коли властивість $seed має значення true, тест виконуватиме клас Database\Seeders\DatabaseSeeder перед кожним тестом, що використовує трейд RefreshDatabase. Однак, ви можете вказати конкретний наповнювач, який слід виконати, визначивши властивість $seeder у вашому тестовому класі:
use Database\Seeders\OrderStatusSeeder; /** * Запускати конкретний наповнювач перед кожним тестом. * * @var string */ protected $seeder = OrderStatusSeeder::class;
Доступні Твердження
Laravel надає кілька тверджень для бази даних для ваших тестів функцій Pest або PHPUnit. Ми обговоримо кожне з цих тверджень нижче.
assertDatabaseCount
Переконайтеся, що таблиця в базі даних містить задану кількість записів:
$this->assertDatabaseCount('users', 5);
assertDatabaseEmpty
Переконайтеся, що таблиця в базі даних не містить записів:
$this->assertDatabaseEmpty('users');
assertDatabaseHas
Переконайтеся, що таблиця в базі даних містить записи, які відповідають заданим обмеженням запиту ключ / значення:
$this->assertDatabaseHas('users', [
'email' => 'example@example.com',
]);
assertDatabaseMissing
Переконайтеся, що таблиця в базі даних не містить записів, які відповідають заданим обмеженням запиту ключа/значення:
$this->assertDatabaseMissing('users', [
'email' => 'example@example.com',
]);
assertSoftDeleted
Метод assertSoftDeleted може бути використаний для перевірки, що вказана модель Eloquent була "м'яко видалена":
$this->assertSoftDeleted($user);
assertNotSoftDeleted
Метод assertNotSoftDeleted може бути використаний для перевірки, що вказана модель Eloquent не була "м'яко видалена":
$this->assertNotSoftDeleted($user);
assertModelExists
Переконайтеся, що вказана модель існує в базі даних:
use App\Models\User;
$user = User::factory()->create();
$this->assertModelExists($user);
assertModelMissing
Переконайтеся, що вказана модель не існує в базі даних:
use App\Models\User;
$user = User::factory()->create();
$user->delete();
$this->assertModelMissing($user);
expectsDatabaseQueryCount
Метод expectsDatabaseQueryCount може бути викликаний на початку вашого тесту, щоб вказати загальну кількість запитів до бази даних, які ви очікуєте виконати під час тесту. Якщо фактична кількість виконаних запитів не точно відповідає цьому очікуванню, тест буде провалено:
$this->expectsDatabaseQueryCount(5); // Тест...
