تخطَّ إلى المحتوى

🔺 شرح Laravel

اختبار التطبيق (Testing)

الدرس 27 من 28· ⏱ 2 دقائق قراءة· 🗓 آخر تحديث: ٢١ يوليو ٢٠٢٦

لماذا الاختبار؟

الاختبار الآلي يتأكّد أن تطبيقك يعمل كما تتوقّع، ويكشف الأعطال قبل وصولها للمستخدمين — خصوصًا عند تعديل كود قديم. Laravel يدعم Pest وPHPUnit جاهزين من أول تثبيت، بلا إعداد إضافي.

بنية مجلّد الاختبارات

tests/
├── Feature/   ← اختبارات أوسع: طلب HTTP كامل، قاعدة البيانات، عدّة أصناف معًا
└── Unit/      ← اختبارات معزولة لتابع واحد بلا تشغيل التطبيق كاملًا

معظم اختباراتك يجب أن تكون Feature — تمنحك ثقة أكبر بأن النظام ككل يعمل.

إنشاء اختبار

php artisan make:test PostTest              # في tests/Feature افتراضيًا
php artisan make:test PostTest --unit        # في tests/Unit

كتابة اختبار (Pest)

<?php
test('الصفحة الرئيسية تُرجع ردًّا ناجحًا', function () {
    $response = $this->get('/');

    $response->assertStatus(200);
});

كتابة اختبار (PHPUnit)

<?php
namespace Tests\Feature;

use Tests\TestCase;

class PostTest extends TestCase
{
    public function test_home_page_loads(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

اختبار واجهات API

<?php
$response = $this->postJson('/api/posts', [
    'title' => 'منشور تجريبي',
    'body' => 'محتوى المنشور',
]);

$response
    ->assertStatus(201)
    ->assertJson(['title' => 'منشور تجريبي']);

قاعدة بيانات نظيفة بكل اختبار

بلا احتياط، بيانات اختبار قد "تتسرّب" لاختبار لاحق وتُفسد نتائجه. تصنيفة RefreshDatabase تلفّ كل اختبار بمعاملة (Transaction) وتتراجع عنها تلقائيًا بنهايته:

<?php
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);   // Pest — يمكن وضعه بملف Pest.php لكل الاختبارات

test('يمكن إنشاء منشور', function () {
    $this->seed();   // تشغيل البذور إن احتجت بيانات أساسية

    $this->post('/posts', ['title' => 'عنوان']);

    $this->assertDatabaseHas('posts', ['title' => 'عنوان']);
});

بـ PHPUnit تُستخدم كصنف Trait عادي: use RefreshDatabase; داخل صنف الاختبار.

تشغيل الاختبارات

php artisan test                    # يشغّل Pest أو PHPUnit حسب المشروع
php artisan test --filter=PostTest  # اختبار واحد فقط
./vendor/bin/pest                   # مباشرة بلا Artisan

أخطاء شائعة

  • نسيان RefreshDatabase فتتسرّب بيانات اختبار لاختبار آخر وتفشل النتائج بلا سبب واضح.
  • كتابة كل شيء كاختبار Unit رغم أنه يحتاج قاعدة بيانات أو طلب HTTP كامل — استخدم Feature حينها.

🎯 التالي: الخلاصة وخطواتك بعد Laravel.

شرح اختبار التطبيق (Testing) — Laravel بالعربي
اختبار التطبيق (Testing)Laravel بالعربي · The Code Fix

📚 لمزيد من التعمّق في Laravel، راجِع التوثيق الرسمي لـ Laravel.

هل كان هذا الدرس مفيدًا؟