Skip to content

Database Testing

Nguồn gốc: Bản dịch từ Database Testing

Giới thiệu (Introduction)

Laravel cung cấp nhiều công cụ và assertion hữu ích để test ứng dụng có sử dụng database. Kết hợp model factories và seeders giúp tạo bản ghi test dễ dàng sử dụng Eloquent models và relationships.

Reset Database sau mỗi Test

Sử dụng trait RefreshDatabase để đảm bảo data từ test trước không ảnh hưởng test sau:

php
<?php

use Illuminate\Foundation\Testing\RefreshDatabase;

pest()->use(RefreshDatabase::class);

test('basic example', function () {
    $response = $this->get('/');
    // ...
});
php
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    public function test_basic_example(): void
    {
        $response = $this->get('/');
        // ...
    }
}

RefreshDatabase không migrate nếu schema đã up-to-date — chỉ chạy test trong database transaction.

Thay thế khác (chậm hơn):

  • DatabaseMigrations — migrate lại mỗi test
  • DatabaseTruncation — truncate tất cả tables

Model Factories

Sử dụng Eloquent factories để tạo bản ghi test:

php
use App\Models\User;

$user = User::factory()->create();

Tạo nhiều bản ghi:

php
$users = User::factory()->count(3)->create();

Tùy chỉnh attributes:

php
$user = User::factory()->create([
    'name' => 'Abigail',
]);

Running Seeders

Chạy seeder trong test:

php
test('orders can be created', function () {
    $this->seed();
    // Hoặc seeder cụ thể:
    $this->seed(OrderStatusSeeder::class);
});
php
public function test_orders_can_be_created(): void
{
    $this->seed();
    $this->seed(OrderStatusSeeder::class);
}

Dùng $this->seed() không tham số → chạy DatabaseSeeder.

Trên RefreshDatabase, seed trước mỗi test tự động:

php
use Database\Seeders\OrderStatusSeeder;

pest()->use(RefreshDatabase::class);

// Tự seed trước mỗi test
beforeEach(function () {
    $this->seed(OrderStatusSeeder::class);
});

Available Assertions

Database Assertions

MethodMô tả
assertDatabaseCount($table, $count)Bảng có đúng số bản ghi
assertDatabaseHas($table, $data)Bảng chứa bản ghi khớp data
assertDatabaseMissing($table, $data)Bảng không chứa bản ghi khớp data
assertSoftDeleted($table, $data)Bản ghi đã soft delete
assertNotSoftDeleted($table, $data)Bản ghi chưa soft delete
assertModelExists($model)Model tồn tại trong database
assertModelMissing($model)Model không tồn tại

Ví dụ:

php
$this->assertDatabaseHas('users', [
    'email' => 'sally@example.com',
]);

$this->assertDatabaseMissing('users', [
    'email' => 'sally@example.com',
]);

$this->assertDatabaseCount('users', 5);

$this->assertSoftDeleted($user);
$this->assertModelExists($user);
$this->assertModelMissing($user);