اختبار عشوائي

الاختبار العشوائي هو أسلوب لاختبار البرمجيات من خلال توليد مدخلات عشوائية ومستقلة. تُقارن نتائج المخرجات بمواصفات البرنامج للتحقق من نجاح أو فشل الاختبار. [ 1 ] في حال عدم وجود مواصفات، تُستخدم استثناءات اللغة ، ما يعني أنه إذا ظهر استثناء أثناء تنفيذ الاختبار، فهذا يدل على وجود خلل في البرنامج. كما يُستخدم هذا الأسلوب لتجنب الاختبار المتحيز.

تاريخ الاختبارات العشوائية

تم فحص الاختبار العشوائي للأجهزة لأول مرة بواسطة ميلفين بروير في عام 1971، وقامت براتيما وفيشواني أغراوال ببذل جهد أولي لتقييم فعاليته في عام 1975. [ 2 ]

في مجال البرمجيات، قام دوران ونتافوس بدراسة الاختبار العشوائي في عام 1984. [ 3 ]

وصف هاودن في كتابه "الاختبار الوظيفي والتحليل" استخدام اختبار الفرضيات كأساس نظري للاختبار العشوائي . كما تضمن الكتاب تطوير صيغة بسيطة لتقدير عدد الاختبارات (n) اللازمة للحصول على ثقة لا تقل عن 1-1/ n في معدل فشل لا يتجاوز 1/n. وتُعرف هذه الصيغة بالحد الأدنى n log n ، مما يشير إلى العدد الكبير من الاختبارات الخالية من الفشل اللازمة للحصول على ثقة ولو متواضعة في حد معقول لمعدل الفشل. [ 4 ]

ملخص

لنفترض دالة C++ التالية:

int myAbs ( int x ) { if ( x > 0 ) { return x ; } else { return x ; // خطأ: يجب أن تكون القيمة '-x' } }

يمكن أن تكون الاختبارات العشوائية لهذه الدالة {123، 36، -35، 48، 0}. القيمة '-35' فقط هي التي تُفعّل الخطأ. إذا لم يكن هناك تطبيق مرجعي للتحقق من النتيجة، فقد يمر الخطأ دون أن يُكتشف. مع ذلك، يمكن إضافة شرط للتحقق من النتائج، مثل:

void testAbs ( int n ) { for ( int i = 0 ; i < n ; i ++ ) { int x = getRandomInput (); int result = myAbs ( x ); assert ( result >= 0 ); } }

تتوفر أحيانًا نسخة مرجعية للتنفيذ، على سبيل المثال عند تطبيق خوارزمية بسيطة بطريقة أكثر تعقيدًا لتحسين الأداء. على سبيل المثال، لاختبار تنفيذ خوارزمية شونهاج-ستراسن ، يمكن استخدام عملية الضرب القياسية "*" على الأعداد الصحيحة.

int getRandomInput () { // … }void testFastMultiplication ( int n ) { for ( int i = 0 ; i < n ; i ++ ) { long x = getRandomInput (); long y = getRandomInput (); long result = fastMultiplication ( x , y ); assert ( x * y == result ); } }

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

حول العشوائية

وفقًا للورقة البحثية الرائدة حول الاختبار العشوائي التي كتبها د. هاملت

[...] يشير المعنى التقني والرياضي لمصطلح "الاختبار العشوائي" إلى غياب "المنهجية" في اختيار بيانات الاختبار، بحيث لا توجد علاقة بين الاختبارات المختلفة. [ 1 ]

نقاط القوة والضعف

يُشيد بالاختبار العشوائي للمزايا التالية:

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

تم وصف نقاط الضعف التالية  :

  • لا يكتشف إلا الأخطاء الأساسية (مثل إلغاء مرجعية المؤشر الفارغ ).
  • لا تكون دقيقة إلا بقدر دقة المواصفات، والمواصفات عادة ما تكون غير دقيقة.
  • إنها تقارن بشكل سيئ مع التقنيات الأخرى للعثور على الأخطاء (مثل تحليل البرامج الثابتة ).
  • إذا تم اختيار مدخلات مختلفة عشوائياً في كل عملية اختبار، فقد يؤدي ذلك إلى مشاكل في التكامل المستمر لأن نفس الاختبارات ستنجح أو تفشل بشكل عشوائي. [ 6 ]
  • يرى البعض أنه من الأفضل تغطية جميع الحالات ذات الصلة بعناية باستخدام اختبارات مصممة يدويًا بطريقة الصندوق الأبيض، بدلاً من الاعتماد على العشوائية. [ 6 ]
  • قد يتطلب الأمر عددًا كبيرًا جدًا من الاختبارات للوصول إلى مستويات ثقة متواضعة في معدلات الفشل المتواضعة. على سبيل المثال، سيتطلب الأمر 459 اختبارًا خاليًا من الفشل للوصول إلى ثقة بنسبة 99% على الأقل بأن احتمال الفشل أقل من 1/100. [ 4 ]

أنواع الاختبارات العشوائية

فيما يتعلق بالمدخلات

  • توليد تسلسل إدخال عشوائي (أي تسلسل من استدعاءات الأساليب)
  • تسلسل عشوائي لمدخلات البيانات (يُسمى أحيانًا الاختبار العشوائي) - على سبيل المثال، تسلسل عشوائي لاستدعاءات الأساليب
  • اختيار البيانات العشوائية من قاعدة البيانات الموجودة

موجه مقابل غير موجه

  • توليد اختبارات عشوائية غير موجهة - بدون أي قواعد استدلالية لتوجيه عملية البحث
  • توليد اختبار عشوائي موجه - على سبيل المثال "توليد اختبار عشوائي موجه بالتغذية الراجعة" [ 7 ] و "الاختبار العشوائي التكيفي" [ 8 ]

التطبيقات

بعض الأدوات التي تُنفذ الاختبارات العشوائية:

  • QuickCheck - أداة اختبار شهيرة، تم تطويرها في الأصل للغة Haskell ولكن تم نقلها إلى العديد من اللغات الأخرى، تقوم بإنشاء تسلسلات عشوائية من استدعاءات واجهة برمجة التطبيقات بناءً على نموذج وتتحقق من خصائص النظام التي يجب أن تظل صحيحة بعد كل تشغيل.
  • Randoop - يقوم بإنشاء تسلسلات من الطرق واستدعاءات المُنشئ للفئات قيد الاختبار، ثم يُنشئ اختبارات JUnit منها.
  • Simulant - أداة مكتوبة بلغة Clojure تُجري محاكاة لوكلاء مختلفين (مثل المستخدمين ذوي أنماط سلوكية مختلفة) استنادًا إلى نموذج إحصائي لسلوكهم، وتسجل جميع الإجراءات والنتائج في قاعدة بيانات لاستكشافها والتحقق منها لاحقًا.
  • AutoTest - أداة مدمجة في EiffelStudio لاختبار كود Eiffel تلقائيًا باستخدام عقود تستند إلى النموذج الأولي البحثي الذي يحمل الاسم نفسه . [ 5 ]
  • بنية اختبار York القابلة للتوسيع (YETI) - أداة مستقلة عن اللغة تستهدف لغات برمجة مختلفة (Java، JML، CoFoJa، .NET، C، Kermeta).
  • GramTest - أداة اختبار عشوائية تعتمد على القواعد النحوية مكتوبة بلغة Java، وتستخدم تدوين BNF لتحديد قواعد الإدخال.

نقد

يقتصر استخدام الاختبار العشوائي على مجال متخصص في الممارسة العملية، ويرجع ذلك في الغالب إلى ندرة توفر مصدر موثوق فعال، بالإضافة إلى الصعوبات المتعلقة بالملف التشغيلي وتوليد قيم الإدخال شبه العشوائية. [ 1 ]

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

بالنسبة للغات البرمجة والمنصات التي تعتمد على العقود (مثل Eiffel و.NET أو امتدادات Java المختلفة مثل JML وCoFoJa...)، تعمل العقود كأدوات طبيعية للكشف عن الأخطاء، وقد طُبّق هذا النهج بنجاح. [ 5 ] وعلى وجه الخصوص، يكشف الاختبار العشوائي عن أخطاء أكثر من عمليات الفحص اليدوي أو تقارير المستخدمين (وإن كانت مختلفة). [ 9 ]

انظر أيضاً

مراجع

  1. 1 2 3 ريتشارد هاملت (1994). "الاختبار العشوائي". في جون ج. مارسينياك (محرر). موسوعة هندسة البرمجيات (  الطبعة الأولى). جون وايلي وأولاده. ISBN 978-0471540021.
  2. أغراوال، ب.؛ أغراوال، ف.د. (1 يوليو 1975). "التحليل الاحتمالي لطريقة توليد الاختبارات العشوائية لشبكات المنطق التوافقي غير الزائدة". معاملات IEEE في الحوسبة . C-24 (7): 691-695 . doi : 10.1109/TC.1975.224289 .
  3. دوران، جيه دبليو؛ نتافوس، إس سي (1 يوليو 1984). "تقييم الاختبار العشوائي". معاملات IEEE في هندسة البرمجيات . SE-10 (4): 438-444 . doi : 10.1109/TSE.1984.5010257 .
  4. 1 2 هاودن، ويليام (1987). اختبار وتحليل البرامج الوظيفية . نيويورك: ماكجرو هيل. ص 51-53 . ISBN  0-07-030550-1.
  5. 1 2 3 "AutoTest - كرسي هندسة البرمجيات" . se.inf.ethz.ch. تم الاطلاع عليه بتاريخ 15 نوفمبر 2017 .
  6. 1 2 "هل يُعدّ توليد بيانات الاختبار عشوائيًا ممارسة سيئة؟" . stackoverflow.com . تم الاطلاع عليه بتاريخ 15 نوفمبر 2017 .
  7. باتشيكو، كارلوس؛ شوفيندو ك. لاهيري؛ مايكل د. إرنست؛ توماس بول (مايو 2007). "توليد اختبارات عشوائية موجهة بالتغذية الراجعة" (ملف PDF) . المؤتمر الدولي التاسع والعشرون لهندسة البرمجيات (ICSE'07) . الصفحات 75-84 . doi : 10.1109/ICSE.2007.37 . ISBN  978-0-7695-2828-1ISSN 0270-5257 
  8. تي واي تشين؛ إف سي كو؛ آر جي ميركل؛ تي إتش تسيه (2010)، "الاختبار العشوائي التكيفي: فن تنوع حالات الاختبار" ، مجلة الأنظمة والبرمجيات ، 83 (1): 60-66 ، doi : 10.1016/j.jss.2009.02.022 ، hdl : 10722/89054
  9. إيلينكا سيوبا؛ ألكسندر بريتشنر؛ مانويل أوريول؛ أندرياس لايتنر؛ برتراند ماير (2009). "حول عدد وطبيعة الأخطاء التي تم اكتشافها عن طريق الاختبار العشوائي". اختبار البرمجيات والتحقق منها وموثوقيتها . 21 : 3-28 . doi : 10.1002/stvr.415 .