أوّل شبكة أمانٍ حقيقية لـ«يعمل مرّة واحدة» — كي لا يكسر تغيير الذكاء الاصطناعي التالي ما سبقه بصمت.
الوحدة 6 · حوّل معايير القبول إلى اختباراتٍ آلية.
متوسّط الاختبار يتضمّن مختبرًا ~50 دقيقةالمتطلبات المسبقة: الوحدة 5 — خزنة مقتطفاتٍ تعمل (إنشاء، عرض، بحث، حذف).
موطن الفشل رقم 1 من الوحدة 1 كان «يعمل مرّة واحدة»: العرض يعمل، لكن التغيير التالي يكسر شيئًا بصمت دون انتباه. وحين يعيد الذكاء الاصطناعي كتابة شيفرتك مرّاتٍ في اليوم، يتضاعف الخطر. الاختبارات الآلية هي العلاج — تعيد فحص معايير قبولك في ثوانٍ، كل مرّة.
| بلا اختبارات | مع اختبارات |
|---|---|
| تنقر في التطبيق آملًا ألّا شيء انكسر | أمرٌ واحد يؤكّد أن كل ميزةٍ ما زالت تعمل |
| الانحدارات تُشحن بصمت | الميزة المكسورة تُفشل البناء بصوتٍ عالٍ |
| «الاكتمال» إحساس | «الاكتمال» = نجاح اختبارات معايير القبول |
أتذكر معايير القبول التي كتبتها في الوحدة 3؟ «يُرفض العنوان الفارغ»، «البحث غير حسّاسٍ لحالة الأحرف»… كلٌّ منها اختبارٌ ينتظر الكتابة. الاختبارات ما هي إلا مواصفتك مصيّرةً قابلةً للتنفيذ.
لا تغرق في نظرية الاختبار. لتطبيقٍ صغير، نوعان يحملان الثقل:
| النوع | يفحص | مثالٌ للخزنة |
|---|---|---|
| الوحدة | دالّةً صغيرةً واحدة بمعزل | مرشّح البحث يعيد المطابقات دون حساسية حالة الأحرف |
| تكامل الـAPI | نقطة نهايةٍ من الطرف إلى الطرف | POST /snippets ينشئ ويعيد مقتطفًا؛ ويُرفض العنوان الفارغ |
ستسمع عن نِسَب الوحدة مقابل التكامل مقابل الطرف-إلى-الطرف. الآن: اكتب اختبارًا لكل معيار قبولٍ عند المستوى الأرخص فحصًا. غالبًا يكون ذلك اختبارات تكامل الـAPI لنقاط النهاية، وبضعة اختبارات وحدةٍ للمنطق الصعب.
يتزاوج التطوير المقاد بالاختبار جميلًا مع المساعد: اكتب الاختبار أولًا (من معيار قبول)، شاهده يفشل، ثم دع الذكاء الاصطناعي يجعله ينجح. الاختبار الفاشل هدفٌ واضحٌ لا يستطيع المساعد التِيه عنه.
تفضّل الاختبار-بعد؟ لا بأس أيضًا — فقط لا تتخطّاه. القاعدة ببساطة: كل معيار قبولٍ ينتهي باختبار، سواء كتبته قبل الشيفرة أو بعدها.
«اكتب اختبارات تكامل API لمعايير قبول القصص M1–M3 في SPEC.md. اختبارٌ واحد لكل معيار، بأسماءٍ واضحة. لا تغيّر شيفرة التطبيق — الاختبارات فقط.» ثم تراجعها، وتشغّلها، وعندها فقط تدعه يصلح الإخفاقات.
لاختبارات الذكاء الاصطناعي فخّ: قد يكتب المساعد اختبارًا ينجح دائمًا، أو يختبر الشيء الخطأ، ويبلّغ بفخرٍ «كل شيءٍ أخضر». الأخضر ذو معنًى فقط إن كانت الاختبارات حقيقية.
| الفخّ | الحارس |
|---|---|
| اختبارٌ لا يؤكّد شيئًا ذا معنى | اقرأ كل اختبار — هل يفحص السلوك فعلًا؟ |
| تغطية 100%، ثقة 0% | التغطية تقيس الأسطر المُشغّلة، لا الصحّة. لا تطارِد الرقم. |
| ينجح لأنه يحاكي كل شيء | أبقِ بعض الاختبارات على الأقل تضرب نقطة النهاية الحقيقية. |
السبيل الوحيد للوثوق باختبارٍ هو رؤيته يفشل للسبب الصحيح. أدخِل خطأً مؤقّتًا (مثلًا اقبل عنوانًا فارغًا) وأكّد أن اختبارًا يحمرّ. إن لم يفشل شيء، فاختبارك لم يكن يختبر شيئًا.
ستضيف مُشغّل اختبارات، وتحوّل معايير قبولك إلى اختباراتٍ آلية، وتُثبت أنها تعمل بالتقاط خطأٍ مقصود.
مستودع snippet-vault من الوحدة 5 وM1–M3 تعمل.
اطلب من المساعد إعداد مُشغّل اختباراتٍ في api/ (Jest أو Vitest مع Supertest لـHTTP). راجع تغيير الإعداد؛ وأودِعه.
اقرأ كل اختبار. هل يؤكّد كلٌّ السلوك الحقيقي؟
إن فشل أيٌّ منها، قرّر: أهو الاختبار خطأ أم الشيفرة؟ أصلح الصحيح. أودِع عند الاخضرار.
اسمح مؤقّتًا لنقطة الإنشاء بقبول عنوانٍ فارغ. شغّل الاختبارات — يجب أن يحمرّ اختبار «يُرفض العنوان الفارغ». إن لم يفعل، فاختبارك زائف؛ أصلحه. ثم تراجَع عن الخطأ.
في REFLECTION.md: أيّ اختبارٍ التقط الخطأ المقصود، وهل تبيّن أن اختبارًا كتبه الذكاء الاصطناعي لا يؤكّد شيئًا؟ أودِعه.
مستودع snippet-vault. تحقّق من نفسك:
npm test يعمل وينجح في api/REFLECTION.md يدوّن الخطأ الذي التقطه اختبار| المصطلح | المعنى المبسّط |
|---|---|
| اختبار الوحدة | يفحص دالّةً صغيرةً واحدة بمعزل. |
| اختبار التكامل | يفحص أجزاءً تعمل معًا — مثلًا نقطة API كاملة. |
| TDD | اكتب الاختبار الفاشل أولًا، ثم برمِج حتى ينجح. |
| الانحدار | ميزةٌ كانت تعمل فكسرها تغييرٌ جديد. |
| التغطية | نسبة أسطر الشيفرة التي تشغّلها اختباراتك — مفيدة، لا برهان صحّة. |
مجموعة اختباراتٍ تحوّل معايير قبولك إلى شبكة أمانٍ قابلة للتنفيذ — تعمل بأمرٍ واحد، ومثبتٌ أنها تلتقط خطأً حقيقيًّا. «يعمل مرّة واحدة» صار «يبقى يعمل».
التالي: الوحدة 7 — بوابات الجودة والأمان. الاختبارات تلتقط السلوك المكسور؛ الآن نضيف البوابات التي تلتقط الأسلوب السيّئ والثغرات الأمنية الخطيرة — التدقيق، وفحص الأسرار، والتحقّق — قبل وصولها إلى main.