في هذا الدرس 6تصفّح المواضيع
يجب ألا تترك الاختبارات المعتمدة على قاعدة البيانات أي سجلات متبقية تلوث الاختبارات التالية أو تسبب نتائج غير مستقرة. يتيح تضمين السمة RefreshDatabase داخل كلاس الاختبار تشغيل التهجيرات مرة واحدة وتغليف كل دالة اختبار داخل معاملة قاعدة بيانات يتم التراجع عنها تلقائياً فور انتهاء الدالة.
- منع تلوث البيانات (Zero Test Pollution): تبدأ كل دالة اختبار بقاعدة بيانات فارغة ومُهجرة بالكامل دون أي أثر من الاختبارات السابقة.
- سرعة التراجع عن المعاملة (Transaction Speed): بدلاً من هدم الجداول وإعادة بنائها في كل مرة، يتراجع RefreshDatabase عن المعاملة في أجزاء من الثانية.
- التوافق مع الذاكرة (In-Memory Compatibility): يعمل بكفاءة عالية مع قواعد SQLite في الذاكرة أو قواعد بيانات الاختبار المستقلة.
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class PostDatabaseTest extends TestCase {
use RefreshDatabase;
}
بدلاً من إدخال عشرات الأعمدة يدوياً قبل كل اختبار، استخدم مصانع نماذج Eloquent لتوليد سجلات واقعية وعلاقات مترابطة في سطر واحد. استدع الدالة Post::factory->create لحفظ السجل في قاعدة الاختبار، أو مرر مصفوفة ترابطية لتخصيص قيم حقول معينة يهمك فحصها.
- الإنشاء المفرد والمجمّع (Single & Batch Creation): استخدم دالة create لسجل واحد أو اربطها بدالة count(5) لتوليد مجموعة سجلات.
- تخصيص الحقول المهمة (Explicit Attribute Overrides): مرر القيم المراد اختبارها مثل ['is_published' => true] داخل دالة create لزيادة وضوح الاختبار.
- بناء العلاقات بالمصانع (Relationship Factories): اربط دالة for أو دالة has لتوليد السجل الأب مع سجلاته الفرعية في خطوة واحدة.
$user = User::factory()->create();
$post = Post::factory()
->for($user)
->create(['title' => 'Factory Post']);
بعد محاكاة طلب إضافة أو تعديل أو حذف، تحقق من حدوث التغيير الفعلي داخل الجداول باستخدام دوال توكيد قاعدة البيانات في Laravel. استدع الدالة assertDatabaseHas للتأكد من وجود السجل بالقيم المتوقعة، والدالة assertDatabaseMissing بعد الحذف النهائي، أو الدالة assertSoftDeleted للتحقق من الحذف الناعم.
- التحقق من حفظ السجلات (Verifying Persisted Rows): تستعلم دالة assertDatabaseHas عن الجدول للتأكد من وجود صف يطابق القيم الممررة.
- التحقق من الحذف النهائي (Verifying Deletions): تؤكد دالة assertDatabaseMissing اختفاء السجل تماماً من الجدول بعد حذفه.
- فحص الحذف الناعم (Soft Delete Inspection): تتأكد دالة assertSoftDeleted من بقاء السجل في الجدول مع امتلاء عمود الطابع الزمني deleted_at.
$user = User::factory()->create();
$this->actingAs($user)->post('/posts', [
'title' => 'Saved Post',
]);
$this->assertDatabaseHas('posts', [
'title' => 'Saved Post',
]);
عند اختبار مسارات RESTful API، استخدم الدوال getJson و postJson و putJson و deleteJson لكي يرفق Laravel رأس الرسالة Accept: application/json تلقائياً. يمكنك أيضاً محاكاة مصادقة Sanctum مع تحديد قدرات الرمز عبر دالة Sanctum::actingAs، وفحص بنية وقيم المخرجات بدالة assertJson.
- دوال طلبات JSON (JSON Request Helpers): ترمز دوال getJson و postJson البيانات بصيغة JSON وتضبط رؤوس التفاوض تلقائياً.
- محاكاة رموز Sanctum (Sanctum Token Simulation): استدع دالة Sanctum::actingAs مع مصفوفة القدرات لاختبار مسارات API المحمية.
- توكيدات بنية JSON (Payload Assertions): اربط دوال assertJson أو assertJsonPath لفحص القيم المتداخلة داخل مفتاح data.
use Laravel\Sanctum\Sanctum;
$user = User::factory()->create();
Sanctum::actingAs($user, ['posts:write']);
$this->postJson('/api/posts', ['title' => 'API'])
->assertStatus(201)
->assertJson(['data' => ['title' => 'API']]);
ينبغي لاختبارات الميزات التأكد من قيام المتحكم بإطلاق المهمة الخلفية أو إرسال البريد دون تشغيل عامل الطابور فعلياً أو الاتصال بخادم SMTP. يقوم استدعاء Queue::fake أو Mail::fake باستبدال الخدمة الحقيقية في الحاوي بكائن مراقبة يسجل ما تم إطلاقه للتحقق منه برمجياً.
- محاكاة الطوابير (Queue::fake): استدع دالة Queue::fake قبل الطلب، ثم تحقق من دفع المهمة عبر دالة Queue::assertPushed.
- محاكاة البريد (Mail::fake): استدع دالة Mail::fake قبل الطلب، ثم تأكد من جدولة الرسالة عبر دالة Mail::assertSent.
- محاكاة التخزين والأحداث (Storage & Event Fakes): استخدم دالة Storage::fake لاختبار رفع الملفات ودالة Event::fake لفحص إطلاق الأحداث.
use App\Jobs\ProcessPodcast;
use Illuminate\Support\Facades\Queue;
Queue::fake();
$this->postJson('/api/podcasts', ['title' => 'Ep 1']);
Queue::assertPushed(ProcessPodcast::class);
إن الجمع بين سمة RefreshDatabase ومصانع النماذج وتوكيدات JSON API ومحاكاة الخدمات يمنحك القدرة على اختبار أعقد ميزات Laravel 12 بعزل تام وسرعة فائقة. راجع أدوات اختبار قواعد البيانات والواجهات البرمجية في الملخص التالي.
| وجه المقارنة الهندسي | الأسلوب المتزامن أو التقليدي | معيار Laravel 12 الحديث |
|---|---|---|
| حالة قاعدة بيانات الاختبار | بقاء سجلات الاختبارات السابقة مما يسبب فشل الاختبارات اللاحقة | تصفير تلقائي سريع عبر المعاملات باستخدام سمة RefreshDatabase |
| تجهيز البيانات الاختبارية | كتابة مصفوفات طويلة يدوياً لجميع أعمدة الجدول الإلزامية | توليد فوري للسجلات والعلاقات عبر مصانع النماذج Factories |
| فحص استجابات JSON API | فك ترميز نص الاستجابة يدوياً وفحص المصفوفات بطرق تقليدية | استخدام دوال getJson و postJson مع توكيدات assertJson السلسة |
| اختبار الخدمات الجانبية | إرسال بريد فعلي أو تشغيل مهام ثقيلة أثناء تنفيذ الاختبار | عزل فوري للخدمات عبر Mail::fake و Queue::fake |
Mail::fake();
$user = User::factory()->create();
$this->actingAs($user)
->postJson('/api/orders', ['item' => 'Book'])
->assertStatus(201)
->assertJson(['item' => 'Book']);
$this->assertDatabaseHas('orders', ['item' => 'Book']);
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
أتقنت في هذا الدرس حول «اختبار قواعد البيانات وتوكيدات واجهات API في Laravel» مفاهيم تهيئة القاعدة بسمة RefreshDatabase، وتوليد بيانات الاختبار عبر المصانع، والتحقق من وجود وحذف السجلات وفق معايير Laravel 12 الحديثة.
الخطوة التالية والدرس القادم
انتقل الآن إلى الدرس التالي «تحسين أداء تطبيق Laravel والتخزين المؤقت لبيئة الإنتاج» للبناء التراكمي على ما تعلمته.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Database Testing اختبار القواعد
- إعادة تهيئة قاعدة بيانات الاختبار تلقائياً بسمة RefreshDatabase والتحقق من السجلات واستجابات JSON API وفق أحدث معايير إطار العمل Laravel 12 مع أمثلة وتطبيقات عملية متدرجة.
- للمراجعة
- 02 Resetting State with RefreshDatabase تهيئة القاعدة بسمة RefreshDatabase
- المفهوم الهندسي والتطبيق العملي المباشر لقسم تهيئة القاعدة بسمة RefreshDatabase في إطار العمل Laravel 12.
- للمراجعة
- 03 Seeding Test States with Factories توليد بيانات الاختبار عبر المصانع
- المفهوم الهندسي والتطبيق العملي المباشر لقسم توليد بيانات الاختبار عبر المصانع في إطار العمل Laravel 12.
- للمراجعة
- 04 Asserting Database Records and Deletes التحقق من وجود وحذف السجلات
- المفهوم الهندسي والتطبيق العملي المباشر لقسم التحقق من وجود وحذف السجلات في إطار العمل Laravel 12.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 MVC MVC
- Model View Controller
- النمط المعماري الذي يفصل بين نماذج البيانات Models، وطبقات العرض Views، والمتحكمات Controllers في Laravel.
- للمراجعة
- 02 CLI CLI
- Command Line Interface
- واجهة سطر الأوامر التي تعمل عبر أداة php artisan لتوليد الملفات وإدارة التطبيق.
- للمراجعة
- 03 HTTP HTTP
- Hypertext Transfer Protocol
- بروتوكول نقل النص الفائق الذي ينظم طلبات المتصفح واستجابات خادم Laravel.
- للمراجعة
- 04 PSR PSR
- PHP Standards Recommendations
- المعايير القياسية للغة PHP مثل التحميل التلقائي PSR-4 التي يلتزم بها إطار العمل Laravel.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
اكتب ونفّذ المثال البرمجي المشروح في قسم «تهيئة القاعدة بسمة RefreshDatabase» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم «توليد بيانات الاختبار عبر المصانع» وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
ما الهدف الهندسي الأساسي من تهيئة القاعدة بسمة RefreshDatabase في إطار العمل Laravel 12؟
يسهم تهيئة القاعدة بسمة RefreshDatabase في تنظيم منطق التطبيق بأسلوب معياري آمن وقابل للصيانة في Laravel 12.
يساعد الالتزام باصطلاحات Laravel 12 الرسمية في قسم «توليد بيانات الاختبار عبر المصانع» على رفع جودة الكود وسهولة اختباره آلياً.
صواب؛ الالتزام بالمعايير القياسية في Laravel 12 يجعل الكود واضحاً وسهل الفحص والصيانة.
أي آلية في Laravel 12 تتولى إدارة التحقق من وجود وحذف السجلات بشكل مباشر ومنظم؟
توفر طبقة إطار العمل وحاوية الخدمات في Laravel 12 الأدوات القياسية لإدارة التحقق من وجود وحذف السجلات.
لماذا يُعد تطبيق اختبار واجهات JSON ومصادقة Sanctum مهماً عند بناء تطبيقات Laravel 12 جاهزة للإنتاج؟
لأنه يمنع الأخطاء البرمجية الخفية ويوحد سلوك التطبيق بين بيئتي التطوير والإنتاج.
في Laravel 12، يُنصح بكتابة مفاتيح الإنتاج السرية مباشرة داخل ملفات الكود المصدري المرفوعة إلى Git بدلاً من ملفات البيئة.
خطأ؛ يجب حفظ المفاتيح والبيانات السرية في متغيرات البيئة وعدم رفعها أبداً إلى مستودع Git.
ما المزايا الهندسية التي يحققها تطبيق محاكاة البريد والطوابير عبر Fakes في Laravel 12؟ (اختر كل ما ينطبق)
يوفر فصلاً واضحاً للمسؤوليات، وأماناً أعلى أثناء التنفيذ، وتعاوناً أسهل بين أفراد الفريق.
يوظف إطار العمل Laravel 12 ميزات PHP 8 الحديثة مثل تحديد أنواع القيم المرجعة لجعل الكود أكثر وضوحاً وأماناً.
صواب؛ يعتمد Laravel 12 بشكل كامل على الصياغة الحديثة للغة PHP 8.2+ وسلامة الأنواع.
ما الفرق الجوهري بين معيار Laravel 12 الحديث والملفات اليدوية التقليدية في مرجع توكيدات قواعد البيانات وAPI؟
يوفر Laravel 12 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.