اختبار قائم على الخصائص في C#: اكتشف الأخطاء التي تفوتها اختبارات الوحدة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

اختبار الوحدة الخاص بك يكذب (وأنت تعلم ذلك)

\n\n

تخيل: لقد كتبت 50 اختبار وحدة، جميعها خضراء، والتغطية 90%. أنت راضٍ. ولكن بعد أسبوع، ينهار الإنتاج. اتضح أن طريقتك SortArray() تعمل بشكل ممتاز مع [1, 2, 3] و [3, 1, 2]، ولكنها تفشل مع [int.MaxValue, -1, 0]. هل هذا مألوف؟

\n\n

مشكلة اختبارات الوحدة التقليدية هي تحيز المطور. أنت تكتب اختبارات بناءً على البيانات التي تتوقعها. المخترقون، المستخدمون الحقيقيون، والحالات الحدودية العشوائية تعيش بقواعد مختلفة.

\n\n

هنا يأتي دور الاختبار القائم على الخصائص في C# (أو الاختبار المبني على الخصائص). بدلاً من التحقق من "إذا كان A، فإن B"، فإنك تصف خصائص يجب أن تكون صحيحة دائمًا. ويقوم الإطار تلقائيًا بتوليد مئات من بيانات الإدخال العشوائية والتحقق من افتراضاتك.

\n\n

في هذه المقالة، سنشرح كيفية تطبيق الاختبار القائم على الخصائص في C# باستخدام مكتبة FsCheck، وسنكتب أمثلة حقيقية ونرى كيف يكتشف الأخطاء التي تفوتها الاختبارات العادية.

\n\n

ما هو الاختبار القائم على الخصائص؟

\n\n

الاختبار القائم على الخصائص هو نهج تقوم فيه بصياغة ثوابت (خصائص) لبرنامجك. على سبيل المثال:

\n
    \n
  • "بعد الفرز، لا يتغير طول المصفوفة"
  • \n
  • "عكس ترتيب السلسلة النصية مرتين يعطي السلسلة الأصلية"
  • \n
  • "مجموع رقمين موجبين يكون دائمًا موجبًا"
  • \n
\n\n

يقوم الإطار (مثل FsCheck) بتوليد عشرات ومئات من بيانات الإدخال العشوائية والتحقق من أن الخاصية تتحقق للجميع. إذا تم العثور على مثال مضاد، يفشل الاختبار وستحصل على القيم المحددة التي كسرت الكود.

\n\n

على عكس اختبارات الوحدة، أنت لا تكتب Assert.AreEqual(3, Add(1,2)). أنت تكتب Assert(x + y == y + x) - وتختبر خاصية التبادلية لآلاف أزواج الأرقام.

\n\n

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

\n\n\n\n\n\n\n\n
اختبارات الوحدةاختبارات قائمة على الخصائص
تتحقق من أمثلة محددةتتحقق من قوانين عامة
البيانات يحددها المطورالبيانات يولدها الإطار
تفوت الحالات الحدوديةتستكشف الحدود تلقائيًا
سهلة القراءةتتطلب تفكيرًا مجردًا
\n\n

مكتبة FsCheck: أداتك الرئيسية

\n\n

في عالم C#، المعيار الفعلي للاختبار القائم على الخصائص هو FsCheck (مشتق أصلاً من مكتبة QuickCheck الخاصة بـ Haskell). يتكامل مع xUnit و NUnit و MSTest.

\n\n

التثبيت بسيط:

\n
dotnet add package FsCheck\ndotnet add package FsCheck.Xunit  // للتكامل مع xUnit
\n\n

يمكن لـ FsCheck توليد بيانات عشوائية للأنواع البدائية (int، string، float)، والقوائم، والمصفوفات، والتوابل، وحتى الأنواع المخصصة (من خلال مولدات مخصصة).

\n\n

كتابة أول اختبار قائم على الخصائص في C#

\n\n

لنبدأ بشيء بسيط: التحقق من أن عملية جمع الأعداد الصحيحة هي عملية تبادلية.

\n\n
using FsCheck;\nusing FsCheck.Xunit;\n\npublic class AdditionTests\n{\n    [Property]\n    public bool Commutative_Addition(int x, int y)\n    {\n        return x + y == y + x;\n    }\n}
\n\n

قم بتشغيل الاختبار. سيقوم FsCheck بتوليد 100 زوج عشوائي من int (افتراضيًا) والتحقق من الخاصية. إذا لم يتم العثور على مثال مضاد، يكون الاختبار أخضر. إذا كنا قد أخطأنا (على سبيل المثال، كتبنا x - y == y - x)، سيفشل الاختبار مع مثال محدد: (5, 3) - لأن 5 - 3 != 3 - 5.

\n\n

تحليل الكود

\n
    \n
  • [Property] - سمة تخبر FsCheck أن هذا اختبار قائم على الخصائص.
  • \n
  • الطريقة ترجع bool - إذا أعادت false، يفشل الاختبار.
  • \n
  • المعلمات int x, int y - سيقوم FsCheck تلقائيًا بتعويض قيم عشوائية.

المدونات

توصيات الكتب