محتويات الدورة

C# / المتوسط: التركيب والعمل غير المتزامن / الدرس 12

اختبار العقود وتنقيحها

اشتق فحوصا مستقلة من السلوك واستخدم فشلا مضبوطا بدل إتلاف موارد حقيقية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تصميم اختبارات حدود وفشل بمراجع واضحة.
  • حقن اعتمادات حتمية وملاحظة اكتمال المهام.
  • استخدام التشخيص والمكدس والمنقح ضمن حدوده.

اختبار الوعد لا شكل التنفيذ

يقارن الاختبار السلوك بتوقع مستقل من العقد. اختبر الحصر تحت الحد وعندهما وفوق الأعلى، وأضف للمحلل صياغة خاطئة وبادئة بلاحقة. لا يعني تنفيذ كل سطر فحص المتطلبات. لا توفر النسبة المرتفعة للتغطية توقعا مستقلا؛ فقد تنفذ الحالة الصحيحة نفسها كل الفروع دون اختبار الرفض.

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

اختبار حدود دون اعتماد خارجي

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

يقلل الجدول التكرار دون إخفاء التوقعات. أضف التساوي والأقصى حيث يصح. يأخذ النجاح عينات ولا يبرهن كل مسار وسباق ومنصة؛ اجمعه مع تحليل الثوابت والأعمار والمدى. تبقى اختبارات الحدود دليلا محدودا يكمله برهان المدى والملكية، لا ضمانا آليا لكل مدخل ممكن.

csharp جدول صغير لتوقعات مستقلة
using System;

(int Input, int Expected)[] cases = { (-1, 0), (0, 0), (100, 100), (101, 100) };
foreach (var item in cases)
{
    if (Clamp(item.Input) != item.Expected) throw new InvalidOperationException("clamp mismatch");
}
Console.WriteLine("4 checks passed");

static int Clamp(int value) => value < 0 ? 0 : value > 100 ? 100 : value;
الناتج المتوقع
4 checks passed

كل نتيجة معروفة صراحة ولا يطبع النجاح إلا بعد الفحوص الأربعة.

اختبار الخطأ دون استنفاد مورد حقيقي

تتيح واجهة ضيقة اعتمادا يفشل بضبط. يتجاوز المثال TextWriter.Write ليرمي IOException اصطناعية ويتحقق من تمريرها بدل ملء قرص أوخدمة. اجعل الفشل المحلي المتوقع صريحا. يجب أن يقع IOException الاصطناعي عند موضع الكتابة المقصود؛ قبول أي استثناء قد يخفي عيبا سابقا مختلفا.

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

csharp فشل كاتب مضبوط
using System;
using System.IO;
using System.Text;

using var writer = new FailingWriter();
try
{
    writer.Write("sample");
    throw new InvalidOperationException("expected write failure");
}
catch (IOException)
{
    Console.WriteLine("expected failure observed");
}

internal sealed class FailingWriter : TextWriter
{
    public override Encoding Encoding => Encoding.UTF8;
    public override void Write(string? value) => throw new IOException("synthetic write failure");
}
الناتج المتوقع
expected failure observed

تُلاحظ IOException الاصطناعية دون إتلاف نظام ملفات.

انتظار السلوك المختبر

ليعد الاختبار غير المتزامن مهمة وينتظر العملية لينسب فشل ما بعد التعليق. تجنب async void والنوم. استخدم TaskCompletionSource بخيارات استمرار مقصودة للتحكم أوتجريد ساعة صغير إذا هم الوقت. تعطي آلية إكمال صريحة للاختبار تحكما في التعليق والاستئناف دون اعتماد على سرعة جهاز بعينه.

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

العثور على أول ثابت مكسور

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

شغل المناسب واحفظ تراجعات الإصلاح. تقيس التغطية البلوغ والأداء شيئا آخر. قد يحسن الإصدار تفاصيل المصدر فاستخدم رموزا مطابقة ولا تجعل تخطيط المنقح ضمان لغة. احفظ المدخل المصغر وإعداد البناء مع التراجع كي يمكن التمييز لاحقا بين إصلاح حقيقي وتغير عرض التنفيذ.

الأخطاء الشائعة وإصلاحها

ينجح اختبار قبل فشل غير متزامن.

لماذا يحدث؟
لم ينتظر المهمة.
كيف تصلحه؟
أعدها وانتظرها بالنمط المدعوم.
كيف تتجنب تكراره؟
أضف فشلا بعد التعليق.

يقبل الاختبار استثناء خاطئا.

لماذا يحدث؟
يعد كل رمي متوقعا.
كيف تصلحه؟
أكد الفئة والحالة.
كيف تتجنب تكراره؟
احقن فشلا دقيقا.

يطيل اختبار متقلب النوم كإصلاح.

لماذا يحدث؟
حلت التخمينات محل التنسيق.
كيف تصلحه؟
استخدم إشارات جاهزية واكتمال.
كيف تتجنب تكراره؟
أبق المهلة حماية لا مزامنة.

اختبر فهمك

1. صمم اختبارات لصف ممتلئ يحفظ المحتوى عند رفض الإدراج.

اعرض الحل المشروح

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

2. كُبت تحذير nullable ونجحت الاختبارات. ما الدليل الناقص؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • يجعل المرجع المستقل وحالة الفشل الاختبار مفيدا.
  • لاحظ الاكتمال واحقن فشلا مضبوطا.
  • توجه التشخيصات التحقيق وتفسر الثوابت صحة الإصلاح.

المراجع الرسمية