مارک پلاس

تکنولوژی نوین اینترنتی

تست‌های واحد(Unit Tests) لاراول

دسته‌بندی‌ها

تست‌های واحد(Unit Tests) لاراول

📜 تست‌های واحد(Unit Tests) لاراول


تست‌های واحد (Unit Tests) به‌طور خاص برای آزمایش عملکرد و صحت بخش‌های کوچک و مستقل از برنامه مانند متدها و توابع نوشته می‌شوند. این تست‌ها معمولاً برای اطمینان از این که هر بخش از کد به‌درستی عمل می‌کند، استفاده می‌شوند.

لاراول به‌طور پیش‌فرض ابزار PHPUnit را برای نوشتن و اجرای تست‌های واحد فراهم کرده است. در این مقاله، نحوه نوشتن و اجرای تست‌های واحد در لاراول را بررسی خواهیم کرد.


1. 🛠 نصب و تنظیم PHPUnit در لاراول

لاراول به‌طور پیش‌فرض PHPUnit را به‌عنوان ابزاری برای تست‌ها پیکربندی کرده است. به‌طور معمول، پس از نصب لاراول، PHPUnit به‌طور خودکار در پروژه شما نصب می‌شود. شما می‌توانید از فایل phpunit.xml در ریشه پروژه برای پیکربندی تست‌های خود استفاده کنید.

برای نصب یا به‌روزرسانی PHPUnit، می‌توانید دستور زیر را اجرا کنید:

bash
composer require --dev phpunit/phpunit

بعد از نصب، شما می‌توانید با استفاده از دستور زیر تست‌ها را اجرا کنید:

bash
php artisan test

2. 🧑‍💻 نوشتن تست‌های واحد در لاراول

برای نوشتن تست‌های واحد، ابتدا باید یک کلاس تست ایجاد کنید. لاراول این امکان را به شما می‌دهد که از دستور artisan برای ایجاد کلاس‌های تست استفاده کنید.

2.1. ایجاد کلاس تست

برای ایجاد یک تست واحد برای یک کلاس خاص (مثلاً برای مدل User)، می‌توانید از دستور artisan make:test استفاده کنید:

bash
php artisan make:test UserTest

این دستور یک کلاس جدید تست در مسیر tests/Feature یا tests/Unit (بسته به نوع تست) ایجاد می‌کند.

2.2. ساخت یک تست ساده

در ادامه، یک تست ساده برای چک کردن اعتبار یک متد فرضی در مدل User خواهیم نوشت. فرض کنید شما یک متد به نام isActive() در مدل User دارید که بررسی می‌کند آیا کاربر فعال است یا خیر.

مثال:

php
// مدل User class User extends Authenticatable { public function isActive() { return $this->status === 'active'; } }

حالا برای تست این متد، در کلاس UserTest می‌نویسیم:

php
namespace Tests\Unit; use Tests\TestCase; use App\Models\User; class UserTest extends TestCase { /** * تست متد isActive * * @return void */ public function test_is_active_method() { // ایجاد یک کاربر با وضعیت فعال $user = new User(['status' => 'active']); // بررسی نتیجه متد isActive $this->assertTrue($user->isActive()); // ایجاد یک کاربر با وضعیت غیرفعال $user = new User(['status' => 'inactive']); // بررسی نتیجه متد isActive $this->assertFalse($user->isActive()); } }

در این تست، ما دو کاربر با وضعیت‌های مختلف ایجاد کرده‌ایم و سپس از متد assertTrue() و assertFalse() برای تأیید درستی عملکرد متد isActive() استفاده کرده‌ایم.


3. 🚀 اجرای تست‌های واحد

پس از نوشتن تست‌ها، می‌توانید آن‌ها را با استفاده از دستور زیر اجرا کنید:

bash
php artisan test

این دستور تمام تست‌های موجود در پوشه tests را اجرا کرده و نتایج را در کنسول نمایش می‌دهد.

3.1. اجرای تست‌های خاص

اگر بخواهید فقط یک تست خاص را اجرا کنید، می‌توانید نام تست یا کلاس تست مورد نظر را به دستور اضافه کنید:

bash
php artisan test --filter UserTest

این دستور فقط تست‌های موجود در کلاس UserTest را اجرا می‌کند.


4. 🧑‍🔧 تست‌های وابسته به دیتابیس

اگر در تست‌های خود از دیتابیس استفاده می‌کنید (مثل ایجاد یا به‌روزرسانی رکوردها)، لاراول این امکان را فراهم می‌کند که با استفاده از پایگاه‌داده‌های آزمایشی (in-memory database) یا تراکنش‌ها (transactions) این تست‌ها را ایزوله و سریع‌تر اجرا کنید.

4.1. استفاده از پایگاه‌داده در تست‌ها

لاراول به‌طور پیش‌فرض از یک پایگاه‌داده موقت برای تست‌ها استفاده می‌کند. شما می‌توانید این پایگاه‌داده را در فایل .env.testing تنظیم کنید.

برای مثال، در فایل phpunit.xml، می‌توانید این تنظیمات را اعمال کنید:

xml
<env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>

این کار باعث می‌شود که لاراول از پایگاه‌داده SQLite به‌صورت موقت استفاده کند.

4.2. استفاده از تراکنش‌ها برای ایزوله کردن تست‌ها

برای جلوگیری از تأثیر تغییرات انجام‌شده در دیتابیس روی تست‌های دیگر، می‌توانید از تراکنش‌ها استفاده کنید. لاراول به‌طور پیش‌فرض از تراکنش‌ها برای تست‌ها استفاده می‌کند.

php
public function test_user_can_be_created() { DB::beginTransaction(); // عملیات تست $user = User::create([ 'name' => 'John Doe', 'email' => 'john@example.com', 'password' => bcrypt('password123'), ]); $this->assertDatabaseHas('users', ['email' => 'john@example.com']); DB::rollBack(); // برگشت به وضعیت قبلی }

5. 🧩 مفاهیم پیشرفته در تست‌های واحد لاراول

5.1. Mocking و Stubbing

گاهی اوقات در تست‌ها، نیاز به شبیه‌سازی متدها و اشیاء دارید. لاراول ابزارهایی برای Mock کردن و Stub کردن متدها فراهم کرده است تا بتوانید رفتار آن‌ها را کنترل کنید.

مثال:

php
use Mockery; use App\Models\User; public function test_user_can_login() { $user = Mockery::mock(User::class); $user->shouldReceive('isActive')->andReturn(true); $this->assertTrue($user->isActive()); }

5.2. Test Coverage

تست پوشش (Test Coverage) برای بررسی درصد کدهایی که تحت تست قرار گرفته‌اند، استفاده می‌شود. برای اجرای تست پوشش در لاراول، می‌توانید از ابزارهایی مثل Xdebug یا PHP_CodeCoverage استفاده کنید.

5.3. تست‌های پارامتریک

در برخی موارد ممکن است نیاز داشته باشید که تست‌های خود را برای ورودی‌های مختلف اجرا کنید. برای این کار می‌توانید از تست‌های پارامتریک استفاده کنید.

php
/** * @dataProvider statusProvider */ public function test_is_active($status, $expected) { $user = new User(['status' => $status]); $this->assertEquals($expected, $user->isActive()); } public function statusProvider() { return [ ['active', true], ['inactive', false], ['banned', false], ]; }

نتیجه‌گیری

تست‌های واحد بخش مهمی از فرآیند توسعه نرم‌افزار هستند و در لاراول به‌طور ساده و کاربردی قابل پیاده‌سازی هستند. با استفاده از PHPUnit و ابزارهایی مانند Mocking و Stubbing، می‌توانید کد خود را به‌طور دقیق و ایزوله تست کنید. این کار به شما کمک می‌کند که مطمئن شوید که بخش‌های مختلف اپلیکیشن شما به‌درستی کار می‌کنند و به‌راحتی می‌توانید مشکلات و خطاها را شناسایی و برطرف کنید.

محتوای مرتبط

پست‌های مرتبط