تغطية التعليمات البرمجية

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

كانت تغطية الكود من بين أولى الطرق التي تم ابتكارها لاختبار البرمجيات بشكل منهجي . وكان أول مرجع منشور من قبل ميلر ومالوني في مجلة الاتصالات التابعة لجمعية آلات الحوسبة (ACM) في عام 1963. [ 3 ]

معايير التغطية

لقياس نسبة تنفيذ مجموعة الاختبارات للتعليمات البرمجية ، يُستخدم معيار تغطية واحد أو أكثر . وعادةً ما تُعرَّف هذه المعايير على أنها قواعد أو متطلبات يجب أن تستوفيها مجموعة الاختبارات. [ 4 ]

معايير التغطية الأساسية

هناك عدد من معايير التغطية، ولكن أهمها هي: [ 5 ]

  • تغطية الوظائف - هل تم استدعاء كل وظيفة (أو روتين فرعي ) في البرنامج؟ 
  • تغطية العبارات هل تم تنفيذ كل عبارة في البرنامج؟ 
  • تغطية الحواف - هل تم تنفيذ كل حافة في مخطط تدفق التحكم ؟  
    • تغطية الفروع - هل تم تنفيذ كل فرع (يُسمى أيضًا مسار DD ) من كل بنية تحكم (كما هو الحال في عبارات if و case )؟ على سبيل المثال، بالنظر إلى عبارة if ، هل تم تنفيذ كل من الفرعين الصحيح والخاطئ ؟ (هذا جزء من تغطية الحواف ) . 
  • تغطية الشرط - هل تم تقييم كل تعبير فرعي منطقي إلى صحيح وخطأ؟ (تسمى أيضًا تغطية المسند.) 

على سبيل المثال، انظر إلى دالة C التالية :

دالة foo ( int x , int y ) { int z = 0 ; if (( x > 0 ) && ( y > 0 )) { z = x ; } return z ; }

افترض أن هذه الوظيفة جزء من برنامج أكبر، وأن هذا البرنامج تم تشغيله باستخدام مجموعة اختبار معينة.

  • سيتم استيفاء تغطية الوظيفةfoo إذا تم استدعاء الوظيفة مرة واحدة على الأقل أثناء هذا التنفيذ.
  • سيتم استيفاء تغطية العبارة لهذه الوظيفة إذا تم استدعاؤها على سبيل المثال كـ foo(1,1)، لأنه في هذه الحالة، سيتم تنفيذ كل سطر في الوظيفة - بما في ذلك z = x;.
  • سيتم تلبية تغطية الفروعfoo(1,1) من خلال الاختبارات التي تستدعي و foo(0,1)لأنه في الحالة الأولى، ifيتم استيفاء كلا الشرطين ويتم z = x;تنفيذ ، بينما في الحالة الثانية، (x>0)لا يتم استيفاء الشرط الأول ، مما يمنع تنفيذ z = x;.
  • سيتم استيفاء تغطية الشروطfoo(1,0) بالاختبارات التي تستدعي ، foo(0,1)و ، و foo(1,1). هذه الاختبارات ضرورية لأن في الحالة الأولى، (x>0)يتم تقييم إلى true، بينما في الثانية، يتم تقييمها إلى false. في الوقت نفسه، تجعل الحالة الأولى (y>0)false، بينما لا يتم تقييمها في الحالة الثانية (y>0)(بسبب التقييم المؤجل للمعامل المنطقي)، وتجعلها الحالة الثالثة true.

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

إذا كان a و فإن

يمكن استيفاء شروط التغطية من خلال اختبارين:

  • a=true،b=false
  • a=false،b=true

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

قد يكون حقن الأخطاء ضرورياً لضمان أن جميع الشروط وفروع التعليمات البرمجية لمعالجة الاستثناءات تتمتع بتغطية كافية أثناء الاختبار.

تغطية الحالة/القرار المعدلة

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

يتطلب تغطية الشرط/القرار استيفاء كل من تغطية القرار وتغطية الشرط. مع ذلك، في التطبيقات بالغة الأهمية للسلامة (مثل برمجيات إلكترونيات الطيران )، يُشترط غالبًا استيفاء تغطية الشرط/القرار المُعدّلة (MC/DC) . يُوسّع هذا المعيار معايير الشرط/القرار ليشمل اشتراطاتٍ تُلزم بأن يؤثر كل شرط على نتيجة القرار بشكل مستقل.

على سبيل المثال، انظر إلى الكود التالي:

إذا كان ( أ أو ب ) و ج، فإن

سيتم استيفاء الشرط/معايير القرار من خلال مجموعة الاختبارات التالية:

أبج
حقيقيحقيقيحقيقي
خطأ شنيعخطأ شنيعخطأ شنيع

مع ذلك، لن تفي مجموعة الاختبارات المذكورة أعلاه بمتطلبات تغطية الشرط/القرار المعدلة، إذ أن قيمة 'b' في الاختبار الأول وقيمة 'c' في الاختبار الثاني لن تؤثرا على الناتج. لذا، يلزم استخدام مجموعة الاختبارات التالية لتحقيق متطلبات تغطية الشرط/القرار المعدلة:

أبج
خطأ شنيعحقيقيخطأ شنيع
خطأ شنيعحقيقيحقيقي
خطأ شنيعخطأ شنيعحقيقي
حقيقيخطأ شنيعحقيقي

تغطية متعددة الحالات

يتطلب هذا المعيار اختبار جميع تركيبات الشروط داخل كل قرار. على سبيل المثال، سيتطلب جزء الكود من القسم السابق ثمانية اختبارات:

أبج
خطأ شنيعخطأ شنيعخطأ شنيع
خطأ شنيعخطأ شنيعحقيقي
خطأ شنيعحقيقيخطأ شنيع
خطأ شنيعحقيقيحقيقي
حقيقيخطأ شنيعخطأ شنيع
حقيقيخطأ شنيعحقيقي
حقيقيحقيقيخطأ شنيع
حقيقيحقيقيحقيقي

تغطية قيم المعلمات

تتطلب تغطية قيم المعاملات (PVC) مراعاة جميع القيم الشائعة للمعاملات في أي دالة تستقبل معاملات. الفكرة هي اختبار جميع القيم الشائعة الممكنة للمعامل. [ 8 ] على سبيل المثال، القيم الشائعة للسلسلة النصية هي: 1) قيمة فارغة (null )، 2) قيمة فارغة، 3) مسافات بيضاء (مسافة، علامات جدولة، سطر جديد)، 4) سلسلة نصية صحيحة، 5) سلسلة نصية غير صحيحة، 6) سلسلة نصية أحادية البايت، 7) سلسلة نصية ثنائية البايت. قد يكون من المناسب أيضًا استخدام سلاسل نصية طويلة جدًا. قد يؤدي عدم اختبار كل قيمة محتملة للمعامل إلى ظهور خطأ برمجي. اختبار قيمة واحدة فقط من هذه القيم قد يحقق تغطية كاملة للكود بنسبة 100%، حيث يتم تغطية كل سطر، ولكن نظرًا لاختبار قيمة واحدة فقط من أصل سبع قيم، فإن تغطية قيم المعاملات لا تتجاوز 14.2%.

معايير التغطية الأخرى

هناك معايير تغطية إضافية، يتم استخدامها بشكل أقل تكراراً:

  • تغطية تسلسل التعليمات البرمجية الخطية والقفز (LCSAJ) والمعروفة أيضًا باسم تغطية مسار JJ - هل تم تنفيذ كل مسار LCSAJ/JJ؟ [ 9 ] 
  • تغطية المسار - هل تم تنفيذ كل مسار ممكن عبر جزء معين من الكود؟ 
  • تغطية الدخول/الخروج هل تم تنفيذ كل استدعاء وإرجاع ممكن للدالة؟ 
  • تغطية الحلقة - هل تم تنفيذ كل حلقة ممكنة صفر مرة، ومرة ​​واحدة، وأكثر من مرة؟ 
  • تغطية الحالة ​​هل تم الوصول إلى كل حالة في آلة ذات حالات محدودة واستكشافها؟ 
  • تغطية تدفق البيانات هل تم الوصول إلى تعريف كل متغير واستخدامه واستكشافه؟ [ 10 ] 

غالبًا ما تتطلب التطبيقات بالغة الأهمية للسلامة أو التطبيقات التي تتطلب موثوقية عالية إثبات تغطية اختبارية بنسبة 100%. على سبيل المثال، يشترط معيار ECSS -E-ST-40C تغطية كاملة للبيانات والقرارات لاثنين من أصل أربعة مستويات حرجة مختلفة؛ أما بالنسبة للمستويات الأخرى، فتُحدد قيم التغطية المستهدفة بالتفاوض بين المورد والعميل. [ 11 ] ومع ذلك، فقد تعرض تحديد قيم مستهدفة محددة - وخاصةً 100% - لانتقادات من قبل المختصين لأسباب مختلفة (انظر [ 12 ] ). يكتب مارتن فاولر : "سأشك في أي شيء قريب من 100% - فهذا يوحي بأن أحدهم يكتب الاختبارات لمجرد تحقيق أرقام التغطية المطلوبة، دون التفكير في الغاية من ذلك". [ 13 ]

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

تغطية المسار الكامل، من النوع الموصوف أعلاه، عادة ما تكون غير عملية أو مستحيلة. أي وحدة نمطية تحتوي على سلسلة منن{\displaystyle n}يمكن أن تصل القرارات التي تتخذها إلى2ن{\displaystyle 2^{n}}المسارات داخلها؛ يمكن أن تؤدي بنيات الحلقات إلى عدد لا نهائي من المسارات. قد تكون العديد من المسارات غير قابلة للتنفيذ، حيث لا يوجد مدخل للبرنامج قيد الاختبار يمكن أن يتسبب في تنفيذ هذا المسار المحدد. ومع ذلك، فقد ثبت استحالة وجود خوارزمية عامة لتحديد المسارات غير القابلة للتنفيذ (يمكن استخدام مثل هذه الخوارزمية لحل مشكلة التوقف ). [ 14 ] يُعد اختبار مسار الأساس ، على سبيل المثال، طريقة لتحقيق تغطية كاملة للفروع دون تحقيق تغطية كاملة للمسارات. [ 15 ]

تحاول طرق اختبار تغطية المسار العملي تحديد فئات مسارات التعليمات البرمجية التي تختلف فقط في عدد عمليات تنفيذ الحلقة، ولتحقيق تغطية "المسار الأساسي"، يجب على المختبِر تغطية جميع فئات المسار. [ 16 ]

عملياً

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

عند تطبيق سياسات تغطية الاختبار ضمن بيئة تطوير البرمجيات، يجب مراعاة ما يلي:

  • ما هي متطلبات التغطية اللازمة لاعتماد المنتج النهائي، وإذا كان الأمر كذلك، فما هو مستوى تغطية الاختبار المطلوب؟ يكون مستوى التدرج النموذجي للصرامة كما يلي: البيان، التفرع/القرار، تغطية الحالة/القرار المعدلة (MC/DC)، LCSAJ ( تسلسل الكود الخطي والقفز ).
  • هل سيتم قياس التغطية مقابل الاختبارات التي تتحقق من المتطلبات المفروضة على النظام قيد الاختبار ( DO-178B
  • هل يمكن تتبع الكود البرمجي الناتج مباشرةً إلى عبارات الكود المصدري؟ تتطلب بعض الشهادات (مثل DO-178B المستوى A) تغطية على مستوى التجميع إذا لم يكن الأمر كذلك: "عندئذٍ، يجب إجراء تحقق إضافي على الكود البرمجي للتأكد من صحة تسلسلات الكود الناتجة" ( DO-178B ) الفقرة 6.4.4.2. [ 18 ]

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

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

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

يستخدم معظم مطوري البرامج المحترفين تغطية C1 وC2. تشير C1 إلى تغطية العبارات، بينما تشير C2 إلى تغطية الفروع أو الشروط. وباستخدام مزيج من C1 وC2، يُمكن تغطية معظم العبارات في قاعدة التعليمات البرمجية. تشمل تغطية العبارات أيضًا تغطية الدوال (بما في ذلك نقاط الدخول والخروج)، والحلقات، والمسارات، وتدفق الحالة، وتدفق التحكم، وتدفق البيانات. بهذه الطرق، يُمكن تحقيق تغطية شبه كاملة للتعليمات البرمجية في معظم مشاريع البرامج. [ 19 ]

أدوات تغطية التعليمات البرمجية البارزة

مصنعي الأجهزة

برمجة

الاستخدام في الصناعة

تُعدّ تغطية الاختبارات أحد الاعتبارات في اعتماد سلامة معدات إلكترونيات الطيران. وتُوثّق الإرشادات التي تعتمدها إدارة الطيران الفيدرالية (FAA) لاعتماد معدات إلكترونيات الطيران في المعيارين DO-178B [ 18 ] و DO-178C [ 20 ] .

كما أن تغطية الاختبار هي أحد المتطلبات في الجزء 6 من معيار السلامة الخاص بالسيارات ISO 26262 المركبات على الطرق - السلامة الوظيفية . [ 21 ]

انظر أيضاً

مراجع

  1. برادر، لاري؛ هيلكر، هاوي؛ ويلز، آلان (2 مارس 2013). "الفصل 2: ​​اختبار الوحدة: اختبار الداخل". الاختبار من أجل التسليم المستمر باستخدام Visual Studio 2012. مايكروسوفت. ص  30. ISBN 978-1621140184تم الاطلاع عليه بتاريخ 16 يونيو 2016 .
  2. ويليامز، لوري ؛ سميث، بن؛ هيكمان، سارة. "تغطية الاختبار باستخدام EclEmma" . ندوة مفتوحة في هندسة البرمجيات . جامعة ولاية كارولينا الشمالية. مؤرشف من الأصل في 14 مارس 2016. تم الاسترجاع في 16 يونيو 2016 .
  3. جوان سي. ميلر، وكليفورد جيه. مالوني (فبراير 1963). "تحليل الأخطاء المنهجية في برامج الحاسوب الرقمية" . مجلة اتصالات رابطة مكائن ​​الحوسبة . 6 (2). نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة مكائن ​​الحوسبة : 58-63 . doi : 10.1145/366246.366248 . ISSN 0001-0782 . 
  4. بول أمان، جيف أوفوت (2013). مقدمة في اختبار البرمجيات . مطبعة جامعة كامبريدج.
  5. جلينفورد ج. مايرز (2004). فن اختبار البرمجيات، الطبعة الثانية . وايلي. ISBN 0-471-46912-2.
  6. ورقة موقف CAST-10 (يونيو 2002). ما هو "القرار" في تطبيق تغطية الشرط/القرار المعدلة (MC/DC) وتغطية القرار (DC)؟
  7. ماث ووركس. أنواع تغطية النموذج.
  8. "اختبار الوحدة مع تغطية قيمة المعلمة (PVC)" . 8 مايو 2012.
  9. MR Woodward, MA Hennel, “حول العلاقة بين معيارين لتغطية تدفق التحكم: جميع مسارات JJ و MCDC”, تكنولوجيا المعلومات والبرمجيات 48 (2006) ص 433-440
  10. ^ تينغ سو، كي وو، ويكاي مياو، غيغوانغ بو، جيفنغ هي، يوتينج تشين، وزيندونغ سو. “مسح حول اختبار تدفق البيانات”. ايه سي ام للحوسبة. Surv. 50، 1، المادة 5 (مارس 2017)، 35 صفحة.
  11. ECSS-E-ST-40C: هندسة الفضاء - البرمجيات. أمانة ECSS، وكالة الفضاء الأوروبية - مركز أبحاث وتطوير هندسة الفضاء (ESA-ESTEC). مارس 2009
  12. سي. براوز، ج. فيرنر، ك. هورنيغ، س. بوسيكر، م. كورمان (2017): هل تغطية الاختبار بنسبة 100% شرط معقول؟ دروس مستفادة من مشروع برمجيات فضائية . في: PROFES 2017. سبرينغر. تاريخ آخر دخول: 17-11-2017
  13. مدونة مارتن فاولر: تغطية الاختبار. تاريخ آخر دخول: ١٧ نوفمبر ٢٠١٧
  14. دورف، ريتشارد سي.: الحواسيب، وهندسة البرمجيات، والأجهزة الرقمية ، الفصل 12، صفحة 15. دار نشر سي آر سي، 2006. رقم ISBN 0-8493-7340-9، ISBN 978-0-8493-7340-4عبر بحث جوجل للكتب
  15. واي إن سريكانت؛ بريتي شانكار (2002). دليل تصميم المترجمات: التحسينات وتوليد كود الآلة . مطبعة سي آر سي. ص 249. ISBN  978-1-4200-4057-9.
  16. ماركوزي، م.؛ باردين، سيباستيان؛ كوسماتوف، ن.؛ باباداكيس، مايك؛ بريفوستو، فيرجيل؛ كورينسون، لويك (2018). "حان وقت تنظيف أهداف الاختبار". وقائع المؤتمر الدولي الأربعين لهندسة البرمجيات . ص 456-467 . doi : 10.1145/3180155.3180191 . ISBN  978-1-4503-5638-1.
  17. غاروسي، وحيد؛ كيليش، ألبر بوغرا؛ بالامان، يونس؛ ميرمر، ألبر؛ غولر، زينب أوزدمير (مايو 2024). "قياس التغطية في الاختبار القائم على النماذج لتطبيقات الويب: دعم الأدوات وتقرير عن تجربة صناعية". المؤتمر الدولي IEEE لعام 2024 حول ورش عمل اختبار البرمجيات والتحقق منها والتحقق من صحتها (ICSTW) . الصفحات 37-43 . doi : 10.1109/icstw60967.2024.00019 . ISBN  979-8-3503-4479-0.
  18. 1 2 RTCA/ DO-178B ، اعتبارات البرمجيات في أنظمة ومعدات الطيران المعتمدة، اللجنة الفنية اللاسلكية للملاحة الجوية، 1 ديسمبر 1992
  19. بوريس بيزر (2009). تقنيات اختبار البرمجيات، الطبعة الثانية . دار دريمتك للنشر. رقم ISBN 978-81-7722-260-9.
  20. RTCA/ DO-178C ، اعتبارات البرمجيات في أنظمة ومعدات الطيران المعتمدة، اللجنة الفنية الراديوية للملاحة الجوية، يناير 2012.
  21. ISO 26262-6:2011(en) المركبات على الطرق - السلامة الوظيفية - الجزء 6: تطوير المنتج على مستوى البرمجيات . المنظمة الدولية للتوحيد القياسي.