طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 132 · تقنيات تطوير الواجهات الخلفية
الدرس 27 · الوحدة 14: اختبار عملية النشر والتحقق منها

اختبار النشر والتحقق منه

تأكد أن تطبيقك يعمل فعلًا للناس، لا لجهازك فقط. ⏱ نحو 30 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تشرح لماذا يلزم اختبار التطبيق على بيئة الاستضافة نفسها.
  • تكتب خطة اختبار نشر تشمل الوصول والوظائف والأخطاء والأمان والأجهزة والأداء.
  • تبني اختبار دخان آليًّا يفحص الروابط ورموز حالتها.
  • تقيس زمن الاستجابة وتستفيد من السجلات والمراقبة.

١«يعمل على جهازي» لا يكفي

تطبيق يعمل على XAMPP قد يفشل على الخادم لأسباب كثيرة: إصدار PHP مختلف، أو إضافة ناقصة، أو اسم ملف بأحرف كبيرة (Linux يفرّق بين Login.php و login.php بخلاف Windows)، أو صلاحية مجلد، أو قاعدة لم تُستورد. لذلك الخطوة الأخيرة في النشر: اختبار شامل على الخادم نفسه، والتحقق من الوصول من أجهزة ومتصفحات مختلفة.

٢خطة اختبار النشر

المجالماذا تختبر؟كيف؟
الوصولالرابط يفتح، و http يحوّل إلى https، والشهادة صالحةالمتصفح، وأيقونة القفل
الوظائفكل وظيفة في جدول التحليل (الدرس 1): الدخول، والإضافة، والتعديل، والحذف، والبحثسيناريو مكتوب خطوة بخطوة
الأخطاءصفحة غير موجودة ← 404، والخطأ لا يكشف مسارات، والسجلات تعملروابط خاطئة متعمدة
الأمانلا phpinfo ولا .sql ولا .git منشورة، والصفحات المحمية تحوّل للدخولطلب هذه الروابط مباشرة
الأجهزة والمتصفحاتجوال وحاسب، و Chrome و Safari و Firefox و Edgeأجهزة حقيقية، وأداة الجوال في F12
الأداءزمن الاستجابة، وحجم الصفحةتبويب Network، وأداة Lighthouse في Chrome

اكتب الاختبارات قائمةً تُعاد بعد كل نشر، لا تجربة عشوائية. فالنشر الثاني والثالث قد يكسر ما كان يعمل.

٣اختبار دخان آلي

اختبار الدخان Smoke test: فحص سريع لأهم الصفحات بعد كل نشر، يكشف إن «احترق» شيء أساسي. نكتبه في PHP بدالة http_get من الدرس 14، فيطلب كل رابط ويقارن رمز الحالة. في المختبر ردود «الموقع المنشور» محاكاة؛ وعلى جهازك يعمل الكود نفسه على موقعك الحقيقي بنسخة cURL:

<?phprequire __DIR__ . '/http.php';$base = 'https://app.tvtc-demo.sa'; $tests = [    ['/', 200, 'إدارة المستخدمين'],    ['/login.php', 200, '<form'],    ['/api/users.php', 401, null],    ['/phpinfo.php', 404, null],    ['/backup.sql', 404, null],]; $passed = 0;foreach ($tests as [$path, $status, $text]) {    [$got, $body] = http_get($base . $path);    $ok = $got === $status && ($text === null || str_contains($body, $text));    if ($ok) $passed++;    echo ($ok ? '✓' : '✗') . " $path ($got)\n";}echo "نجح $passed من " . count($tests);

اختبار phpinfo.php فشل: الصفحة ما زالت منشورة! هذا بالضبط ما يُفترض أن يكتشفه الاختبار قبل أن يكتشفه مهاجم.

٤قياس زمن الاستجابة

المستخدم يغادر إن تأخرت الصفحة. قِس الزمن على الخادم نفسه لتعرف أين يذهب الوقت:

<?php$t0 = microtime(true); $pdo = new PDO('sqlite::memory:');$pdo->exec('CREATE TABLE t (n INTEGER)');$s = $pdo->prepare('INSERT INTO t VALUES (?)');$pdo->beginTransaction();for ($i = 0; $i < 2000; $i++) $s->execute([$i]);$pdo->commit();$t1 = microtime(true); $sum = $pdo->query('SELECT SUM(n) FROM t')->fetchColumn();$t2 = microtime(true); header('Server-Timing: db_insert;dur=' . round(($t1 - $t0) * 1000) . ', db_query;dur=' . round(($t2 - $t1) * 1000));echo "المجموع: $sum";

الترويسة Server-Timing تظهر في أدوات المطوّر (F12 ← Network ← Timing)، فترى زمن كل جزء دون أن تكشفه في الصفحة. والأرقام تختلف من جهاز لآخر؛ المهم المقارنة قبل التحسين وبعده.

٥السجلات والمراقبة

توقّع وتحقّق

اختبار سريع لأهم الصفحات بعد كل نشر يسمى:

Smoke test.

الملف Login.php يعمل على Windows ويفشل على Linux عند طلب login.php لأن:

حساسية حالة الأحرف.

أداة Chrome لقياس الأداء وإمكانية الوصول:

F12 ← Lighthouse.

ما الذي يجب أن يرد بـ 404 على الموقع المنشور؟

لا ملفات حساسة منشورة.

الخلاصة

تحدٍّ برمجي: اختبار الدخان

متوسط

أكمل smoke.php: يطلب كل رابط في القائمة من الموقع المنشور (المحاكى) ويطبع تقريرًا.

المطلوب:
  • لكل اختبار سطر: ✓ /login.php (200) إن طابق رمز الحالة (والنص المطلوب إن وُجد في الجسم)، وإلا ✗ /phpinfo.php (200) برمز الحالة الفعلي.
  • في الآخر: نجح 4 من 5.
  • استخدم http_get، و str_contains لفحص النص.
👀 اعرض الاستجابة المطلوبة
✓ التحقق الآلي: يرسل المختبر هذه الطلبات إلى خادمك بالترتيب ثم يفحص الاستجابات
  1. GET /smoke.php
  • الكود يعمل بلا أخطاء أو تحذيرات
  • التقرير مطابق تمامًا (خمسة أسطر ثم الملخص)
  • تستخدم http_get و str_contains

💡 تلميح 1
foreach ($tests as [$path, $status, $text]) يفك كل اختبار إلى ثلاثة متغيرات.
💡 تلميح 2
النجاح: $got === $status && ($text === null || str_contains($body, $text))

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

<?phprequire __DIR__ . '/http.php';$base = 'https://app.tvtc-demo.sa'; $tests = [    ['/', 200, 'إدارة المستخدمين'],    ['/login.php', 200, '<form'],    ['/api/users.php', 401, null],    ['/phpinfo.php', 404, null],    ['/backup.sql', 404, null],]; $passed = 0;foreach ($tests as [$path, $status, $text]) {    [$got, $body] = http_get($base . $path);    $ok = $got === $status && ($text === null || str_contains($body, $text));    if ($ok) $passed++;    echo ($ok ? '✓' : '✗') . " $path ($got)\n";}echo "نجح $passed من " . count($tests);
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس