هذا المقال غير منشور بعد وغير مرئي لمحركات البحث.
الاختبار البصري في Laravel Blade: الواجهة الأمامية التي ينسى مطورو الخلفية اختبارها

الاختبار البصري في Laravel Blade: الواجهة الأمامية التي ينسى مطورو الخلفية اختبارها

التعريف

الاختبار البصري هو تقنية تحقق مؤتمتة تقارن لقطات الشاشة المرجعية مع الحالة الحالية لصفحات تطبيق ويب لاكتشاف أي تعديل غير مقصود في مظهرها، عبر تحليل العرض النهائي كما يظهر في المتصفح.

Laravel هو إطار PHP الأكثر شعبية في العالم. وفقاً لاستطلاع JetBrains Developer Ecosystem Survey (2024)، يُستخدم Laravel من قبل أكثر من 50% من مطوري PHP — بفارق كبير عن Symfony وCodeIgniter وYii. نظامه البيئي غني، ومجتمعه ضخم، ومنحنى تعلمه من بين الأكثر سلاسة في عالم PHP.

لكن إليك المشكلة التي لا أحد في مجتمع Laravel يريد الاعتراف بها حقاً: غالبية تطبيقات Laravel لديها واجهة أمامية مُختبَرة بشكل ناقص. مطورو Laravel يكتبون اختبارات وحدة لنماذج Eloquent الخاصة بهم. ويكتبون اختبارات وظيفية لـ controllers. ويختبرون مساراتهم، وmiddlewares، وjobs، وevents. لكن العرض النهائي لقوالب Blade — ما يراه المستخدم فعلياً في متصفحه — يبقى نقطة عمياء ضخمة.

الاختبار البصري يسد بالضبط هذه الفجوة. وهو رأي ندعمه بالكامل: مطورو Laravel للخلفية الذين لا يختبرون واجهتهم الأمامية بصرياً يُقدِّمون جودة غير مكتملة.



مفارقة Laravel: خلفية لا تشوبها شائبة، وواجهة أمامية مُهمَلة

ثقافة الاختبار في نظام Laravel البيئي

فعل Laravel أكثر من أي إطار PHP آخر من أجل تعميم ثقافة الاختبار. PHPUnit مدمج افتراضياً. Factories وseeders تسهّل إنشاء بيانات الاختبار. واختبار HTTP يتيح لك التحقق من ردود controllers. أما Pest PHP، الذي أنشأه Nuno Maduro (عضو في فريق Laravel)، فقد جعل كتابة الاختبارات أكثر متعة.

النتيجة هي أن مطوري Laravel يختبرون كود خلفيتهم. ليس كلهم، وليس دائماً، لكن ثقافة الاختبار راسخة بقوة في المجتمع. مشروع Laravel جاد يحتوي بالضرورة على اختبارات. وحزمة Laravel تُنشر بدون اختبارات فتُنظَر إليها بشك وريبة.

لكن ثقافة الاختبار هذه تتوقف فجأة عند حدود الواجهة الأمامية. اختبارات PHPUnit تتحقق من أن controller يُعيد كود HTTP الصحيح، وأن الرد يحتوي البيانات الصحيحة، وأن العرض يُعرَض بدون أخطاء. لكنها لا تتحقق أبداً من أن النتيجة في المتصفح صحيحة بصرياً.

مطور الخلفية والواجهة الأمامية: علاقة معقدة

لنكن صريحين. مطور Laravel النموذجي هو مطور PHP. يشعر بالراحة مع Eloquent وmigrations وqueues وevents. أما الواجهة الأمامية، بالنسبة له، فهي ضرورة يتعامل معها بدرجات متفاوتة من الحماس.

بعض مطوري Laravel يتبنون الواجهة الأمامية بحماس — يستخدمون Livewire أو Inertia.js، ويتقنون Tailwind CSS، ويبنون واجهات أنيقة. لكن كثيرين آخرين يتبنون نهجاً أكثر براغماتية: ينسخون قالب Bootstrap أو Tailwind، ويعدلون HTML في ملفات Blade، ويضبطون CSS حتى "يبدو صحيحاً" في متصفحهم، ثم ينتقلون إلى الميزة التالية.

هذا النهج يعمل — حتى يتوقف عن العمل. لأن "يبدو صحيحاً في متصفحي" لا يعني "يبدو صحيحاً في جميع المتصفحات، وفي جميع الدقات، وبعد كل تغيير كود مستقبلي". الاختبار البصري المؤتمت هو الجواب على هذه الفجوة بين تصور المطور وواقع تجربة المستخدم.


Blade: محرك قوالب قوي لكن غير قابل للتنبؤ بصرياً

كيف يعمل Blade

محرك قوالب Blade في Laravel يُجمِّع ملفات view لديك إلى PHP خام، يُنفَّذ بعد ذلك لتوليد HTML المُرسَل إلى المتصفح. توجيهات Blade — الجمل الشرطية، والحلقات، وتضمينات المكونات، والفتحات — تُحوَّل جميعها إلى تعليمات PHP في مرحلة التجميع.

عملية التجميع هذه شفافة وموثوقة. المشكلة البصرية لا تنبع من Blade نفسه، بل مما يُنتجه. HTML الذي يُنتجه Blade يعتمد على بياناتك، ومنطقك الشرطي، وبنية مكوناتك. أما العرض البصري لهذا HTML فيعتمد على ملفات CSS، وscripts JavaScript، ومتصفح الزائر.

المنطق الشرطي وعواقبه البصرية

قوالب Blade نادراً ما تكون ساكنة. تحتوي على منطق شرطي يُعدِّل HTML المُولَّد بحسب السياق. مستخدم مسجل الدخول لا يرى نفس header كزائر مجهول. منتج متوفر في المخزون لا يعرض نفس المعلومات كمنتج غير متوفر. نموذج به أخطاء تحقق لا يبدو كنموذج فارغ.

كل فرع شرطي هو تغيّر بصري محتمل. وكل تغيّر يجب اختباره. عندما تضيف شرطاً جديداً إلى قالب Blade — على سبيل المثال، عرض شارة "جديد" على المنتجات المُنشَأة منذ أقل من 7 أيام — فإنك تخلق تغيّراً بصرياً جديداً. هذه الشارة قد تفيض عن حاويتها، أو تتداخل مع عنصر آخر، أو تكون غير مرئية عند دقات معينة.

ستتحقق اختبارات PHPUnit من أن الشارة موجودة في HTML عندما يُستوفى الشرط. لكنها لن تتحقق من أن الشارة صحيحة بصرياً. الاختبار البصري وحده هو القادر على فعل ذلك.

مكونات Blade والتركيب

منذ Laravel 7، يقدم Blade نظام مكونات مع فئات PHP مرتبطة. هذه المكونات قابلة للتركيب — مكون بطاقة منتج يستخدم مكون صورة، ومكون سعر، ومكون شارة. تعديل مكون من مستوى أدنى يمكن أن يؤثر على جميع المكونات التي تستخدمه.

إن عدّلت مكون السعر لإضافة عبارة "شامل الضريبة"، ستظهر هذه العبارة في كل مكان يُستخدَم فيه المكون — في بطاقة المنتج، وفي سلة التسوق، وفي ملخص الطلب، وفي بريد التأكيد. إن دفع النص المُضاف السعر إلى سطرين بدلاً من سطر واحد، فقد يتعرّض تخطيط كل هذه السياقات للانهيار.

تركيب مكونات Blade يُضاعف سطح الهشاشة البصرية. تغيير موضعي يمكن أن يُحدث آثاراً بصرية متتالية لم تكن في حسبانك. الاختبار البصري يلتقط هذه الآثار المتتالية لأنه يختبر العرض النهائي لكل صفحة، وليس المكونات بمعزل عن بعضها.


مصادر الانحدارات البصرية في تطبيق Laravel

تحديثات تبعيات الواجهة الأمامية

تطبيق Laravel حديث يستخدم Vite (منذ Laravel 9) أو Laravel Mix (webpack) لتجميع أصول واجهته الأمامية. تبعيات npm — مثل Tailwind CSS وAlpine.js وVue.js وBootstrap ومكتبات الأيقونات وخطوط الويب — تُجمَّع إلى ملفات CSS وJavaScript تُقدَّم للمتصفح.

كل تحديث لهذه التبعيات يمثّل مخاطرة بصرية. ترقية Tailwind CSS من إصدار إلى آخر يمكن أن تُعدِّل القيم الافتراضية لفئات utility معينة. تغيير سلوك توجيه Alpine.js يمكن أن يُعدِّل مظهر المكونات التفاعلية (مثل القوائم المنسدلة والنوافذ المنبثقة وعلامات التبويب). تحديث متغيرات Sass في Bootstrap يمكن أن يُغيّر الألوان الافتراضية والمسافات البادئة وأحجام الخطوط.

هذه التغييرات موثقة في سجلات التغييرات (changelogs)، لكن من يقرأ فعلياً سجلات التغييرات لكل تبعيات npm قبل التحديث؟ لا أحد. الاختبار البصري هو شبكة أمانك لاكتشاف الآثار البصرية التي لم تقرأ عنها في ملاحظات الإصدار.

Livewire وInertia: ديناميكية من جانب الخادم

Livewire وInertia.js هما الحلان الرسميان لـ Laravel لبناء واجهات ديناميكية دون الحاجة إلى كتابة الكثير من JavaScript. Livewire يعرض مكونات Blade من جانب الخادم ويُحدِّثها عبر طلبات AJAX. Inertia.js يتيح لك استخدام Vue أو React أو Svelte كطبقة عرض مع الاحتفاظ بمسارات وcontrollers Laravel.

هذه الأدوات تضيف بُعداً ديناميكياً للعرض يزيد من سطح المخاطرة البصرية. مكون Livewire يُعيد العرض بعد تفاعل يمكن أن يُنتج وميض محتوى، أو انزياح في التخطيط، أو رسم متحرك متقطع. مكون Inertia.js يستقبل props مختلفة من controller مُعدَّل يمكن أن يُغيّر المظهر.

المشكلة أن هذه الانحدارات غالباً ما تكون مرتبطة بالحالة — لا تظهر عند التحميل الأولي للصفحة، بل بعد تفاعل محدد. الاختبار البصري للحالة الأولية يمثل مستوى أول من الحماية. أما للحالات التفاعلية، فتتيح Delta-QA اختبار عناوين URL محددة تعكس حالات معينة من تطبيقك.

عمليات نقل قاعدة البيانات وآثارها البصرية

إليك سيناريو عاشه كل مطور Laravel. تضيف عموداً إلى جدول في قاعدة البيانات. تُحدِّث نموذج Eloquent لاستخدام هذا العمود الجديد. تُعدِّل قالب Blade لعرض المعلومة الجديدة.

ما لا تفعله هو التحقق من أن إضافة هذه المعلومة لا تُكسر التخطيط. عمود "رقم الضريبة" الجديد في صفحة العميل يمكن أن يدفع حقولاً أخرى لأسفل، أو يُخل بتوازن شبكة التخطيط، أو يُنشئ تمريراً أفقياً على الأجهزة المحمولة.

ولن تكون بيانات التطوير (التي غالباً ما تكون ضئيلة أو وهمية) هي ما يُنبِّهك للمشكلة. ستظهر المشكلة في بيئة الإنتاج، مع بيانات حقيقية — أسماء طويلة، وعناوين بأحرف خاصة، وأرقام ضريبية بتنسيقات غير متوقعة. الاختبار البصري ببيانات تمثيلية هو الطريقة الوحيدة لاكتشاف هذه المشاكل قبل أن يكتشفها مستخدموك.

حزم Laravel وأثرها على الواجهة الأمامية

Laravel Filament وNova وJetstream وBreeze — هذه الحزم تقدم واجهات كاملة تتكامل في تطبيقك. عندما يتم تحديثها، يمكن أن تُعدِّل مظهر views الخاصة بها. وبما أنك على الأرجح قمت بتخصيص هذه views، فإن التعارضات بين تخصيصاتك والإصدارات الجديدة تكون متكررة — وتتجلى بصرياً بشكل واضح.


لماذا الاختبارات الكلاسيكية لـ Laravel لا تغطي البُعد البصري

ما يختبره PHPUnit — وما لا يختبره

اختبارات PHPUnit في تطبيق Laravel تتحقق من تأكيدات حول سلوك الكود. اختبار نموذجي يتبع هذا المنطق: يرسل طلب HTTP، يتحقق من كود الرد، يتأكد من أن الرد يحتوي نصوصاً أو بيانات معينة، ويتحقق من أن قاعدة البيانات تم تعديلها بشكل صحيح.

في أي نقطة من هذا الاختبار لا يتم التحقق من أن الصفحة تُعرَض بشكل صحيح في المتصفح. لا يتم التحقق من أن زر الإرسال مرئي، أو أن النموذج مُحاذى بشكل سليم، أو أن الألوان صحيحة، أو أن التصميم المتجاوب يعمل، أو أن الصور بأحجام مناسبة.

هذه فجوة هائلة في تغطية الاختبار. يمكن لتطبيقك أن يحقق تغطية PHPUnit بنسبة 100% ومع ذلك يُعرض صفحة مكسورة بصرياً تماماً. الاختبار الوظيفي يقول "نجاح"، والمتصفح يقول "كارثة".

اختبارات المتصفح مع Dusk: أفضل، لكنها ليست كافية

Laravel Dusk هي أداة اختبار المتصفح الرسمية لـ Laravel. تستخدم ChromeDriver لقيادة متصفح حقيقي وإجراء تأكيدات حول محتوى الصفحة. إنها خطوة في الاتجاه الصحيح، لكنها ليست اختباراً بصرياً.

Dusk يتحقق من أن العناصر موجودة في DOM، وأن النصوص مرئية، وأن النقرات تُنتج نتائج. لكنه لا يقارن المظهر البصري الكلي للصفحة. يمكن أن يكون الزر "مرئياً" بمعنى Dusk (موجود في DOM وغير مخفي بـ CSS) بينما يكون غير قابل للوصول بصرياً — على سبيل المثال، زر أبيض على خلفية بيضاء، أو زر دُفع خارج المنطقة المرئية بواسطة عنصر آخر.

الاختبار البصري يذهب أبعد مما تذهب إليه Dusk. يلتقط ما يراه المستخدم فعلياً — العرض المركّب الناتج عن HTML وCSS وJavaScript — ويقارنه بمرجع. إنه مستوى التحقق الأقرب إلى التجربة الحقيقية لمستخدميك.


الاختبار البصري كمكمل طبيعي لـ PHPUnit

هرم الاختبار الموسَّع

يميز هرم الاختبار الكلاسيكي بين اختبارات الوحدة (القاعدة العريضة)، واختبارات التكامل (المنطقة الوسطى)، واختبارات end-to-end (القمة). الاختبار البصري يضيف بُعداً متعامداً على هذا الهرم — لا يستبدل أي مستوى من هذه المستويات، بل يكمّلها بالتحقق من بُعد تتجاهله المستويات الأخرى.

اختبارات PHPUnit لديك تتحقق من أن الكود يعمل. الاختبار البصري يتحقق من أن النتيجة صحيحة بصرياً. كلاهما ضروري، ولا أحدهما يُغني عن الآخر.

بالنسبة لتطبيق Laravel، التركيبة الموصى بها هي كالتالي: اختبارات وحدة PHPUnit تغطي منطق الأعمال (models وservices وhelpers). اختبارات PHPUnit الوظيفية تغطي المسارات وcontrollers. اختبارات Dusk تغطي رحلات المستخدم الحرجة. والاختبار البصري يغطي مظهر جميع الصفحات وجميع الحالات ذات الأهمية.

التكلفة الهامشية للاختبار البصري

ما يجعل الاختبار البصري جذاباً بشكل خاص لفرق Laravel هو تكلفته الهامشية شبه المعدومة. كتابة اختبارات PHPUnit تستغرق وقتاً. وكتابة اختبارات Dusk تستغرق وقتاً أطول. أما الاختبار البصري بأداة بدون كود مثل Delta-QA فلا يتطلب كتابة أي اختبار على الإطلاق.

تقدم عناوين URL لتطبيقك، تلتقط Delta-QA لقطات الشاشة، وتتم المقارنات تلقائياً. الاستثمار الأولي هو بضع دقائق — الوقت اللازم لتعداد صفحاتك والتقاط baselines. الاستثمار المتكرر قريب من الصفر — الوقت اللازم لمراجعة النتائج عند اكتشاف فرق.

بالنسبة لفريق Laravel استثمر بالفعل في اختبارات الخلفية، فإن إضافة الاختبار البصري هي أسرع طريقة وأقلها تكلفة لتحسين الجودة المُدرَكة لتطبيقهم بشكل كبير.


إعداد الاختبار البصري على تطبيق Laravel

تحديد الصفحات والحالات الحرجة

تطبيق Laravel يختلف عن موقع تعريفي أو متجر تجارة إلكترونية. لديه صفحات عامة (صفحة هبوط، وصفحات محتوى، ونماذج اتصال) وصفحات تتطلب مصادقة (لوحة تحكم، وملف شخصي، وإدارة). لديه حالات متعددة (نموذج فارغ، ونموذج به أخطاء، وقائمة فارغة، وقائمة مُجزَّأة، وإشعار معروض).

للاختبار البصري، تحتاج إلى تحديد الصفحات والحالات التي تمثل تجربة مستخدميك الفعلية. كأولوية، يشمل ذلك: الصفحات العامة الرئيسية (الرئيسية والتسعير والمزايا)، وصفحات المصادقة (تسجيل الدخول وإنشاء الحساب واستعادة كلمة المرور)، ولوحة التحكم الرئيسية وعرضها الأساسية، والنماذج في حالاتها المختلفة (فارغة ومملوءة وبأخطاء تحقق)، وصفحات القوائم بكميات مختلفة من البيانات (فارغة وبضع عناصر ومع ترقيم صفحات).

بيئة staging كميدان اختبارك

الاختبار البصري لتطبيق Laravel يتطلب بيئة قابلة للوصول عبر HTTP — Delta-QA يحتاج إلى القدرة على تحميل صفحاتك في متصفح. بيئة staging لديك هي المرشح الطبيعي لذلك.

النهج الموصى به هو الحفاظ على بيئة staging تحتوي على بيانات تمثيلية (ليس بيانات إنتاج لأسباب أمنية، بل بيانات اختبار واقعية). تفحص Delta-QA هذه البيئة وتقارن العرض بـ baseline. عندما تنشر نسخة جديدة في staging، يُظهر لك فحص جديد فوراً التغييرات البصرية التي طرأت.

دمج الاختبار البصري في روتين النشر لديك

لست بحاجة إلى إعادة هيكلة عملية النشر لديك لدمج الاختبار البصري. النهج الأكثر براغماتية هو تشغيل فحص Delta-QA بعد كل نشر في staging، ومراجعة النتائج قبل الترقية إلى الإنتاج، وجدولة فحوصات إنتاج منتظمة كشبكة أمان إضافية.

هذا الدمج الخفيف يُحقق مكسباً في الجودة يفوق بكثير الجهد المطلوب. خمس دقائق من التحقق البصري بعد كل نشر يمكن أن توفر عليك ساعات من دعم العملاء وتصحيح الأخطاء في بيئة الإنتاج.


الأسئلة الشائعة

هل يحل الاختبار البصري محل PHPUnit أو Pest لتطبيقات Laravel؟

لا، بالتأكيد لا. الاختبار البصري واختبارات الوحدة/الوظيفية يغطيان أبعاد جودة مختلفة. PHPUnit وPest يتحققان من أن كودك يعمل بشكل صحيح — أن البيانات الصحيحة تُعاد، وأن الأخطاء تُعالَج، وأن منطق الأعمال يُحترَم. الاختبار البصري يتحقق من أن النتيجة النهائية صحيحة بصرياً في المتصفح. تحتاج إلى كليهما.

كيف تختبر بصرياً الصفحات التي تتطلب مصادقة؟

يمكن تكوين Delta-QA للوصول إلى الصفحات التي تتطلب مصادقة. يمكنك إنشاء حساب اختبار مخصص على بيئة staging لديك وتكوين الوصول. هذا يتيح اختبار لوحة التحكم، وصفحات الملف الشخصي، ولوحة الإدارة، وكل الصفحات المحجوزة للمستخدمين المسجلين.

هل يعمل الاختبار البصري مع Livewire والمكونات الديناميكية؟

نعم. تلتقط Delta-QA العرض النهائي في المتصفح بعد تنفيذ JavaScript، بما في ذلك مكونات Livewire المُسقاة بالكامل. الحالة الأولية لمكونات Livewire تُلتقَت كما تُعرَض عند تحميل الصفحة. أما للحالات التفاعلية (بعد نقرة أو بعد إدخال)، يمكنك اختبار عناوين URL محددة أو معاملات تُطلق هذه الحالات.

كم يستغرق إعداد الاختبار البصري على تطبيق Laravel موجود مسبقاً؟

بضع دقائق فقط. تُعدِّد عناوين URL لصفحاتك الحرجة (عادة 20 إلى 50 عنواناً لتطبيق متوسط الحجم)، تلتقط لقطات شاشة مرجعية بـ Delta-QA، ومراقبتك البصرية تصبح تشغيلية. لا شيء تحتاج إلى تثبيته في تطبيق Laravel — لا حزمة Composer، ولا middleware، ولا تعديل كود.

هل يكتشف الاختبار البصري مشاكل التصميم المتجاوب على تطبيقات Laravel؟

نعم. تتيح Delta-QA التقاط لقطات شاشة بدقات مختلفة (سطح مكتب، وجهاز لوحي، وهاتف محمول). هذا مهم بشكل خاص لتطبيقات Laravel التي تستخدم أطر CSS متجاوبة (مثل Tailwind وBootstrap)، لأن نقاط التوقف يمكن أن تُنتج عروضاً مختلفة جداً بحسب حجم الشاشة. نموذج مُحاذى بشكل مثالي على سطح المكتب يمكن أن يكون غير قابل للقراءة على الهاتف المحمول.

هل تعمل Delta-QA مع تطبيقات Laravel التي تستخدم Inertia.js مع Vue أو React؟

نعم. سواء كانت واجهة Laravel الأمامية تستخدم Blade خالصاً، أو Blade مع Alpine.js، أو Inertia.js مع Vue، أو Inertia.js مع React، فإن Delta-QA تلتقط العرض النهائي في المتصفح. تقنية الواجهة الأمامية الأساسية لا تهم — الاختبار البصري يقارن ما يعرضه المتصفح، وليس الكود المصدري.


للمزيد من القراءة


الخلاصة

بنى مطورو Laravel ثقافة اختبار نموذجية للخلفية. حان الوقت لتوسيع تلك الثقافة لتشمل الواجهة الأمامية أيضاً. الاختبار البصري ليس نزوة مصمم كمالي — بل هو التحقق من أن النتيجة النهائية لكل عمل خلفي قمت به صحيحة، كما يراها المستخدم فعلياً.

قوالب Blade تُولِّد HTML. وهذا HTML، عندما يندمج مع CSS وJavaScript لديك، يُنتج عرضاً بصرياً. وهذا العرض البصري هو الشيء الوحيد الذي يراه مستخدموك ويحكمون عليه. اختباره ليس اختيارياً — إنه القطعة الأخيرة من لغز الجودة.

اختبارات PHPUnit لديك تقول إن الكود يعمل. الاختبار البصري يقول إن النتيجة تبدو صحيحة. أنت تحتاج إلى كليهما.

جرّب Delta-QA مجاناً ←