تست پایگاه داده
معرفی
لاراول انواع ابزارها و ادعاهای مفیدی را ارائه می دهد تا آزمایش برنامه های کاربردی مبتنی بر پایگاه داده شما را آسان تر کند. علاوه بر این، کارخانهها و کاشتهای مدل لاراول، ایجاد رکوردهای پایگاه داده آزمایشی را با استفاده از مدلها و روابط 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...