وحدة 5 / 12

اختبار الإنتاج وضمان الجودة

المكاسب:

  • القدرة على إنتاج اختبار الوحدة وحالات الحافة وتحليل فجوة التغطية باستخدام الذكاء الاصطناعي
  • القدرة على طباعة توقعات الاختبار بناءً على المواصفات، وليس السلوك الحالي للكود
  • القدرة على اختبار ما إذا كان الاختبار يحمي بالفعل عن طريق إدخال الأخطاء

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

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

وجها الاختبار: إصلاح السلوك مقابل التحقق

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

الذكاء الاصطناعي جيد جدًا في الخيار الأخير؛ فهو ينظر إلى الكود وينشئ حالات تختبر "ما يفعله الآن." ولكن إذا كانت التعليمات البرمجية خاطئة منذ البداية، فيمكن للذكاء الاصطناعي تثبيت هذا السلوك الخاطئ على أنه "صحيح". لذلك يجب عليك مراجعة تأكيد كل اختبار ينتجه الذكاء الاصطناعي: "يرجع الكود 42 والاختبار يتوقع 42" لا يعني أن 42 هي الإجابة الصحيحة.

تحذير: إذا اجتاز الذكاء الاصطناعي الاختبار، فهذا لا يعني أن الكود "يعمل"؛ هذا يعني فقط "أنه يتصرف كما يتوقع الذكاء الاصطناعي". عليك أن تقرر ما إذا كانت التوقعات صحيحة أم لا من خلال النظر في المواصفات.

خطوة بخطوة: كتابة اختبارات قوية باستخدام الذكاء الاصطناعي

  1. قم بإعطاء المواصفات، وليس الكود فقط. إذا أضفت المعلومات "يجب أن تقوم هذه الوظيفة بذلك"، فيمكن للذكاء الاصطناعي كتابة التوقع الصحيح؛ سيتم اختبار السلوك الحالي إذا قمت فقط بتقديم الكود.
  2. اسأل عن حالات الحافة. فارغ، فارغ، صفر، سلبي، كبير جدًا، تنسيق سيء، متزامن - يطالب صراحةً بالخروج عن المسار السعيد.
  3. تحديد إطار الاختبار والأسلوب. "استخدم pytest"، "نمط الترتيب-التصرف-التأكيد"، "دع كل اختبار يختبر شيئًا واحدًا" وما إلى ذلك.
  4. التحقق من التوقعات (التأكيد). قارن بالمواصفات التي يتحقق منها كل تأكيد من القيمة الصحيحة.
  5. إغلاق الفجوات في النطاق. قم بإعطاء الاختبارات الموجودة واسأل "ما هي الفروع والحالات التي لم يتم اختبارها؟" تجعلك تسأل؛ ثم تحقق من إنتاج اختبارات إضافية.

ثلاث حالات صغيرة

الحالة 1 - التغطية من 52% إلى 85%. بلغت نسبة التغطية الاختبارية لوحدة خدمة واحدة 52%. قام الفريق بتغذية الاختبارات الحالية إلى الذكاء الاصطناعي، وقام بإدراج الفروع غير المختبرة وإنشاء اختبارات لها. ومع المراجعة البشرية، زادت التغطية إلى 85%؛ وفي هذه العملية، اكتشف الذكاء الاصطناعي خطأً فعليًا (مسارًا أعاد رمز الخطأ الخاطئ) في فرع الأخطاء الذي لم يتم اختباره من قبل.

الحالة الثانية - فخ تثبيت التوقعات الكاذبة. لقد كانت وظيفة تقريب الأموال خاطئة بالفعل؛ فبدلاً من تقريب 2.675 إلى 2.67، تم تقريب 2.67 بدلاً من 2.68. نظر الذكاء الاصطناعي إلى الكود وكتب تأكيد round_money(2.675) == 2.67 - وتجميد الخطأ على أنه "صحيح". عندما قرأ المطور المواصفات، قام بتصحيح التوقعات واكتشف الخطأ الحقيقي. اختبار القاعدة، وليس الكود، هو الذي أحدث الفارق.

الحالة 3 - انفجار حالة الحافة. عند سؤال الذكاء الاصطناعي عن "حالات الحافة" فقط لوظيفة النطاق الزمني؛ أنتجت 8 حالات مثل البداية = النهاية، الفاصل الزمني العكسي، السنة الكبيسة 29 فبراير، مناطق زمنية مختلفة وفاصل زمني فارغ. اثنان من هذه (التباعد العكسي والسنة الكبيسة) كانا يسببان الخطأ بالفعل. غالبًا ما يتم تخطي النظر في هذه الحالات يدويًا؛ لقد أصبح الذكاء الاصطناعي شريكًا في "العصف الذهني المتقدم" هنا.

أربعة قوالب قابلة للنسخ

توليد الاختبار على أساس المواصفات:

الدور: مطور يكتب الاختبارات. الإطار: {{pytest/JUnit/Jest...}}.ما يجب أن تفعله الوظيفة (المواصفات): {{rule}}اكتب اختبارات للوظيفة التالية. اكتب التوقعات وفقًا للمواصفات، وليس وفقًا للمخرج الحالي للكود. مسار سعيد + إضافة 4 حالات حافة على الأقل. دع كل اختبار يختبر شيئًا واحدًا، استخدم اسمًا وصفيًا. {{وظيفة}}

العصف الذهني لحالة الحافة:

قم بإدراج حالات الحافة/الفشل التي يجب تجربتها في اختبار هذه الوظيفة (فارغة، فارغة، نقاط التوقف، التنسيق السيئ، التزامن، خطأ خارجي). لكل حالة: الإدخال، السلوك المتوقع. لا تكتب الكود بعد، فقط قم بإدراجه.{{function}}

تحليل فجوة التغطية:

فيما يلي الوظائف والاختبارات المتاحة. ما هي الفروع والشروط والحالات التي لم يتم اختبارها؟ قم بإدراج أوجه القصور وكتابة اختبارات جديدة لأوجه القصور فقط. لا تكرر الموجودة. الوظيفة: {{function}}الاختبارات: {{existing_tests}}

بيانات الاختبار/إنشاء الكائنات الوهمية:

قم بإنشاء بيانات اختبار واقعية لاختبارات {{function/service}}: العينات الصالحة والعينات الحدودية والعينات غير الصالحة بشكل منفصل. اقترح سلوكًا وهميًا بسيطًا للتبعية الخارجية {{X}}. استخدام البيانات السرية الحقيقية/معلومات تحديد الهوية الشخصية؛ توليد بيانات وهمية.

موجه ضعيف / موجه قوي

ضعيف: "اكتب اختبارًا لهذه الوظيفة."
Strong: "with pytest. الدالة Apply_discount(total, بالمائة) — القاعدة: الخصم يجب أن يكون 0%–30%، خارج الحدود يجب أن يرمي ValueError، يجب تقريب النتيجة إلى رقمين عشريين. اكتب التوقعات بواسطة هذه القاعدة (وليس بواسطة الكود). المسار السعيد + حالات الحافة هذه: 0%، 30%، 31% (خطأ)، سالب، الإجمالي=0. [كود]"

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

نوع الاختبار

مساهمة الذكاء الاصطناعي

السيطرة البشرية

اختبار وحدة الطريق سعيد

هيكل عظمي سريع

هل التوقع صحيح؟

حالات الحافة

عصف ذهني واسع النطاق

القضاء على ما لا علاقة له بالموضوع

ملء فجوة النطاق

يجد الفروع التي تم تخطيها

تأكيد الأهمية

بيانات الاختبار/وهمية

تنتج عينة واقعية

لا يوجد معلومات تحديد الهوية الشخصية، التحكم الواقعي

الاختبارات تدير الجودة، ولا تضمنها

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

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

الأخطاء الشائعة

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

باختصار

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

مهمة التطبيق

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

قائمة مرجعية

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