نسخه:

تست پایگاه داده

معرفی

لاراول انواع ابزارها و ادعاهای مفیدی را ارائه می دهد تا آزمایش برنامه های کاربردی مبتنی بر پایگاه داده شما را آسان تر کند. علاوه بر این، کارخانه‌ها و کاشت‌های مدل لاراول، ایجاد رکوردهای پایگاه داده آزمایشی را با استفاده از مدل‌ها و روابط Eloquent برنامه شما بدون دردسر می‌سازند. در مستندات زیر به همه این ویژگی های قدرتمند خواهیم پرداخت.

تنظیم مجدد پایگاه داده پس از هر تست

قبل از اینکه خیلی بیشتر ادامه دهیم، بیایید در مورد نحوه تنظیم مجدد پایگاه داده خود پس از هر یک از آزمایشات خود بحث کنیم تا داده های آزمایش قبلی با آزمایش های بعدی تداخل نداشته باشند. ویژگی گنجانده شده لاراول 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 ویژگی هستند.

کارخانه های مدل

هنگام آزمایش، ممکن است لازم باشد قبل از اجرای آزمایش، چند رکورد را در پایگاه داده خود وارد کنید. به جای تعیین دستی مقدار هر ستون هنگام ایجاد این داده های آزمایشی، لاراول به شما امکان می دهد مجموعه ای از ویژگی های پیش فرض را برای هر یک از مدل های 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 ، که باید همه بذرهای دیگر شما را اجرا کند. از طرف دیگر، شما یک نام کلاس seeder خاص را به seed متد ارسال می کنید:

<?php
 
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
 
uses(RefreshDatabase::class);
 
test('orders can be created', function () {
// 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,
// ...
]);
});
<?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,
// ...
]);
}
}

از طرف دیگر، می‌توانید به لاراول دستور دهید قبل از هر آزمایشی که از این RefreshDatabase ویژگی استفاده می‌کند، پایگاه داده را به‌طور خودکار بذر کند. شما می توانید این کار را با تعریف یک $seed ویژگی در کلاس تست پایه خود انجام دهید:

<?php
 
namespace Tests;
 
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
 
abstract class TestCase extends BaseTestCase
{
/**
* Indicates whether the default seeder should run before each test.
*
* @var bool
*/
protected $seed = true;
}

زمانی که $seed ویژگی باشد true ، تست Database\Seeders\DatabaseSeeder قبل از هر تستی که از این RefreshDatabase صفت استفاده می کند، کلاس را اجرا می کند. با این حال، می توانید یک seder خاص را مشخص کنید که باید با تعریف یک $seeder ویژگی در کلاس آزمایشی خود اجرا شود:

use Database\Seeders\OrderStatusSeeder;
 
/**
* Run a specific seeder before each test.
*
* @var string
*/
protected $seeder = OrderStatusSeeder::class;

ادعاهای موجود

لاراول چندین ادعای پایگاه داده را برای تست های ویژگی Pest یا PHPUnit شما ارائه می دهد . در زیر به هر یک از این ادعاها خواهیم پرداخت.

assertDatabaseCount

ادعا کنید که یک جدول در پایگاه داده حاوی تعداد داده شده رکورد است:

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

assertDatabaseHas

ادعا کنید که یک جدول در پایگاه داده حاوی رکوردهایی است که با قیود کلید/مقدار داده شده مطابقت دارند:

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

assertDatabase Missing

ادعا کنید که یک جدول در پایگاه داده حاوی رکوردهای منطبق با محدودیت های پرس و جو کلید / مقدار نیست:

$this->assertDatabaseMissing('users', [
'email' => 'sally@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);

assertModel Missing

ادعا کنید که یک مدل داده شده در پایگاه داده وجود ندارد:

use App\Models\User;
 
$user = User::factory()->create();
 
$user->delete();
 
$this->assertModelMissing($user);

expectsDatabaseQueryCount

این expectsDatabaseQueryCount روش ممکن است در ابتدای آزمون شما برای تعیین تعداد کل کوئری های پایگاه داده ای که انتظار دارید در طول آزمایش اجرا شوند، فراخوانی شود. اگر تعداد واقعی کوئری‌های اجرا شده دقیقاً با این انتظار مطابقت نداشته باشد، آزمون با شکست مواجه می‌شود:

$this->expectsDatabaseQueryCount(5);
 
// Test...