المكاسب:
- القدرة على منع الذكاء الاصطناعي من قبول السلوك الخاطئ باعتباره "صحيحًا" عن طريق حساب القيمة المتوقعة في اختبارات الوحدة بشكل مستقل عن قاعدة القبول
- القدرة على طباعة اختبارات سريعة ومستقلة وقابلة للتكرار من خلال تطبيق مبادئ AAA وFIRST والاستهزاء بالتبعيات الخارجية
- القدرة على اختبار الاختبارات مع الطفرة (كسر الكود) والتعرف على الكود الذي يصعب اختباره كرائحة تصميم
أكبر وأسرع طبقة في هرم الاختبار هي اختبار الوحدة - وهو الاختبار الذي يتحقق من وظيفة أو جزء صغير من التعليمات البرمجية بمعزل عن أي شيء آخر. يتم إجراء الآلاف من اختبارات الوحدات في ثوانٍ ويتم اكتشاف الأخطاء أثناء وجود الكود على شاشة المطور. ربما يكون الذكاء الاصطناعي (AI) هو الأكثر كفاءة في إنتاج اختبارات الوحدة: إذا أعطيته وظيفة، فإن الذكاء الاصطناعي ينتج العشرات من الاختبارات. لكن هذه السهولة ذاتها تؤدي إلى الفخ الأكبر: حيث ينتج الذكاء الاصطناعي بسهولة اختبارات "تتوهج باللون الأخضر ولكنها لا تتحقق من أي شيء" أو تقبل السلوك الحالي (الذي ربما يكون خاطئًا) للشفرة على أنه "صحيح". ستتعلم في هذه الوحدة كيفية كتابة اختبارات وحدة الحماية الحقيقية باستخدام الذكاء الاصطناعي والعلاقة بين الكود القابل للاختبار والذكاء الاصطناعي.
صفات اختبار الوحدة الجيد: أولاً
تتبع اختبارات الوحدة الجيدة المبادئ الأولى: سريعة، مستقلة (يجب ألا تعتمد الاختبارات على بعضها البعض)، قابلة للتكرار (قابلة للتكرار - نفس النتيجة في أي بيئة)، التحقق الذاتي (نجاح/فشل واضح)، في الوقت المناسب (في الوقت المحدد). ذكّر نفسك بهذه المبادئ عند قيام الذكاء الاصطناعي بإجراء اختبارات؛ اطلب على وجه التحديد ألا يعتمد الاختبار على العالم الخارجي (قاعدة البيانات الفعلية والشبكة والساعة) ليكون "مستقلًا" و"قابلًا للتكرار".
نمط AAA والتأكيد التعبيري
يتبع اختبار الوحدة الصلبة بنية AAA: الترتيب (الإعداد - إعداد المدخلات والتبعيات)، التصرف (التنفيذ - استدعاء الوظيفة قيد الاختبار)، التأكيد (التحقق من الصحة - مقارنة النتيجة بالقيمة المتوقعة). الشيء الحاسم هو التأكيد. الخطأ الأكثر شيوعًا الذي يرتكبه الذكاء الاصطناعي هو اشتقاق التأكيد من مخرجات الكود قيد الاختبار - منطق "كل ما يُرجعه الكود يكون صحيحًا". وهذا يجعل الاختبار بلا معنى. الطريقة الصحيحة هي تحديد القيمة المتوقعة بشكل مستقل (من معايير القبول، احسبها يدوياً).
تنبيه: إذا أخبرت الذكاء الاصطناعي "اكتب اختبارًا لهذه الوظيفة"، فقد يقوم الذكاء الاصطناعي بتشغيل الوظيفة وكتابة مخرجاتها على أنها "متوقعة". ينجح هذا الاختبار حتى لو كانت الدالة خاطئة. بدلاً من ذلك، قل "أنت تحسب النتائج المتوقعة وفقًا لهذه القواعد، ولا ترجع إلى الإخراج الحالي للوظيفة."
يسخر، بذرة والتبعيات
يتطلب اختبار الوحدة العزلة. إذا كانت وظيفتك تعتمد على قاعدة بيانات أو واجهة برمجة تطبيقات، فسيتم استبدالها بكائنات وهمية (وهمية/كعب روتين - بديل وهمي متحكم فيه للتبعية الحقيقية) في الاختبار. وهذا يجعل الاختبار سريعًا ومستقلاً وقابلاً للتكرار. يمكن للذكاء الاصطناعي إنتاج تركيبات وهمية؛ لكن احذر من الإفراط في الاستهزاء: إذا استهزأت بكل شيء، فإن الاختبار سيتحقق فقط من "ما يعود به الاستهزاء"، وليس المنطق الفعلي. التوازن: محاكاة العالم الخارجي، وتنفيذ المنطق الحقيقي قيد الاختبار.
القابلية للاختبار والذكاء الاصطناعي
هناك تعليقات مثيرة للاهتمام: التعليمات البرمجية التي يصعب اختبارها غالبًا ما تكون تعليمات برمجية سيئة التصميم. إذا واجه الذكاء الاصطناعي مشكلة في كتابة الاختبارات لوظيفة ما (عدد كبير جدًا من التبعيات، والحالة العالمية المخفية، والآثار الجانبية)، فهذه رائحة تصميم. إن سؤال الذكاء الاصطناعي "كيف يمكنك إعادة بناء هذا الكود لجعله قابلاً للاختبار" يؤدي إلى اختبار أفضل ورمز أفضل.
اختبارات المعلمات وتنوع البيانات
إن كتابة اختبار منفصل في كل مرة للتحقق من نفس القاعدة باستخدام مدخلات مختلفة أمر شاق ويصعب الحفاظ عليه. اختبار المعلمات - وهو هيكل يقوم بشكل متكرر بتشغيل نفس منطق الاختبار على قائمة المدخلات والنتائج المتوقعة - يلغي هذا التكرار: يتم تغذية جسم اختبار واحد بعشرات من أزواج المدخلات. يعتبر الذكاء الاصطناعي فعالاً للغاية في إنتاج جداول النتائج المتوقعة للمدخلات عندما تمنحه قواعد القبول الخاصة بك؛ على وجه الخصوص، يقوم بجدولة القيم الحدية وفئات التكافؤ بشكل منهجي.
ولكن يوجد فخ هنا أيضًا: يميل الذكاء الاصطناعي إلى استخلاص النتائج المتوقعة في الجدول الذي تم إنشاؤه من الكود قيد الاختبار. يعد هذا الخطأ أكثر خطورة في اختبار المعلمات، لأن المنطق غير الصحيح واحد يبطل عشرات الأسطر. لذلك، قم دائمًا بحساب عمود النتيجة المتوقعة بشكل مستقل وفقًا لقاعدة القبول والتحقق يدويًا من صحة بضعة صفوف على الأقل. اطلب أيضًا عمود الوصف "ماذا يمثل كل صف"؛ لذلك عندما ينكسر الصف، فإنك ترى على الفور الحالة التي تم كسرها.
نصيحة: قم بإضافة "صف تعويض" عمدًا إلى جدول الاختبار ذي المعلمات - أي أخطأ في كتابة النتيجة عن عمد. إذا لم يتحول هذا الخط إلى اللون الأحمر عند تشغيل الاختبار، فإن الاختبار الخاص بك لا يتحقق فعليًا من هذا الموقف. هذا فحص سريع للتمرير.
موجه ضعيف / موجه قوي
ضعيف: "اكتب اختبار وحدة لهذه الوظيفة."
قوي: اكتب اختبارات الوحدة [اللغة/الإطار] للوظيفة "taxCalculate(amount, Rate). قاعدة القبول: النتيجة = المبلغ * المعدل، مقربًا إلى رقمين عشريين؛ المبلغ أو المعدل السالب يلقي خطأ؛ يُرجع 0 إذا كان المعدل 0. استخدم بنية AAA. احسب القيم المتوقعة يدويًا وفقًا لهذه القواعد؛ لا تشير إلى الإخراج الحالي للوظيفة. قم بتغطية الحالات المقيدة والسلبية (0، سالب، كبير جدًا، مقرب إلى الكسور العشرية). دع اسم كل منها يصف الاختبار القاعدة التي يتحقق منها من التبعية الخارجية "لا".
موجه قوي؛ فهو يعطي قاعدة القبول، وتوقعات القيمة المتوقعة المستقلة، والهيكل وحالات الحافة. وهكذا يصبح الاختبار حارسًا للقاعدة، وليس مرآة للقانون.
جدول جودة اختبار الوحدة
أعراض
اختبار سيء (ثقة زائفة)
اختبار جيد
تأكيد
لا شيء أو "ليست فارغة"
القيمة الملموسة المتوقعة
مصدر القيمة المتوقعة
إخراج الوظيفة
قاعدة القبول / الحساب اليدوي
الإدمان
قاعدة البيانات/الشبكة/الساعة الفعلية
معزول مع وهمية / كعب
حالة الحافة
طريق سعيد فقط
الحد، السلبي، الخطأ
عندما تكسر الكود
يبقى أخضر
يتحول إلى اللون الأحمر
الاسم
اختبار 1، طريقة الاختبار
يصف القاعدة التي يؤكدها
أربعة قوالب قابلة للنسخ
1) اختبار الوحدة المبنية على القواعد:
دورك: مهندس اختبار برمجيات أول. اكتب اختبار وحدة على الوظيفة التالية باستخدام [اللغة/الإطار]: [التوقيع]. قواعد القبول: [القواعد]. - استخدم هيكل AAA. - احسب القيم المتوقعة يدويًا وفقًا لهذه القواعد؛ لا تشير إلى الإخراج الحالي للوظيفة. - تغطية الحد والسالب والخطأ والمسار السعيد باختبارات منفصلة. - دع كل اسم اختبار يصف القاعدة التي يتحقق منها. - محاكاة التبعيات الخارجية؛ اجعل المنطق الفعلي يعمل.
2) التحكم في مقاومة الطفرة:
تحقق من اختبارات الوحدة هذه. أدرج 5 تعديلات طفيفة يمكنني إجراؤها على الكود قيد الاختبار (a - بدلاً من +، a >= بدلاً من a >، تغيير الحدود) وأخبرني في كل واحدة أي من هذه الاختبارات سيتحول إلى اللون الأحمر؟ إذا لم يتم إرجاع أي شيء، فإن الاختبار غير كافٍ. الكود + الاختبارات: [لصق]
3) مراجعة قابلية الاختبار:
لماذا يصعب كتابة اختبار وحدة لهذه الوظيفة؟ الإدمان الخفي، الوضع العالمي، الآثار الجانبية، هل هناك مسؤوليات كثيرة؟ اقترح الحد الأدنى من إعادة الهيكلة لجعلها قابلة للاختبار؛ لا تغير السلوك. الكود: [لصق]
4) اكتمال السيناريو غير المكتمل:
يتم إعطاء الوظيفة التالية والاختبارات المتاحة. قم بإدراج السلوك/حالة الحافة التي لم يتم اختبارها مطلقًا (فجوة النطاق) وأضف اختبارًا لكل منها. اختبارات الوظيفة +: [لصق]
ثلاث حالات صغيرة
الحالة 1 - اختبار عكس الكود. طلب أحد المطورين من الذكاء الاصطناعي كتابة اختبار لوظيفة التقريب؛ 10 اختبارات كانت باللون الأخضر. في الواقع، تم تقريب الدالة في الاتجاه الخاطئ، لكن الذكاء الاصطناعي أخذ القيم المتوقعة من مخرجات الدالة، لذلك اعتبرت الاختبارات الخطأ "صحيحًا". عندما تم حساب القيم المتوقعة يدويًا باستخدام القالب "المعتمد على القاعدة"، تحولت 4 اختبارات إلى اللون الأحمر وتم الكشف عن الخطأ الحقيقي.
الحالة 2 - قيمة التحكم في الطفرة. اعتمد فريق واحد على 45 اختبارًا للوحدة. تم تجربة 20 تعديلًا طفيفًا على الكود من خلال "فحص قوة الطفرة"؛ الاختبارات اشتعلت 11 منهم فقط. مرت الاضطرابات التسعة المتبقية بصمت. وعزز الفريق الاختبارات الضعيفة. تم اكتشاف خطأ حسابي فعلي بواسطة هذه الاختبارات المحسنة في الإصدار التالي.
الحالة 3 - عدم القابلية للاختبار هي رائحة التصميم. لم يتمكن الذكاء الاصطناعي من كتابة اختبارات لوظيفة الترتيب، وكان يحتاج دائمًا إلى قاعدة البيانات الحقيقية. أظهر قالب "مراجعة قابلية الاختبار" أن الوظيفة مضمنة في الوصول إلى قاعدة البيانات. عندما تمت إزالة حقن التبعية، أصبح من الممكن كتابة الاختبارات وأصبح الكود أكثر نظافة.
الأخطاء الشائعة
- استخلاص القيمة المتوقعة من الكود. يقبل الذكاء الاصطناعي إخراج الوظيفة على أنه "صحيح"؛ اختبار يؤكد الكود الخاطئ.
- اختبار بدون تأكيد أو مع تأكيد تافه. منطق "لم يخطئ، بل نجح"؛ لا يؤكد أي شيء.
- وهمية للغاية. يستهزئ بكل شيء ولا يختبر إلا ما يعود الساخر؛ لم يتم اختبار المنطق الحقيقي.
- فقط الطريق السعيد. تجاوز الحد والحالات السلبية والخطأ.
- عدم الاختبار عن طريق كسر الكود. الثقة باللون الأخضر دون التحقق من وجود طفرة.
- تجاهل عدم القابلية للاختبار. عدم التعرف على التصميم السيئ وإصلاحه بدلاً من إجراء اختبارات صعبة.
باختصار
اختبارات الوحدة هي الطبقة الأسرع والأكبر في هرم الاختبار؛ إنه يمسك بالخطأ في أرخص لحظة. الذكاء الاصطناعي قادر جدًا على إنتاج اختبارات الوحدة، لكن أكبر مأزقه هو كتابة الاختبارات التي تفترض السلوك غير الصحيح على أنه "صحيح" من خلال استخلاص القيمة المتوقعة من الكود نفسه. الحل: إعطاء قواعد القبول، وحساب القيم المتوقعة يدويًا، وفرض مبادئ AAA وFIRST، والسخرية من العالم الخارجي وتشغيل المنطق الفعلي، واختبار كل اختبار عن طريق الطفرة (كسر الكود). الكود الذي يصعب اختباره هو علامة تصميم تحتاج إلى إصلاح.
مهمة التطبيق
حدد وظيفة تحتوي على قاعدة عمل من مشروعك الخاص. اكتب قواعد القبول واطلب من الذكاء الاصطناعي كتابة اختبارات باستخدام قالب "اختبار الوحدة المستند إلى القواعد"؛ هل تم حساب القيم المتوقعة يدويًا. ثم قم بتطبيق "فحص قوة الطفرة": قم بعمل 5 فواصل صغيرة على الأقل في الكود وقياس عدد الاختبارات التي تحولت إلى اللون الأحمر. إضافة اختبار جديد للفساد لم يتم اكتشافه. قم بالإبلاغ عن عدد الاضطرابات التي تم اكتشافها (مثل درجة الطفرة).
قائمة مرجعية
- [ ] لقد قدمت قواعد القبول وتم حساب القيم المتوقعة يدويًا.
- [ ] لقد تأكدت من أن الاختبارات لم تستمد القيمة المتوقعة من الكود.
- [ ] لقد قمت بإنشاء اختبار مستقل باتباع إرشادات AAA وFIRST.
- [ ] لقد سخرت من التبعيات الخارجية وقمت بتشغيل المنطق الفعلي.
- [ ] قمت بتغطية حالات الحد والسلبية والخطأ.
- [ ] من خلال كسر الكود (الطفرة) أثبتت أن الاختبارات توفر الحماية بالفعل.