Κυκλωματική Πολυπλοκότητα σε Δοκιμές Λογισμικού με Παράδειγμα

⚡ Έξυπνη Σύνοψη

Η Κυκλωματική Πολυπλοκότητα είναι μια μέτρηση λογισμικού που αναπτύχθηκε από τον Thomas McCabe το 1976 και η οποία μετρά τις ανεξάρτητες διαδρομές μέσω ενός προγράμματος. Υπολογίζεται από ένα γράφημα ροής ελέγχου και δίνει τον αριθμό των δοκιμαστικών περιπτώσεων που απαιτούνται για την πλήρη κάλυψη των κλάδων.

  • 📐 Δύο τύποι: V(G) = E – N + 2 από το γράφημα ή V(G) = P + 1 από τον αριθμό των σημείων απόφασης.
  • 🧮 Άμεση σημασία: Η τιμή ισούται με τον μέγιστο αριθμό ανεξάρτητων διαδρομών και, επομένως, με τις απαιτούμενες δοκιμαστικές περιπτώσεις.
  • Βάση Γραφήματος: Οι κόμβοι αντιπροσωπεύουν τα βήματα επεξεργασίας και οι ακμές αντιπροσωπεύουν τη ροή ελέγχου μεταξύ τους.
  • 🟢 1 σε 10: Δομημένος, καλογραμμένος κώδικας με υψηλή δυνατότητα δοκιμής και χαμηλό κόστος συντήρησης.
  • 🟠 21 σε 40: Πολύ σύνθετος κώδικας με χαμηλή δυνατότητα δοκιμής, όπου η ανακατασκευή συνήθως κοστίζει λιγότερο από τη δοκιμή.
  • Εργαλεία: SonarQube, Visual Studio Code Οι μετρήσεις, το ραδόνιο και η Lizard το υπολογίζουν αυτόματα.

Κυκλοματική πολυπλοκότητα στη δοκιμή λογισμικού

Τι είναι η κυκλωμική πολυπλοκότητα του McCabe;

Κυκλοματική πολυπλοκότητα στη δοκιμή λογισμικού είναι μια μέτρηση δοκιμής που χρησιμοποιείται για τη μέτρηση της πολυπλοκότητας ενός προγράμματος λογισμικού. Είναι ένα ποσοτικό μέτρο ανεξάρτητων διαδρομών στον πηγαίο κώδικα ενός προγράμματος λογισμικού. Η κυκλωματική πολυπλοκότητα μπορεί να υπολογιστεί χρησιμοποιώντας γραφήματα ροής ελέγχου ή σε σχέση με συναρτήσεις, ενότητες, μεθόδους ή κλάσεις σε ένα πρόγραμμα λογισμικού.

Η ανεξάρτητη διαδρομή ορίζεται ως ένα μονοπάτι που έχει τουλάχιστον ένα άκρο που δεν έχει διασχιστεί στο παρελθόν σε καμία άλλη διαδρομή.

Αυτή η μέτρηση αναπτύχθηκε από τον Thomas J. McCabe το 1976 και βασίζεται σε μια αναπαράσταση ροής ελέγχου του προγράμματος. Η ροή ελέγχου απεικονίζει ένα πρόγραμμα ως γράφημα που αποτελείται από κόμβους και άκρες.

Στο γράφημα, οι κόμβοι αντιπροσωπεύουν εργασίες επεξεργασίας ενώ οι ακμές αντιπροσωπεύουν τη ροή ελέγχου μεταξύ των κόμβων.

Κυκλοματική πολυπλοκότητα του McCabe

Σημειογραφία Ροής για ένα Πρόγραμμα

Ο συμβολισμός γραφήματος ροής για ένα πρόγραμμα ορίζει αρκετούς κόμβους που συνδέονται μέσω των άκρων. Ακολουθούν διαγράμματα ροής για εντολές όπως if-else, ενώ, μέχρι και κανονική ακολουθία ροής.

Σημειογραφία γραφήματος ροής για ένα πρόγραμμα

Πώς να υπολογίσετε την κυκλωμική πολυπλοκότητα

Μαθηματική αναπαράσταση:

Μαθηματικά, είναι ένα σύνολο ανεξάρτητων διαδρομών μέσω του γραφικού διαγράμματος. Code Η πολυπλοκότητα του προγράμματος μπορεί να οριστεί χρησιμοποιώντας τον τύπο –

V(G) = E - N + 2

Που,

E – Αριθμός άκρων

N – Αριθμός κόμβων

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;

Το γράφημα ροής για αυτό το πρόγραμμα θα είναι

Υπολογίστε την Κυκλοματική Πολυπλοκότητα

Υπολογίζοντας μαθηματικά,

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (Οι κόμβοι συνθήκης είναι 1,2 και 3 κόμβοι)

Βάση σετ, οι τέσσερις ανεξάρτητες διαδρομές εκτέλεσης:

  • 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. V (G) >=1
  3. Το G θα έχει ένα μονοπάτι εάν V (G) = 1
  4. Μια συνήθως χρησιμοποιούμενη οδηγία είναι να διατηρείται το V(G) στο 10 ή χαμηλότερα για μία μόνο ενότητα.

Πώς αυτή η μέτρηση είναι χρήσιμη για τον έλεγχο λογισμικού

Η δοκιμή διαδρομής βάσης είναι μια τεχνική White box και εγγυάται την εκτέλεση τουλάχιστον μίας εντολής κατά τη διάρκεια της δοκιμής. Ελέγχει κάθε γραμμικά ανεξάρτητη διαδρομή μέσω του προγράμματος, πράγμα που σημαίνει ότι Ο αριθμός των απαιτούμενων δοκιμαστικών περιπτώσεων ισούται με την κυκλοματική πολυπλοκότητα του προγράμματος.

Αυτή η μέτρηση είναι χρήσιμη λόγω των ιδιοτήτων της κυκλωματικής πολυπλοκότητας (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

Καθόλου ελεγχόμενο

Πολύ υψηλό κόστος και προσπάθεια

Εργαλεία Υπολογισμού Κυκλωματικής Πολυπλοκότητας

Πολλά εργαλεία είναι διαθέσιμα για τον προσδιορισμό της πολυπλοκότητας της εφαρμογής. Ορισμένα εργαλεία υπολογισμού πολυπλοκότητας χρησιμοποιούνται για συγκεκριμένες τεχνολογίες. Η πολυπλοκότητα μπορεί να βρεθεί από τον αριθμό των σημείων απόφασης σε ένα πρόγραμμα. Τα σημεία απόφασης είναι εάν, για, για κάθε, while, do, catch, δηλώσεις περίπτωσης σε έναν πηγαίο κώδικα.

Παραδείγματα εργαλείων είναι

  • OCLint – Αναλυτής στατικού κώδικα για C και σχετικές γλώσσες
  • SonarQube – Αναφέρει κυκλωματική και γνωστική πολυπλοκότητα σε περισσότερες από 25 γλώσσες
  • Visual Studio Code Μετρήσεις – Ενσωματωμένη ανάλυση κυκλωματικής πολυπλοκότητας για συγκροτήματα .NET
  • Ραδόνιο και Lizard – Αναλυτές πολυπλοκότητας γραμμής εντολών για Python και για πολυγλωσσικά έργα αντίστοιχα
  • GMetrics – Βρείτε μετρήσεις στο 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 με είκοσι απλές περιπτώσεις βαθμολογείται με 21, αλλά είναι εύκολη στην ανάγνωση, ενώ ένα βαθιά ένθετο μπλοκ που βαθμολογείται με 8 μπορεί να είναι πολύ πιο δύσκολο να κατανοηθεί. Χρησιμοποιήστε τον αριθμό για να βρείτε υποψηφίους για αξιολόγηση, όχι ως στόχο προς εξαπάτηση.

Συχνές Ερωτήσεις

Η συνήθης οδηγία είναι δέκα ή λιγότερες ανά ενότητα. Μεταξύ 11 και 20, ο κώδικας είναι πολύπλοκος αλλά διαχειρίσιμος. Πάνω από 20, η δοκιμασιμότητα μειώνεται απότομα και πάνω από 40, η ενότητα θεωρείται γενικά μη δοκιμασμένη όπως έχει γραφτεί.

Και οι δύο δίνουν το ίδιο αποτέλεσμα. Η μέθοδος P + 1 είναι ταχύτερη για τον υπολογισμό με το χέρι, επειδή μετράτε μόνο τα σημεία απόφασης. Η μέθοδος E – N + 2 είναι αυτή που χρησιμοποιούν τα εργαλεία, καθώς ήδη κατασκευάζουν το γράφημα ροής ελέγχου.

Όχι απαραίτητα. Η κυκλική πολυπλοκότητα μετράει τις αποφάσεις και όχι τη δυσκολία, επομένως μια επίπεδη αλλαγή με είκοσι απλές περιπτώσεις βαθμολογείται υψηλά, ενώ παραμένει εύκολη στην ανάγνωση. Αντιμετωπίστε τον αριθμό ως προτροπή για επανάληψη.

Το συνδυάζουν με τη συχνότητα αλλαγών και το ιστορικό ελαττωμάτων για να κατατάξουν ποιες ενότητες ενέχουν τον μεγαλύτερο κίνδυνο, κατευθύνοντας την προσπάθεια αναθεώρησης και δοκιμής στον κώδικα που είναι πιο πιθανό να αποτύχει.

Ναι. Οι βοηθοί της τεχνητής νοημοσύνης προτείνουν ρήτρες προστασίας, π.χ.tracμεθόδους ted και πίνακες αναζήτησης που μειώνουν τον αριθμό. Επαληθεύστε τη συμπεριφορά με την υπάρχουσα σουίτα δοκιμών, επειδή μια αναδιάρθρωση που αλλάζει τη λογική ακυρώνει τον σκοπό.

Συνοψίστε αυτήν την ανάρτηση με: