تستنویسی در Laravel چیست؟
تستنویسی در Laravel فرایندی است که در آن با نوشتن کدهایی مشخص، عملکرد بخشهای مختلف برنامه را بررسی میکنیم تا مطمئن شویم برنامه مطابق انتظار کار میکند.
فرض کنید یک فروشگاه اینترنتی با Laravel ساختهاید. کاربران میتوانند ثبتنام کنند، محصولات را ببینند، سفارش ثبت کنند و هزینه سفارش را بپردازند.
در چنین پروژهای ممکن است تغییر کوچکی در کد ثبت سفارش باعث شود که:
- قیمت نهایی سفارش اشتباه محاسبه شود.
- کاربر بدون ورود به حساب کاربری بتواند سفارش ثبت کند.
- موجودی محصول بهدرستی کاهش پیدا نکند.
- API بهجای پاسخ مورد انتظار، خطای 500 برگرداند.
اگر برای بخشهای مهم برنامه تست نوشته باشید، میتوانید بسیاری از این مشکلات را قبل از انتشار نسخه جدید شناسایی کنید.
به مجموعه این بررسیهای برنامهنویسیشده، Automated Testing یا تست خودکار گفته میشود.
در لاراول ابزارهای تستنویسی بهصورت داخلی پشتیبانی میشوند و میتوان با استفاده از PHPUnit یا Pest تستهای مختلفی نوشت و آنها را اجرا کرد.
چرا باید در پروژههای Laravel تست بنویسیم؟
در پروژههای کوچک ممکن است بتوانید عملکرد برنامه را با چند بار کلیک کردن و بررسی دستی صفحات کنترل کنید. اما با افزایش تعداد قابلیتها، بررسی دستی تمام بخشها دشوار و زمانبر میشود.
تستنویسی به شما کمک میکند:
- خطاها را زودتر شناسایی کنید: پیش از انتشار تغییرات، عملکرد بخشهای مهم را بررسی میکنید.
- با اطمینان بیشتری کد را تغییر دهید: اگر ساختار یک کلاس را اصلاح کنید، تستها میتوانند نشان دهند که رفتار مورد انتظار همچنان برقرار است.
- از بازگشت خطا جلوگیری کنید: خطایی که یک بار پیدا کردهاید، میتواند به یک تست تبدیل شود تا دوباره بهسادگی از قلم نیفتد.
- عملکرد API را بررسی کنید: میتوانید وضعیت HTTP، ساختار JSON و اعتبارسنجی درخواستها را آزمایش کنید.
- هزینه نگهداری پروژه را کاهش دهید: هرچه پروژه بزرگتر شود، تستهای مناسب به بررسی تغییرات وابسته به یکدیگر کمک میکنند.
نکته مهم این است که تستنویسی تضمین نمیکند هیچ خطایی در برنامه وجود نداشته باشد؛ بلکه ریسک خطا را کاهش میدهد و رفتارهای مورد انتظار را قابل بررسی میکند.
آشنایی با انواع تست در Laravel
در لاراول دو دسته اصلی تست بهصورت پیشفرض در ساختار پروژه وجود دارد: Unit Test و Feature Test.
۱. تست Unit چیست؟
Unit Test یا تست واحد، بخش کوچکی از کد را بهصورت مستقل بررسی میکند؛ برای مثال، یک متد که مالیات یا تخفیف را محاسبه میکند.
فرض کنید متدی برای محاسبه قیمت پس از تخفیف دارید:
<?php
namespace App\Services;
class DiscountService
{
public function calculate(
float $price,
float $discountPercent
): float {
return $price - (
$price * $discountPercent / 100
);
}
}
اگر قیمت محصول ۱۰۰۰ و تخفیف ۲۰ درصد باشد، نتیجه باید ۸۰۰ شود.
در یک تست واحد، میتوانیم این رفتار را بدون نیاز به دیتابیس یا ارسال درخواست HTTP بررسی کنیم.
۲. تست Feature چیست؟
Feature Test یا تست قابلیت، رفتار یک بخش بزرگتر از برنامه را بررسی میکند.
برای مثال، میتوانیم بررسی کنیم:
- صفحه فهرست محصولات با وضعیت HTTP مناسب پاسخ میدهد.
- کاربر میتواند با اطلاعات معتبر ثبتنام کند.
- درخواست نامعتبر API خطای اعتبارسنجی برمیگرداند.
- یک سفارش پس از ارسال درخواست در دیتابیس ذخیره میشود.
در این نوع تست ممکن است چند کلاس، مسیریابی، کنترلر، اعتبارسنجی و دیتابیس درگیر باشند.
بهطور خلاصه، Unit Test بیشتر روی صحت یک بخش مستقل تمرکز دارد؛ درحالیکه Feature Test رفتار یک قابلیت از دید برنامه را بررسی میکند.
PHPUnit و Pest چه تفاوتی دارند؟
Laravel از هر دو ابزار PHPUnit و Pest پشتیبانی میکند.
PHPUnit یک چارچوب شناختهشده برای نوشتن و اجرای تستهای PHP است. در این روش معمولاً تستها را داخل کلاسهایی با متدهای مشخص مینویسیم.
Pest نیز ابزاری برای تستنویسی در PHP است که امکان نوشتن تستها با ساختاری کوتاهتر و خواناتر را فراهم میکند.
برای مثال، یک تست ساده با PHPUnit میتواند به این شکل باشد:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class BasicTest extends TestCase
{
public function test_addition_works(): void
{
$result = 2 + 3;
$this->assertSame(5, $result);
}
}
نمونه مشابه با Pest:
<?php
test('addition works', function () {
expect(2 + 3)->toBe(5);
});
هر دو مثال نتیجه یکسانی را بررسی میکنند.
برای شروع لازم نیست هر دو ابزار را همزمان یاد بگیرید. بهتر است یکی را انتخاب کنید و اصول تستنویسی را یاد بگیرید؛ در ادامه این مقاله، مثالها را با PHPUnit مینویسیم.
پیشنیازهای تستنویسی در Laravel
برای دنبال کردن مثالهای این مقاله بهتر است موارد زیر را بلد باشید:
- مفاهیم پایه PHP و برنامهنویسی شیءگرا
- ساختار پروژه Laravel
- کلاسها و متدها
- اجرای دستورات Artisan
- آشنایی مقدماتی با Route و Controller
همچنین باید وابستگیهای پروژه با Composer نصب شده باشند.
در یک پروژه Laravel، معمولاً دایرکتوری tests شامل دو پوشه اصلی است:
tests/
├── Feature/
│ └── ExampleTest.php
└── Unit/
└── ExampleTest.php
تستهای Feature میتوانند از امکانات برنامه Laravel استفاده کنند؛ اما تستهای Unit استاندارد معمولاً بدون راهاندازی کامل برنامه اجرا میشوند و بهطور مستقیم به سرویسهای فریمورک یا دیتابیس دسترسی ندارند.
مرحله اول: ایجاد یک تست جدید در Laravel
فرض کنیم پروژه Laravel شما آماده است و میخواهید اولین تست را ایجاد کنید.
ترمینال را در ریشه پروژه باز کنید؛ همان مسیری که فایل artisan در آن قرار دارد.
برای ایجاد یک تست Feature دستور زیر را اجرا کنید:
php artisan make:test ProductTest
Laravel فایلی مشابه مسیر زیر ایجاد میکند:
tests/Feature/ProductTest.php
اگر بخواهید یک تست Unit ایجاد کنید، از دستور زیر استفاده کنید:
php artisan make:test DiscountServiceTest --unit
در این حالت فایل تست در مسیر زیر ایجاد میشود:
tests/Unit/DiscountServiceTest.php
این دستورات از ابزار رسمی Artisan برای ساخت فایلهای تست استفاده میکنند.
مرحله دوم: نوشتن اولین Unit Test
اکنون میخواهیم متد محاسبه تخفیف را آزمایش کنیم.
ابتدا کلاس DiscountService را در مسیر app/Services/DiscountService.php ایجاد کنید و کد زیر را در آن قرار دهید:
<?php
namespace App\Services;
class DiscountService
{
public function calculate(
float $price,
float $discountPercent
): float {
return $price - (
$price * $discountPercent / 100
);
}
}
سپس فایل زیر را باز کنید:
tests/Unit/DiscountServiceTest.php
محتوای آن را به این شکل بنویسید:
<?php
namespace Tests\Unit;
use App\Services\DiscountService;
use PHPUnit\Framework\TestCase;
class DiscountServiceTest extends TestCase
{
public function test_discount_is_calculated_correctly(): void
{
$service = new DiscountService();
$result = $service->calculate(1000, 20);
$this->assertSame(800.0, $result);
}
}
بیایید کد را بررسی کنیم.
ساخت شیء:
$service = new DiscountService();
یک نمونه از کلاس مورد آزمایش میسازیم.
اجرای متد:
$result = $service->calculate(1000, 20);
قیمت ۱۰۰۰ و تخفیف ۲۰ درصد را به متد ارسال میکنیم.
بررسی نتیجه:
$this->assertSame(800.0, $result);
انتظار داریم خروجی دقیقاً برابر با عدد اعشاری 800.0 باشد.
چون کلاس تست از PHPUnit\Framework\TestCase استفاده میکند و به قابلیتهای Laravel وابسته نیست، برای این مثال نیازی به راهاندازی کامل برنامه نداریم.
اجرای تست
در ترمینال دستور زیر را اجرا کنید:
php artisan test
اگر تست موفق باشد، Laravel نتیجه موفقیتآمیز آن را نمایش میدهد. در صورت شکست، گزارش تست به شما کمک میکند متوجه شوید کدام انتظار برقرار نبوده است.
همچنین میتوانید فقط همین فایل را اجرا کنید:
php artisan test tests/Unit/DiscountServiceTest.php
مرحله سوم: تست کردن یک Route در Laravel
حالا میخواهیم یک تست Feature بنویسیم که پاسخ یک مسیر را بررسی کند.
ابتدا در فایل routes/web.php یک مسیر ساده ایجاد کنید:
use Illuminate\Support\Facades\Route;
Route::get('/test-status', function () {
return response()->json([
'status' => 'success',
]);
});
این مسیر یک پاسخ JSON برمیگرداند.
اکنون فایل تست را ایجاد کنید:
php artisan make:test StatusEndpointTest
در فایل tests/Feature/StatusEndpointTest.php کد زیر را قرار دهید:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class StatusEndpointTest extends TestCase
{
public function test_status_endpoint_returns_success(): void
{
$response = $this->get('/test-status');
$response->assertOk();
$response->assertJson([
'status' => 'success',
]);
}
}
در این تست دو رفتار را بررسی میکنیم.
ابتدا:
$response = $this->get('/test-status');
یک درخواست GET شبیهسازیشده به مسیر موردنظر ارسال میشود. برای این تست نیازی نیست مرورگر واقعی باز کنید یا درخواست را از طریق اینترنت بفرستید.
سپس:
$response->assertOk();
بررسی میکند پاسخ دارای وضعیت HTTP برابر با ۲۰۰ باشد.
در نهایت:
$response->assertJson([
'status' => 'success',
]);
بررسی میکند که پاسخ JSON شامل مقدار مورد انتظار باشد.
برای اجرای این تست میتوانید دستور زیر را اجرا کنید:
php artisan test --filter=StatusEndpointTest
اگر مسیر و تست را دقیقاً مطابق مثال ایجاد کرده باشید، تست باید موفق شود.
نکته: متد assertOk() فقط وضعیت ۲۰۰ را بررسی میکند؛ برای بررسی پاسخهای دیگر میتوانید از متدهایی مانند assertStatus() استفاده کنید.
مرحله چهارم: تست کردن API در Laravel
در پروژههای واقعی، بسیاری از قابلیتها از طریق API در دسترس هستند. برای مثال، یک API ممکن است فهرست محصولات را به شکل JSON برگرداند.
فرض کنیم مسیری در فایل routes/api.php دارید که خروجی آن شامل فهرستی از محصولات است. برای آزمایش چنین مسیری، میتوانید از متد getJson() استفاده کنید.
یک نمونه ساده:
$response = $this->getJson('/api/products');
$response->assertOk();
$response->assertJsonStructure([
'data',
]);
این مثال فرض میکند API شما پاسخی با ساختار data برمیگرداند. اگر پاسخ واقعی API ساختار دیگری داشته باشد، باید ساختار مورد انتظار را متناسب با آن تغییر دهید.
برای ارسال درخواست POST نیز میتوانید از postJson() استفاده کنید:
$response = $this->postJson('/api/products', [
'name' => 'Keyboard',
'price' => 1500000,
]);
این درخواست بهتنهایی چیزی درباره موفقیت یا شکست عملیات اثبات نمیکند؛ لازم است در ادامه بر اساس قرارداد API خود، وضعیت پاسخ، خطاهای اعتبارسنجی یا تغییرات دیتابیس را بررسی کنید.
برای مثال، اگر قرار است محصول جدید ایجاد شود، میتوانید وضعیت پاسخ و ساختار JSON را بررسی کنید. اگر ذخیرهسازی در دیتابیس هم بخشی از رفتار مورد انتظار است، آن را نیز با ابزارهای تست دیتابیس بررسی کنید.
مرحله پنجم: تست کردن دیتابیس
در بسیاری از پروژهها، تست تنها به بررسی پاسخ HTTP محدود نمیشود. گاهی لازم است مطمئن شویم اطلاعات واقعاً ذخیره شدهاند یا وضعیت یک رکورد بهدرستی تغییر کرده است.
Laravel ابزارهایی مانند RefreshDatabase و assertionهای دیتابیس را برای این کار فراهم میکند.
برای مثال، فرض کنید مدل Product در پروژه شما وجود دارد و ستونهای name و price را دارد. اگر مدل، جدول و دیتابیس تست بهدرستی تنظیم شده باشند، میتوان تستی شبیه نمونه زیر نوشت:
<?php
namespace Tests\Feature;
use App\Models\Product;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ProductDatabaseTest extends TestCase
{
use RefreshDatabase;
public function test_product_can_be_created(): void
{
$product = Product::create([
'name' => 'Keyboard',
'price' => 1500000,
]);
$this->assertDatabaseHas('products', [
'id' => $product->id,
'name' => 'Keyboard',
'price' => 1500000,
]);
}
}
این مثال فرض میکند مدل Product، جدول products و ستونهای ذکرشده در پروژه شما وجود دارند و ایجاد رکورد از طریق create() مجاز است. اگر مدل شما به فیلدهای اجباری دیگری نیاز دارد، باید آن فیلدها را هم فراهم کنید.
Trait زیر:
use RefreshDatabase;
به مدیریت وضعیت دیتابیس در طول تست کمک میکند و معمولاً مانع تداخل اطلاعات تستهای مختلف میشود.
نکته مهم: تستهای دیتابیس را به دیتابیس واقعی کاربران یا محیط عملیاتی متصل نکنید. برای تست از دیتابیس اختصاصی و تنظیمات محیط testing استفاده کنید. قبل از اجرای تستها، پیکربندی دیتابیس را بررسی کنید.
مرحله ششم: تست کردن اعتبارسنجی درخواستها
یکی از کاربردهای مهم تستنویسی، بررسی اعتبارسنجی فرمها و APIها است.
فرض کنید یک درخواست برای ثبت محصول باید فیلد name را دریافت کند. اگر این فیلد ارسال نشود، برنامه باید خطای اعتبارسنجی مناسب برگرداند.
در یک تست Feature میتوانید رفتاری مشابه نمونه زیر را بررسی کنید:
$response = $this->postJson('/api/products', [
'price' => 1500000,
]);
$response->assertUnprocessable();
$response->assertJsonValidationErrors([
'name',
]);
در این مثال انتظار داریم API با وضعیت HTTP برابر با ۴۲۲ پاسخ دهد و خطای اعتبارسنجی مربوط به name را برگرداند.
این تست زمانی درست است که مسیر /api/products واقعاً اعتبارسنجی موردنظر را انجام دهد و قرارداد پاسخ آن با این انتظار مطابقت داشته باشد.
تستهای اعتبارسنجی بهویژه در APIهای عمومی اهمیت زیادی دارند؛ زیرا میتوانند از تغییر ناخواسته رفتار خطاها در نسخههای بعدی جلوگیری کنند.
مرحله هفتم: تست کردن کدهایی که وابستگی دارند
در معماریهای مناسب، ممکن است یک کلاس برای انجام وظیفه خود از کلاس دیگری استفاده کند؛ برای مثال، یک سرویس سفارش از سرویس ارسال پیامک استفاده کند.
در بعضی تستها نمیخواهیم پیامک واقعی ارسال شود یا با سرویس خارجی ارتباط برقرار کنیم. در این شرایط میتوانیم وابستگی را Mock کنیم.
Mock یک شیء جایگزین است که رفتار آن را در تست کنترل میکنیم.
فرض کنید این Interface در پروژه وجود دارد:
<?php
namespace App\Contracts;
interface SmsSender
{
public function send(
string $mobile,
string $message
): bool;
}
اکنون میتوانیم در یک تست Laravel، رفتار این وابستگی را شبیهسازی کنیم:
$smsSender = $this->mock(
\App\Contracts\SmsSender::class,
function ($mock) {
$mock->shouldReceive('send')
->once()
->with('09120000000', 'Order created')
->andReturn(true);
}
);
این نمونه انتظار دارد متد send() دقیقاً یک بار و با آرگومانهای مشخص فراخوانی شود و مقدار true برگرداند.
اما صرفاً ایجاد این Mock به معنای تست شدن سیستم ارسال پیامک نیست. برای تست کامل باید آن را در کلاس یا سرویس مورد آزمایش تزریق کنید و رفتار آن کلاس را بررسی کنید.
این روش کمک میکند تست شما بدون ارسال پیامک واقعی اجرا شود.
لازم نیست همه وابستگیها را Mock کنید. فقط زمانی این کار را انجام دهید که کنترل رفتار وابستگی یا جلوگیری از اجرای یک سرویس خارجی برای هدف تست ضروری باشد.
مرحله هشتم: اجرای همه تستها
پس از نوشتن چند تست، بهتر است بتوانید همه آنها را بهسادگی اجرا کنید.
دستور اصلی اجرای تستها در Laravel عبارت است از:
php artisan test
برای اجرای تستهای Feature میتوانید از این دستور استفاده کنید:
php artisan test --testsuite=Feature
برای اجرای تستهای Unit نیز میتوانید بنویسید:
php artisan test --testsuite=Unit
اگر میخواهید فقط تستهایی را اجرا کنید که نام مشخصی دارند، از گزینه --filter استفاده کنید:
php artisan test --filter=DiscountServiceTest
در صورت نیاز، میتوانید تستها را مستقیماً با PHPUnit اجرا کنید:
./vendor/bin/phpunit
اجرای تستها پیش از ادغام تغییرات یا انتشار نسخه جدید، یک عادت مفید در توسعه نرمافزار است.
تفاوت تست دستی و تست خودکار
| ویژگی | تست دستی | تست خودکار |
|---|---|---|
| نحوه اجرا | توسط توسعهدهنده یا تستر | با اجرای کد تست |
| تکرار بررسی | نیازمند انجام دوباره مراحل | قابل تکرار با یک دستور |
| سرعت بررسیهای تکراری | معمولاً زمانبرتر | معمولاً سریعتر |
| مناسب برای | بررسیهای اکتشافی و رابط کاربری | بررسی رفتارهای مشخص و تکرارشونده |
| احتمال فراموش شدن مراحل | وجود دارد | در صورت اجرای تست، مراحل تعریفشده تکرار میشوند |
این دو روش رقیب یکدیگر نیستند. تست خودکار بسیاری از بررسیهای تکراری را انجام میدهد، اما تست دستی همچنان برای تجربه کاربری، بررسی ظاهری و کشف رفتارهای پیشبینینشده مفید است.
خطاهای رایج در تستنویسی Laravel
۱. نوشتن تستهایی که فقط همیشه موفق میشوند
تستی که صرفاً وجود یک مقدار ثابت یا اجرای یک دستور ساده را بررسی میکند، لزوماً بخش مهمی از برنامه را آزمایش نمیکند.
بهتر است تستها رفتارهای معنادار و قابل مشاهده را بررسی کنند.
۲. اتصال تست به دیتابیس اصلی
اگر تست اطلاعات را در دیتابیس عملیاتی ایجاد یا حذف کند، ممکن است دادههای واقعی تغییر کنند.
از دیتابیس اختصاصی تست استفاده کنید و پیش از اجرای تستهای مخرب، تنظیمات اتصال را بررسی کنید.
۳. وابستگی بیشازحد به سرویسهای خارجی
اگر هر تست برای اجرا به سرویس پیامک، درگاه پرداخت یا API خارجی متصل شود، ممکن است کند، ناپایدار یا پرهزینه باشد.
برای تست رفتار برنامه معمولاً بهتر است وابستگیهای خارجی را کنترل یا شبیهسازی کنید؛ البته خود ارتباط با سرویس خارجی نیز باید در صورت نیاز جداگانه بررسی شود.
۴. تست کردن جزئیات پیادهسازی بهجای رفتار
اگر تست صرفاً بررسی کند که یک متد داخلی با نام خاصی فراخوانی شده، ممکن است با تغییر ساختار کد شکست بخورد؛ حتی وقتی رفتار اصلی برنامه درست است.
در بیشتر موارد، بهتر است نتیجهای را بررسی کنید که کاربر یا مصرفکننده API واقعاً مشاهده میکند.
۵. نادیده گرفتن تستهای شکست
تنها تست کردن ورودیهای معتبر کافی نیست. ورودی ناقص، کاربر بدون مجوز، شناسه نامعتبر و شرایط مرزی نیز باید در تستهای مناسب پوشش داده شوند.
۶. تصور اینکه موفقیت تستها به معنی بینقص بودن برنامه است
تست فقط سناریوهایی را بررسی میکند که برای آنها تست نوشتهاید. اگر سناریوی مهمی پوشش داده نشده باشد، احتمال وجود خطا همچنان وجود دارد.
نکات امنیتی در تستنویسی
هنگام نوشتن تست برای پروژههای Laravel، به موارد زیر توجه کنید:
- از رمز عبور واقعی، توکنهای خصوصی یا کلیدهای درگاه پرداخت در فایلهای تست استفاده نکنید.
- اطلاعات محرمانه را وارد مخزن Git نکنید.
- تست مجوزهای کاربران و کنترل دسترسی را جدی بگیرید.
- بررسی کنید که کاربران بدون مجوز نتوانند به دادههای خصوصی دسترسی پیدا کنند.
- برای تست عملیات مالی، سناریوهای مبلغ نامعتبر، پرداخت ناموفق و درخواست تکراری را در نظر بگیرید.
- تستهای دیتابیس را به محیط عملیاتی متصل نکنید.
در پروژههایی که پرداخت، کیف پول یا سفارش دارند، تست کردن شرایط مرزی اهمیت ویژهای دارد؛ زیرا یک خطای کوچک ممکن است به ثبت اشتباه تراکنش یا محاسبه نادرست موجودی منجر شود.
نکات کاربردی برای پروژههای ایرانی
در پروژههایی که به درگاه پرداخت ایرانی، سامانه پیامکی یا سرویسهای داخلی متصل هستند، بهتر است تست منطق برنامه از ارتباط واقعی با سرویس جدا باشد.
برای مثال، هنگام تست فرایند پرداخت میتوانید رفتار سرویس پرداخت را شبیهسازی کنید و سناریوهای موفقیت، شکست و پاسخ نامعتبر را بررسی کنید.
همچنین:
- برای تست پیامک، از Mock یا محیط آزمایشی ارائهدهنده استفاده کنید.
- برای مبالغ ریالی و تومانی، واحد پول را در نام متغیرها و قراردادهای API روشن نگه دارید.
- در محاسبات مالی، از نوع داده مناسب استفاده کنید و به خطاهای دقت اعداد اعشاری توجه داشته باشید.
- در تست APIها، وضعیت HTTP و ساختار پاسخ خطا را نیز بررسی کنید.
- در تست زمانبندیها و تاریخها، منطقه زمانی و تفاوت تاریخ شمسی و میلادی را در نظر بگیرید.
این موارد جایگزین مستندات سرویسهای پرداخت یا پیامکی نیستند؛ جزئیات پیادهسازی باید مطابق قرارداد همان سرویس باشد.
پرسشهای متداول
آیا Laravel بهصورت پیشفرض ابزار تستنویسی دارد؟
بله. Laravel از PHPUnit و Pest پشتیبانی میکند و در ساختار پروژه معمولاً فایل پیکربندی و دایرکتوریهای اولیه تست وجود دارند.
برای شروع، PHPUnit بهتر است یا Pest؟
هر دو گزینه مناسباند. اگر میخواهید با ساختار کلاسمحور تستنویسی PHP آشنا شوید، PHPUnit نقطه شروع خوبی است. Pest نیز سینتکس کوتاه و خوانایی دارد. مهمتر از انتخاب ابزار، یادگیری اصول طراحی تست است.
چگونه تستهای Laravel را اجرا کنیم؟
در ریشه پروژه دستور زیر را اجرا کنید:
php artisan test
برای اجرای یک فایل خاص یا تستهایی با نام مشخص، میتوانید از مسیر فایل یا گزینه --filter استفاده کنید.
آیا تست Feature به دیتابیس نیاز دارد؟
خیر، نه همیشه. یک تست Feature میتواند فقط پاسخ یک مسیر یا API را بررسی کند. اگر رفتار موردنظر به دیتابیس وابسته باشد، باید دیتابیس تست و دادههای موردنیاز را آماده کنید.
آیا تستنویسی باعث حذف کامل خطاها میشود؟
خیر. تستنویسی احتمال بروز برخی خطاها را کاهش میدهد، اما فقط رفتارهایی را بررسی میکند که برای آنها سناریوی تست نوشته شده است.
تفاوت اصلی Unit Test و Feature Test چیست؟
Unit Test روی یک بخش کوچک و مستقل تمرکز میکند؛ اما Feature Test رفتار یک قابلیت بزرگتر، مانند درخواست HTTP یا تعامل چند بخش برنامه، را بررسی میکند.
جمعبندی
تستنویسی یکی از مهارتهای مهم برای توسعهدهندگان Laravel است. با نوشتن تستهای خودکار میتوانید رفتار برنامه را بررسی کنید، تغییرات را با اطمینان بیشتری انجام دهید و از بازگشت برخی خطاهای قبلی جلوگیری کنید.
برای شروع، کافی است یک متد ساده را با Unit Test آزمایش کنید، سپس سراغ تست مسیرها، APIها، اعتبارسنجی و دیتابیس بروید. بهمرور میتوانید تستهای پروژه را به بخشی از روند توسعه روزانه تبدیل کنید.
پیشنهاد برای ادامه یادگیری: در مقاله بعدی، بهصورت اختصاصی سراغ Feature Test در Laravel میرویم و بررسی میکنیم چگونه درخواستهای HTTP، پاسخ API، اعتبارسنجی و تعامل با دیتابیس را مرحلهبهمرحله تست کنیم.
منابع پیشنهادی برای مطالعه بیشتر
- مستندات رسمی Laravel درباره تستنویسی: https://laravel.com/docs/13.x/testing
- مستندات رسمی Laravel درباره تست درخواستهای HTTP: https://laravel.com/docs/13.x/http-tests
- مستندات رسمی Laravel درباره تست دیتابیس: https://laravel.com/docs/13.x/database-testing





