التعقيد الحلقي في اختبار البرمجيات مع مثال

⚡ ملخص ذكي

التعقيد الحلقي هو مقياس برمجي طوره توماس مكابي عام 1976، ويقيس عدد المسارات المستقلة داخل البرنامج. يُحسب هذا المقياس من مخطط تدفق التحكم، ويعطي عدد حالات الاختبار اللازمة لتغطية الفروع بالكامل.

  • 📐 صيغتان: V(G) = E – N + 2 من الرسم البياني، أو V(G) = P + 1 من عدد نقاط القرار.
  • 🧮 المعنى المباشر: تساوي القيمة الحد الأقصى لعدد المسارات المستقلة، وبالتالي عدد حالات الاختبار المطلوبة.
  • 🗺️ أساس الرسم البياني: تمثل العقد خطوات المعالجة، وتمثل الحواف تدفق التحكم بينها.
  • 🟢 شنومكس إلى شنومكس: كود منظم ومكتوب بشكل جيد يتميز بقابلية عالية للاختبار وتكلفة صيانة منخفضة.
  • 🟠 شنومكس إلى شنومكس: شفرة معقدة للغاية ذات قابلية اختبار منخفضة، حيث عادة ما تكون تكلفة إعادة الهيكلة أقل من تكلفة الاختبار.
  • 🛠️ الأدوات: SonarQube, Visual Studio Code تقوم المقاييس والرادون والسحلية بحساب ذلك تلقائيًا.

التعقيد الحلقي في اختبار البرمجيات

ما هو التعقيد الحلقي لمكابي؟

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

يتم تعريف المسار المستقل على أنه مسار له حافة واحدة على الأقل لم يتم اجتيازها من قبل في أي مسارات أخرى.

تم تطوير هذا المقياس بواسطة Thomas J. McCabe في عام 1976 وهو يعتمد على تمثيل تدفق التحكم للبرنامج. يصور تدفق التحكم البرنامج كرسم بياني يتكون من العقد والحواف.

في الرسم البياني، تمثل العقد مهام المعالجة بينما تمثل الحواف تدفق التحكم بين العقد.

التعقيد الحلقي لمكابي

تدوين الرسم البياني الانسيابي لبرنامج

يحدد تدوين الرسم البياني التدفقي لبرنامج ما عدة عقد متصلة عبر الحواف. فيما يلي مخططات التدفق لعبارات مثل if-else و while و until والتسلسل الطبيعي للتدفق.

تدوين الرسم البياني التدفقي للبرنامج

#1 الأفضل بشكل عاماختبار سيغما
9.8/ 10
★ ★ ★ ★ ★
احصل على عرض تجريبي مجاني
PractiTest
9.5/ 10
★ ★ ★ ★ ★
قم بزيارة : PractiTest
Testiny
9.3/ 10
★ ★ ★ ★ ★
قم بزيارة : Testiny
أفضل من أجلاختبار الأتمتةإدارة الاختبارفرق ضمان الجودة الصغيرة والمتوسطة
ميزة رئيسية✓أنشئ اختبارات آلية في ثوانٍ✓إدارة الاختبارات المركزية✓حالات الاختبار اليدوية والآلية
آلية الربط✓Jenkins, Slack، جيرا✓جيرا، Jenkins, Slack✓Jira، GitHub، GitLab
تجربة مجانيّةالتجريب المجانيشنومكس يوم التجربة المجانيةالتجريب المجاني
احصل على عرض تجريبي مجانيقم بزيارة : PractiTestقم بزيارة : Testiny

كيفية حساب التعقيد الحلقي

التمثيل الرياضي:

رياضياً، هي مجموعة من المسارات المستقلة عبر مخطط الرسم البياني. Code يمكن تحديد مدى تعقيد البرنامج باستخدام الصيغة التالية:

V(G) = E - N + 2

أين،

هـ - عدد الحواف

ن – عدد العقد

V (G) = P + 1

حيث P = عدد العقد الأصلية (العقدة التي تحتوي على الشرط)

مثال -

i = 0;
n=4; //N-Number of nodes present in the graph

while (i<n-1) do
j = i + 1;

while (j<n) do

if A[i]<A[j] then
swap(A[i], A[j]);

end do;
j=j+1;

end do;

الرسم البياني التدفق لهذا البرنامج سيكون

حساب التعقيد الحلقي

الحوسبة رياضيا،

  • الخامس(ز) = 9 - 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (العقد الشرطية هي 1,2،3 وXNUMX عقد)

مجموعة أساسية، مسارات التنفيذ المستقلة الأربعة:

  • 1 , 7
  • 1، 2، 6، 1، 7
  • 1، 2، 3، 4، 5، 2، 6، 1، 7
  • 1، 2، 3، 5، 2، 6، 1، 7

خصائص التعقيد الحلقي

فيما يلي خصائص التعقيد الحلقي:

  1. V (G) هو الحد الأقصى لعدد المسارات المستقلة في الرسم البياني
  2. الخامس (ز) >=1
  3. سيكون لـ G مسار واحد إذا كانت V (G) = 1
  4. تتمثل إحدى الإرشادات الشائعة في الحفاظ على قيمة V(G) عند 10 أو أقل للوحدة الواحدة

كيف يفيد هذا المقياس في اختبار البرمجيات؟

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

يعد هذا المقياس مفيدًا بسبب خصائص التعقيد الحلقي (M) -

  1. يمكن أن يكون M عددًا من حالات الاختبار لتحقيق تغطية الفرع (الحد العلوي)
  2. يمكن أن يكون M عدد المسارات من خلال الرسوم البيانية. (الأدنى)

خذ بعين الاعتبار هذا المثال -

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

سيكون التعقيد الحلقي لهذا البرنامج 8-7+2=3.

نظرًا لأن التعقيد تم حسابه على أنه 3، فإن ثلاث حالات اختبار ضرورية لتغطية المسار الكامل للمثال أعلاه.

الخطوات الواجب اتباعها

ينبغي اتباع الخطوات التالية لحساب التعقيد الحلقي وتصميم حالات الاختبار.

الخطوة 1: – إنشاء رسم بياني بالعقد والحواف من الكود

الخطوة 2: – تحديد المسارات المستقلة

الخطوة 3: - حساب التعقيد الحلقي

الخطوة 4: - تصميم حالات الاختبار

بمجرد تشكيل المجموعة الأساسية، حالات تجريبية يجب أن تكون مكتوبة لتنفيذ كافة المسارات.

المزيد عن V (G)

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

يقدم الجدول التالي نظرة عامة على رقم التعقيد والمعنى المقابل لـ v (G):

رقم التعقيد معنى
1 إلى 10

كود منظم ومكتوب بشكل جيد

قابلية اختبار عالية

التكلفة والجهد أقل

11 إلى 20

شفرة معقدة

قابلية اختبار متوسطة

التكلفة والجهد متوسطان

21 إلى 40

شفرة معقدة للغاية

قابلية اختبار منخفضة

التكلفة والجهد مرتفعان

> 40

غير قابلة للاختبار على الإطلاق

تكلفة وجهد مرتفعان للغاية

أدوات لحساب التعقيد السيكلوماتيكي

تتوفر العديد من الأدوات لتحديد تعقيد التطبيق. تُستخدم بعض أدوات حساب التعقيد لتقنيات معينة. يمكن العثور على التعقيد من خلال عدد نقاط القرار في البرنامج. نقاط القرار هي if وfor وfor-each وwhile وdo وcatch وcase في التعليمات البرمجية المصدرية.

ومن أمثلة الأدوات

  • OCLint - محلل الكود الثابت للغة C واللغات ذات الصلة
  • SonarQube – تقارير عن التعقيد الحلقي والمعرفي عبر أكثر من 25 لغة
  • Visual Studio Code المقاييس – تحليل التعقيد الحلقي المدمج لتجميعات .NET
  • رادون وليزارد – محللات تعقيد سطر الأوامر لـ Python وبالنسبة للمشاريع متعددة اللغات على التوالي
  • جيميتريكس - البحث عن المقاييس في Java التطبيقات ذات الصلة

استخدامات التعقيد الحلقي

يمكن أن يكون التعقيد الحلقي مفيدًا جدًا في

  • يساعد المطورين والمختبرين على تحديد عمليات تنفيذ المسار المستقل
  • يمكن للمطورين التأكد من أن جميع المسارات قد تم اختبارها مرة واحدة على الأقل
  • يساعدنا على التركيز أكثر على المسارات المكشوفة
  • تحسين تغطية التعليمات البرمجية في هندسة البرمجيات
  • تقييم المخاطر المرتبطة بالتطبيق أو البرنامج
  • يؤدي استخدام هذه المقاييس في وقت مبكر من الدورة إلى تقليل مخاطر البرنامج

كيفية تقليل التعقيد الحلقي

يُعدّ رقم التعقيد المرتفع مؤشراً، وليس حكماً. وتُعزى معظم عمليات التخفيض الممكنة عملياً إلى أربع عمليات إعادة هيكلة.

  • Extracطريقة t. يؤدي نقل فرع إلى دالة مستقلة إلى تقسيم التعقيد بين وحدتين. يبقى المجموع الكلي للنظام دون تغيير، لكن كل وحدة تصبح قابلة للاختبار بشكل مستقل.
  • استبدل سلسلة الشروط بعملية بحث. يتحول سلم if-else-if الطويل الذي يختبر نفس المتغير إلى خريطة أو مفتاح، مما يؤدي إلى دمج العديد من نقاط القرار في نقطة واحدة.
  • استخدم عبارات الحماية. يؤدي الرجوع المبكر عند إدخال بيانات غير صالحة إلى إزالة التداخل الذي تُنشئه كتلة if-else كبيرة واحدة، دون تغيير السلوك.
  • استبدل العبارات الشرطية بتعدد الأشكال. عندما يعتمد التبديل الشرطي على نوع معين، فإن نقل كل فرع إلى فئته الخاصة يزيل القرار تمامًا.

قبل ذلك، مع V(G) = 4:

if (user != null) {
    if (user.isActive()) {
        if (user.hasRole("admin")) {
            return grantAccess();
        }
    }
}
return denyAccess();

بعد ذلك، مع الحفاظ على نفس السلوك وإزالة التداخل:

if (user == null) return denyAccess();
if (!user.isActive()) return denyAccess();
if (!user.hasRole("admin")) return denyAccess();
return grantAccess();

تحذير بشأن المقياس. يُقاس تعقيد الحلقة بعدد القرارات، لا بصعوبتها. فعبارة switch ذات عشرين حالة بسيطة تُحسب بـ ٢١ نقطة، ومع ذلك يسهل قراءتها، بينما قد يكون فهم كتلة متداخلة بعمق تُحسب بـ ٨ نقاط أصعب بكثير. استخدم الرقم لتحديد الحالات التي تحتاج إلى مراجعة، لا كهدف للتلاعب به.

الأسئلة الشائعة

يُعتبر عشرة عناصر أو أقل لكل وحدة نمطية هو المعيار الشائع. بين 11 و20 عنصرًا، يكون الكود معقدًا ولكنه قابل للإدارة. أما فوق 20 عنصرًا، فتتراجع قابلية الاختبار بشكل حاد، وفوق 40 عنصرًا، تُعتبر الوحدة النمطية غير قابلة للاختبار بشكل عام كما هي مكتوبة.

كلاهما يعطي نفس النتيجة. يُعدّ استخدام P + 1 أسرع في الحساب اليدوي لأنه يقتصر على حساب نقاط القرار فقط. أما E – N + 2 فهو ما تستخدمه الأدوات، لأنها تقوم بالفعل بإنشاء مخطط تدفق التحكم.

ليس بالضرورة. يعتمد تعقيد البرمجة الحلقية على عدد القرارات وليس على مستوى الصعوبة، لذا فإن مفتاحًا بسيطًا بعشرين حالة سهلة يحقق درجة عالية مع الحفاظ على سهولة قراءته. اعتبر العدد بمثابة تذكير للمراجعة.

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

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

تلخيص هذه التدوينة بـ: