تست پایگاه داده
- معرفی
- کارخانه های تولید کننده
- تنظیم مجدد پایگاه داده پس از هر تست
- کارخانه های نوشتن
- استفاده از کارخانه ها
- استفاده از دانه ها
- ادعاهای موجود
معرفی
لاراول انواع مختلفی از ابزارهای مفید را برای آزمایش برنامه های کاربردی
مبتنی بر پایگاه داده شما فراهم می کند.
ابتدا، میتوانید از
assertDatabaseHas
راهنما استفاده کنید تا ادعا کنید که دادهها در پایگاه داده مطابق با
مجموعه معینی از معیارها وجود دارد.
به عنوان مثال، اگر می خواهید بررسی کنید که یک رکورد در
users
جدول با
email
مقدار وجود دارد
sally@example.com
، می توانید موارد زیر را انجام دهید:
public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com', ]);}
همچنین می توانید از
assertDatabaseMissing
کمک کننده استفاده کنید تا ادعا کنید که داده در پایگاه داده وجود ندارد.
این
assertDatabaseHas
روش و سایر کمک های مشابه آن برای راحتی است.
شما آزاد هستید که از هر یک از روش های ادعایی داخلی PHPUnit برای تکمیل تست
های ویژگی خود استفاده کنید.
کارخانه های تولید کننده
برای ایجاد یک کارخانه، از
make:factory
دستور Artisan
استفاده کنید :
php artisan make:factory PostFactory
کارخانه جدید در
database/factories
دایرکتوری شما قرار می گیرد.
این
--model
گزینه ممکن است برای نشان دادن نام مدل ایجاد شده توسط کارخانه استفاده شود.
این گزینه فایل کارخانه تولید شده را با مدل داده شده از قبل پر می کند:
php artisan make:factory PostFactory --model=Post
تنظیم مجدد پایگاه داده پس از هر تست
اغلب مفید است که پایگاه داده خود را پس از هر آزمون بازنشانی کنید تا داده
های آزمایش قبلی با آزمایش های بعدی تداخل نداشته باشند.
این
RefreshDatabase
ویژگی بسته به اینکه از یک پایگاه داده در حافظه استفاده می کنید یا یک
پایگاه داده سنتی، بهینه ترین رویکرد را برای انتقال پایگاه داده آزمایشی شما اتخاذ می کند.
از این ویژگی در کلاس آزمایشی خود استفاده کنید و همه چیز برای شما انجام می
شود:
<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase;use Illuminate\Foundation\Testing\WithoutMiddleware;use Tests\TestCase; class ExampleTest extends TestCase{ use RefreshDatabase; /** * A basic functional test example. * * @return void */ public function testBasicExample() { $response = $this->get('/'); // ... }}
کارخانه های نوشتن
هنگام آزمایش، ممکن است لازم باشد قبل از اجرای آزمایش، چند رکورد را در
پایگاه داده خود وارد کنید.
به جای تعیین دستی مقدار هر ستون هنگام ایجاد این داده های آزمایشی، لاراول
به شما اجازه می دهد تا با استفاده از کارخانه های مدل، مجموعه ای از ویژگی های پیش فرض را برای هر یک از
مدل های Eloquent
خود تعریف کنید .
برای شروع، به
database/factories/UserFactory.php
فایل موجود در برنامه خود نگاهی بیندازید.
خارج از جعبه، این فایل حاوی یک تعریف کارخانه است:
use Faker\Generator as Faker;use Illuminate\Support\Str; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ];});
در بسته شدن، که به عنوان تعریف کارخانه عمل می کند، می توانید مقادیر آزمایشی پیش فرض همه ویژگی های مدل را برگردانید. بسته شدن نمونه ای از کتابخانه PHP Faker را دریافت می کند که به شما امکان می دهد انواع مختلفی از داده های تصادفی را برای آزمایش به راحتی تولید کنید.
همچنین می توانید برای سازماندهی بهتر، فایل های کارخانه ای اضافی برای هر
مدل ایجاد کنید.
به عنوان مثال، می توانید
UserFactory.php
فایل
CommentFactory.php
هایی را در
database/factories
دایرکتوری خود ایجاد کنید.
تمام فایل های داخل
factories
دایرکتوری به طور خودکار توسط لاراول بارگذاری می شوند.
می توانید با افزودن گزینه ای به فایل پیکربندی
faker_locale
خود، محلی Faker را تنظیم کنید .config/app.php
گسترش کارخانه ها
اگر مدلی را توسعه داده اید، ممکن است بخواهید کارخانه آن را نیز گسترش دهید
تا از ویژگی های کارخانه مدل فرزند در طول آزمایش و بذر استفاده کنید.
برای انجام این کار، میتوانید روش کارخانه سازنده را فراخوانی کنید
raw
تا آرایه خام ویژگیها را از هر کارخانه معین به دست آورید:
$factory->define(App\Admin::class, function (Faker\Generator $faker) { return factory(App\User::class)->raw([ // ... ]);});
ایالات کارخانه
ایالت ها به شما اجازه می دهند تا تغییرات گسسته ای را تعریف کنید که می
تواند در کارخانه های مدل شما در هر ترکیبی اعمال شود.
User
به عنوان مثال، مدل
شما ممکن است
delinquent
حالتی داشته باشد که یکی از مقادیر مشخصه پیش فرض آن را تغییر دهد.
شما می توانید تبدیل حالت خود را با استفاده از
state
روش تعریف کنید.
برای حالت های ساده، می توانید آرایه ای از تغییرات ویژگی را ارسال کنید:
$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent',]);
اگر حالت شما نیاز به محاسبه یا یک
$faker
نمونه دارد، می توانید از Closure برای محاسبه تغییرات ویژگی حالت استفاده
کنید:
$factory->state(App\User::class, 'address', function ($faker) { return [ 'address' => $faker->address, ];});
تماس های کارخانه ای
afterMaking
تماسهای کارخانه با استفاده از روشهای و
ثبت میشوند
afterCreating
و به شما اجازه میدهند تا پس از ساخت یا ایجاد یک مدل، کارهای بیشتری را
انجام دهید.
به عنوان مثال، می توانید از callbacks برای ارتباط مدل های اضافی به مدل
ایجاد شده استفاده کنید:
$factory->afterMaking(App\User::class, function ($user, $faker) { // ...}); $factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make());});
همچنین میتوانید تماسهای برگشتی را برای حالتهای کارخانه تعریف کنید :
$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ...}); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ...});
استفاده از کارخانه ها
ایجاد مدل ها
هنگامی که کارخانههای خود را تعریف کردید، میتوانید از
factory
تابع سراسری در آزمایشهای ویژگی یا فایلهای seed خود برای تولید نمونههای
مدل استفاده کنید.
بنابراین، اجازه دهید نگاهی به چند نمونه از ایجاد مدل بیندازیم.
ابتدا از روش برای ایجاد مدل ها استفاده می کنیم
make
اما آنها را در پایگاه داده ذخیره نمی کنیم:
public function testDatabase(){ $user = factory(App\User::class)->make(); // Use model in tests...}
همچنین میتوانید مجموعهای از مدلهای زیادی ایجاد کنید یا مدلهایی از یک نوع خاص ایجاد کنید:
// Create three App\User instances...$users = factory(App\User::class, 3)->make();
کشورهای متقاضی
همچنین می توانید هر یک از حالت های خود را در مدل ها اعمال کنید. اگر می خواهید چندین تبدیل حالت را به مدل ها اعمال کنید، باید نام هر حالتی را که می خواهید اعمال کنید، مشخص کنید:
$users = factory(App\User::class, 5)->states('delinquent')->make(); $users = factory(App\User::class, 5)->states('premium', 'delinquent')->make();
ویژگی های برتر
اگر میخواهید برخی از مقادیر پیشفرض مدلهای خود را لغو کنید، میتوانید
آرایهای از مقادیر را به
make
متد ارسال کنید.
فقط مقادیر مشخص شده جایگزین می شوند در حالی که بقیه مقادیر روی مقادیر پیش
فرض خود که توسط کارخانه مشخص شده است تنظیم می شوند:
$user = factory(App\User::class)->make([ 'name' => 'Abigail',]);
هنگام ایجاد مدلها با استفاده از کارخانه ، حفاظت از تخصیص انبوه به طور خودکار غیرفعال میشود.
مدل های ماندگار
این
create
روش نه تنها نمونه های مدل را ایجاد می کند، بلکه آنها را با استفاده از روش
Eloquent در پایگاه داده ذخیره می کند
save
:
public function testDatabase(){ // Create a single App\User instance... $user = factory(App\User::class)->create(); // Create three App\User instances... $users = factory(App\User::class, 3)->create(); // Use model in tests...}
میتوانید با ارسال یک آرایه به متد، ویژگیهای مدل را لغو کنید
create
:
$user = factory(App\User::class)->create([ 'name' => 'Abigail',]);
روابط
در این مثال، ما یک رابطه را به برخی از مدل های ایجاد شده پیوست می کنیم.
هنگام استفاده از
create
روش برای ایجاد چندین مدل، یک
نمونه مجموعه
Eloquent برگردانده می شود که به شما امکان می دهد از هر یک از توابع راحت
ارائه شده توسط مجموعه استفاده کنید، مانند
each
:
$users = factory(App\User::class, 3) ->create() ->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); });
می توانید از
createMany
روش برای ایجاد چندین مدل مرتبط استفاده کنید:
$user->posts()->createMany( factory(App\Post::class, 3)->make()->toArray());
بسته شدن روابط و ویژگی
همچنین میتوانید روابطی را به مدلها در تعاریف کارخانه خود متصل کنید.
به عنوان مثال، اگر می خواهید
User
هنگام ایجاد یک نمونه جدید ایجاد کنید
Post
، می توانید موارد زیر را انجام دهید:
$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => factory(App\User::class), ];});
اگر این رابطه به کارخانه ای که آن را تعریف می کند بستگی دارد، می توانید یک callback ارائه دهید که آرایه ویژگی ارزیابی شده را می پذیرد:
$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => factory(App\User::class), 'user_type' => function (array $post) { return App\User::find($post['user_id'])->type; }, ];});
استفاده از دانه ها
اگر میخواهید
از کاشتهای پایگاه داده
برای پر کردن پایگاه داده خود در طول آزمایش ویژگی استفاده کنید، میتوانید
از این
seed
روش استفاده کنید.
بهطور پیشفرض، این
seed
متد، را برمیگرداند
DatabaseSeeder
که باید همه بذرهای دیگر شما را اجرا کند.
از طرف دیگر، شما یک نام کلاس seeder خاص را به
seed
متد ارسال می کنید:
<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase;use Illuminate\Foundation\Testing\WithoutMiddleware;use OrderStatusSeeder;use Tests\TestCase; class ExampleTest extends TestCase{ use RefreshDatabase; /** * Test creating a new order. * * @return void */ public function testCreatingANewOrder() { // Run the DatabaseSeeder... $this->seed(); // Run a single seeder... $this->seed(OrderStatusSeeder::class); // ... }}
ادعاهای موجود
لاراول چندین ادعای پایگاه داده را برای تست های ویژگی PHPUnit شما ارائه می دهد :
روش | شرح |
---|---|
$this->assertDatabaseCount($table, int $count); |
ادعا کنید که یک جدول در پایگاه داده حاوی مقدار مشخصی از ورودی ها است. |
$this->assertDatabaseHas($table, array $data); |
ادعا کنید که یک جدول در پایگاه داده حاوی داده های داده شده است. |
$this->assertDatabaseMissing($table, array $data); |
ادعا کنید که یک جدول در پایگاه داده حاوی داده های داده شده نیست. |
$this->assertDeleted($table, array $data); |
ادعا کنید که رکورد داده شده حذف شده است. |
$this->assertSoftDeleted($table, array $data); |
ادعا کنید که رکورد داده شده به نرمی حذف شده است. |
برای راحتی کار، میتوانید مدلی را به
assertDeleted
و
assertSoftDeleted
helpers ارسال کنید تا به ترتیب از پایگاه داده بر اساس کلید اصلی مدل،
رکورد حذف شده یا نرمافزار حذف شود.
به عنوان مثال، اگر از یک کارخانه مدل سازی در تست خود استفاده می کنید، می توانید این مدل را به یکی از این کمک کنندگان ارسال کنید تا برنامه شما را به درستی حذف شده از پایگاه داده آزمایش کند:
public function testDatabase(){ $user = factory(App\User::class)->create(); // Make call to application... $this->assertDeleted($user);}