ما هو اختبار الطفرة؟ (مثال)
⚡ ملخص ذكي
يقوم اختبار الطفرات بإدخال أخطاء صغيرة عمداً في التعليمات البرمجية المصدرية ثم يقوم بتشغيل مجموعة الاختبارات الحالية مقابل كل إصدار معيب، لقياس ما إذا كانت تلك الاختبارات قوية بما يكفي لاكتشاف التغيير.
ما هو اختبار الطفرة؟
اختبار الطفرة اختبار الطفرات هو نوع من اختبار البرمجيات يتم فيه تغيير أو تعديل بعض عبارات الكود المصدري للتحقق من قدرة حالات الاختبار على اكتشاف الأخطاء فيه. يهدف هذا النوع من الاختبار إلى ضمان جودة حالات الاختبار من حيث المتانة، بحيث تفشل أمام الكود المصدري المُعدَّل.
يجب أن يكون التغيير الذي يُجرى في برنامج الطفرة ضئيلاً للغاية، حتى لا يؤثر على الهدف العام للبرنامج. يُطلق على اختبار الطفرات أيضًا اسم استراتيجية الاختبار القائمة على الأخطاء، لأنه يتضمن إحداث خطأ في البرنامج عمدًا. وهو شكل من أشكال أبيض Box الاختبار يتم تطبيق ذلك بشكل رئيسي خلال وحدة التجارب.
طُرح اختبار الطفرات في عام 1971 في ورقة بحثية لطالب يُدعى ريتشارد ليبتون، وتمّ إضفاء الطابع الرسمي عليه في ورقة بحثية عام 1978 بعنوان "تلميحات حول اختيار بيانات الاختبار" من تأليف ديميلو وليبتون وسايوارد. وقد فقد هذا الاختبار زخمه بسبب تكلفة الحوسبة في ذلك الوقت، ولكنه استعاد مكانته منذ ذلك الحين لصالح لغات برمجة أخرى. Java، C #، Python, Javaالبرمجة النصية، و XML.
كيفية تنفيذ اختبار الطفرة؟
فيما يلي خطوات تنفيذ اختبار الطفرات، المعروف أيضًا باسم تحليل الطفرات:
الخطوة 1 : يتم إدخال الأخطاء في شفرة المصدر للبرنامج عن طريق إنشاء نسخ متعددة تُسمى الطفرات. يجب أن تحتوي كل طفرة على خطأ واحد، والهدف هو التسبب في فشل نسخة الطفرة، مما يُظهر فعالية حالات الاختبار.
الخطوة 2 : تُطبَّق حالات الاختبار على البرنامج الأصلي وكذلك على البرنامج المُعدَّل. حالة الاختبار يجب أن تكون كافية، ويتم تعديلها لاكتشاف الأخطاء في البرنامج.
الخطوة 3 : قارن نتائج البرنامج الأصلي والبرنامج المتحور.
الخطوة 4 : إذا أنتج البرنامج الأصلي والبرنامج المُعدَّل مخرجات مختلفة، فإن حالة الاختبار ستُبطل البرنامج المُعدَّل. وبالتالي، فإن حالة الاختبار كافية لاكتشاف التغيير بين البرنامج الأصلي والبرنامج المُعدَّل.
الخطوة 5 : إذا أنتج البرنامج الأصلي والبرنامج المُعدَّل نفس المخرجات، يُحتفظ بالبرنامج المُعدَّل. في مثل هذه الحالات، يلزم إنشاء حالات اختبار أكثر فعالية للقضاء على جميع البرامج المُعدَّلة.
الرسم البياني أدناه tracتتضمن نفس الخطوات الخمس، من البرنامج الأصلي مروراً بتوليد الطفرات وصولاً إلى الحكم بالقتل أو البقاء على قيد الحياة.
كيفية إنشاء برامج متحولة؟
الطفرة ليست سوى تغيير نحوي واحد يُجرى على عبارة برمجية. يجب أن يختلف كل برنامج مُطَفَّر عن البرنامج الأصلي بطفرة واحدة فقط.
| البرنامج الأصلي | برنامج المتحولة |
| إذا (س>ص) طباعة "مرحبا" آخر طباعة "مرحبا" |
إذا (س) طباعة "مرحبا" آخر طباعة "مرحبا" |
في المثال أعلاه، لم يتغير سوى عامل المقارنة، ومع ذلك، في حالة الاختبار حيث تكون قيمة x أكبر من قيمة y، تُطبع الآن كلمة "Hi" بدلاً من "Hello". يوضح الرسم التوضيحي هذا التعديل النحوي البسيط.
ما الذي يجب تغييره في برنامج Mutant؟
توجد عدة تقنيات يمكن استخدامها لإنشاء برامج طافرة. وتغطي المجموعات الثلاث التالية معظم عوامل الطفرة التي تأتي مع الأدوات.
| Operaمشغلي الاستبدال | عوامل تعديل التعبير | عوامل تعديل العبارات |
| استبدل المعامل بمعامل آخر (x مع y، أو y مع x) أو بقيمة ثابتة. | استبدل عاملًا، أو أدخل عاملًا جديدًا، في عبارة البرنامج. | يتم تعديل البيانات البرمجية لإنشاء برامج متحولة. |
| على سبيل المثال: إذا (x>y) استبدل قيمتي x وy إذا (5>y) استبدل x بالثابت 5 |
على سبيل المثال: إذا (س==ص) يمكننا استبدال == بـ >= والحصول على البرنامج المتحوّر كما يلي إذا (x>=y) وإدراج ++ في البيان إذا (س==++ص) |
على سبيل المثال: احذف الجزء else في عبارة if-else احذف عبارة if-else بأكملها للتحقق من كيفية عمل البرنامج |
بعض الأمثلة على عوامل الطفرة:
- GOTO استبدال التسمية
- استبدال بيان الإرجاع
- حذف البيان
- إدخال عامل أحادي (مثل - و ++)
- استبدال الموصل المنطقي
- استبدال اسم الصفيف القابل للمقارنة
- حذف جزء else من عبارة if-else
- إضافة أو استبدال عوامل التشغيل
- استبدال البيان عن طريق تغيير البيانات
- تعديل البيانات للمتغيرات
- تعديل أنواع البيانات في البرنامج
Operaتبقى الطفرات التي تلامس شرطًا حدوديًا هي الأكثر بقاءً في أغلب الأحيان، لذا غالبًا ما تشير نتائج الطفرات إلى وجود فجوات في تحليل القيمة الحدودية.
أنواع اختبار الطفرة
In هندسة البرمجيات، يتم تصنيف اختبار الطفرات بشكل أساسي إلى ثلاثة أنواع - طفرة العبارة، وطفرة القيمة، وطفرة القرار.
- طفرة البيان – يتم قص أو لصق أو حذف عبارة، لذا قد تكون النتيجة إزالة بعض أسطر التعليمات البرمجية.
- طفرة القيمة – يتم تعديل قيم المعلمات والثوابت الأساسية، على سبيل المثال تغيير حد الحلقة أو العتبة.
- طفرة القرار – يتم تغيير عبارات التحكم، على سبيل المثال flipping عامل علائقي أو نفي شرط.
تُصنّف الأدوات عوامل التشغيل الخاصة بها تحت هذه العناوين الثلاثة، لذا فإن العائلة التي أنتجت طفرة باقية تُخبر المُختبِر بنوع التأكيد المفقود. عادةً ما تُشير طفرة القرار الباقية إلى فرع غير مُختَبَر، والذي يتداخل مع اختبار الحلقة.
أتمتة اختبار الطفرة
يُعدّ اختبار الطفرات عمليةً معقدةً وتستغرق وقتًا طويلاً عند تنفيذها يدويًا، لذا يُنصح باستخدام أدوات الأتمتة التي تُقلّل التكلفة أيضًا. تقوم أداة الطفرات بتجميع الطفرات، وجدولة عمليات التشغيل، وتسجيل الطفرة التي تم القضاء عليها في كل اختبار فاشل، وتقديم تقرير بالنتيجة.
قائمة الأدوات المتاحة:
- سترايكر — إطار عمل مفتوح المصدر لاختبار الطفرات مع إصدارات لـ Javaالبرنامج النصي و TypeScript (StrykerJS)، وC# و.NET (Stryker.NET)، وScala (Stryker4s).
- PIT، مكتوب أيضًا PITest — نظام اختبار الطفرات لـ Java وJVM الذي يُعدّل الشفرة البايتية المُجمّعة ويتصل بـ Maven و Gradle يبني جنبًا إلى جنب JUnit.
كلاهما يعملان كخطوة بناء، لذا فهما ينتميان إلى نفس المكان التكامل المستمر خط الأنابيب مثل بقية اختبار الأتمتة جناح.
نقاط الطفرة
يتم تعريف درجة الطفرة على أنها النسبة المئوية للطفرات المقتولة من إجمالي عدد الطفرات.
نتيجة الطفرة = (الطفرات المقتولة / العدد الإجمالي للطفرات) * 100
تظهر الصيغة أدناه بالشكل الذي تعرضه معظم الأدوات.
تُوصف حالات الاختبار بأنها كافية للطفرة عندما تصل النتيجة إلى 100%. عمليًا، يجب استبعاد المقام. الطفرات المكافئة — الطفرات التي يتصرف تركيبها المُعدَّل تمامًا مثل الأصل، لذا لا يمكن لأي اختبار إزالتها. لذلك، تُبلغ الأدوات عن الطفرات المُزالة مقسومةً على مجموع الطفرات غير المتكافئة المُزالة والباقية، وتتيح للمختبِر تحديد الطفرات المتكافئة.
أظهرت النتائج التجريبية أن اختبار الطفرات طريقة فعالة لقياس مدى كفاءة حالات الاختبار. أما العيب الرئيسي فيكمن في تكلفة توليد الطفرات وتنفيذ كل حالة اختبار على كل منها.
اختبار الطفرات مقابل Code تغطية
مرتفع تغطية الاختبار لا يُعدّ اختبار التغطية السطرية أو الفرعية اختبارًا قويًا. فهو يُسجّل العبارات التي نُفّذت، وليس ما إذا كان قد تم التحقق من أي شيء لاحقًا، لذا فإن الاختبار الذي يستدعي دالةً ولا يُؤكد أي شيء يُعتبر مُغطّى. يُسدّ اختبار الطفرات هذه الثغرة، لأن الطفرة لا تُعتبر مُغطّاة إلا عند فشل التأكيد فعليًا.
| البعد | Code تغطية | درجة الطفرة |
| ما يقيس | ما هي الخطوط أو الفروع التي نفذتها الاختبارات؟ | ما هي الأخطاء التي تم إدخالها والتي كشفت عنها الاختبارات؟ |
| حساس للتأكيدات | لا — الاختبار الذي لا يحتوي على أي تأكيدات لا يزال يضيف تغطية | نعم، يبقى الكائن المتحول على قيد الحياة عندما لا تفشل أي فرضية. |
| تكلفة الجري | تشغيل اختبار واحد مجهز بأجهزة قياس | تجربة واحدة لكل طفرة باقية، أبطأ بكثير حتى الآن |
| الاستخدام النموذجي | بوابة سريعة في كل عملية إيداع | فحص دوري معمق للوحدات الحيوية |
| وضع الفشل | تغطية بنسبة 100% بدون تحقق حقيقي | متحولون مكافئون لا يمكن قتلهم أبدًا |
المقياسان متكاملان. يشير مقياس التغطية إلى الكود الذي لم يتم الوصول إليه مطلقًا؛ بينما يشير مقياس درجة الطفرة إلى الكود الذي تم الوصول إليه ولم يتم فحصه مطلقًا. وكلاهما يغذي نفس الهدف. عملية إدارة العيوبإلى جانب تدابير مثل كثافة العيوب.
مزايا اختبار الطفرة
فيما يلي مزايا اختبار الطفرة:
- إنها طريقة فعالة لتحقيق تغطية عالية للبرنامج المصدر.
- يختبر مجموعة الاختبارات نفسها، وهو ما لا يفعله أي اختبار آخر تقنية اختبار البرمجيات يفعل ذلك بشكل مباشر.
- يوفر اختبار الطفرات مستوى جيدًا من اكتشاف الأخطاء لمطور البرامج.
- تكشف هذه الطريقة عن الغموض في شفرة المصدر ولديها القدرة على كشف الأخطاء التي لا تصل إليها عمليات التشغيل العادية أبدًا.
- الطفرات الناجية قابلة للتنفيذ: كل منها يشير إلى سطر محدد وتغيير محدد فشلت المجموعة في ملاحظته.
- يستفيد العملاء من هذا الاختبار من خلال حصولهم على نظام أكثر موثوقية واستقراراً.
عيوب اختبار الطفرة
من جهة أخرى، فيما يلي عيوب اختبار الطفرات:
- يُعد اختبار الطفرات مكلفًا للغاية ويستغرق وقتًا طويلاً، لأنه يتطلب إنشاء وتجميع عدد كبير من البرامج المتحولة.
- وبما أن هذا الاختبار يستغرق وقتاً طويلاً، فمن الإنصاف القول إنه لا يمكن إجراؤه بدون أداة أتمتة.
- يتم اختبار كل نسخة معدلة بنفس عدد حالات الاختبار التي يتم اختبارها في البرنامج الأصلي، لذلك يجب تشغيل مجموعة كبيرة من النسخ المعدلة مقابل مجموعة الاختبار بأكملها.
- لا يمكن قتل الطفرات المكافئة بأي اختبار، وعادة ما يتطلب فصلها عن الناجين الحقيقيين مراجعة يدوية.
- لأن هذه الطريقة تُغير شفرة المصدر، فهي غير قابلة للتطبيق على اسود Box الاختبار.
متى يُستخدم اختبار الطفرات؟
يشير مخطط التكلفة المذكور أعلاه إلى أن اختبار الطفرات نادرًا ما يُجرى على قاعدة بيانات كاملة مع كل عملية دمج. ويُغطي تكلفته عندما يكون الخطأ غير المكتشف مكلفًا، ويكون حجم الكود قيد الاختبار صغيرًا بما يكفي ليخضع للتغيير السريع.
- منطق بالغ الأهمية للسلامة أو منطق مالي — حساب المدفوعات، وقواعد الضرائب، وعمليات التحقق من التفويض، حيث يكون الرد الخاطئ الصامت أسوأ من الانهيار.
- أجنحة ذات تغطية عالية بشكل مثير للريبة — عندما تكون نسبة التغطية قريبة من 100 بالمائة ولكن العيوب لا تزال تتسرب.
- إعادة هيكلة الكود القديم — تكشف نتائج الطفرات ما إذا كانت الاختبارات الحالية قادرة على رصد التراجع.
- المكتبات والمكونات المشتركة — عيب في إعادة استخدام عنصر يتضاعف هذا التأثير على كل متصل.
- الفرق تتدرب التنمية القائمة على الاختبار — التحقق من الدرجات للتأكد من أن الاختبارات المكتوبة أولاً تقوم بعمل حقيقي.
لا يُنصح عادةً بتشغيلها على نماذج أولية مؤقتة، أو على مواد لاصقة ضعيفة، أو على كود مُولّد بدون منطق تفرع، أو على مجموعات يهيمن عليها بطء الأداء. اختبارات التكامل والتي تستغرق بالفعل ساعات للمرور الواحد.
لذلك، تحدد معظم الفرق نطاق التشغيل ليشمل الملفات المتغيرة، وتضع حدًا أدنى للوحدات المهمة، وتترك الباقي للوحدات الأوسع. اختبار الانحدار تحمل المجموعة باقي دورة حياة اختبار البرمجيات.



