Κυκλωματική Πολυπλοκότητα σε Δοκιμές Λογισμικού με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Η Κυκλωματική Πολυπλοκότητα είναι μια μέτρηση λογισμικού που αναπτύχθηκε από τον Thomas McCabe το 1976 και η οποία μετρά τις ανεξάρτητες διαδρομές μέσω ενός προγράμματος. Υπολογίζεται από ένα γράφημα ροής ελέγχου και δίνει τον αριθμό των δοκιμαστικών περιπτώσεων που απαιτούνται για την πλήρη κάλυψη των κλάδων.
Τι είναι η κυκλωμική πολυπλοκότητα του McCabe;
Κυκλοματική πολυπλοκότητα στη δοκιμή λογισμικού είναι μια μέτρηση δοκιμής που χρησιμοποιείται για τη μέτρηση της πολυπλοκότητας ενός προγράμματος λογισμικού. Είναι ένα ποσοτικό μέτρο ανεξάρτητων διαδρομών στον πηγαίο κώδικα ενός προγράμματος λογισμικού. Η κυκλωματική πολυπλοκότητα μπορεί να υπολογιστεί χρησιμοποιώντας γραφήματα ροής ελέγχου ή σε σχέση με συναρτήσεις, ενότητες, μεθόδους ή κλάσεις σε ένα πρόγραμμα λογισμικού.
Η ανεξάρτητη διαδρομή ορίζεται ως ένα μονοπάτι που έχει τουλάχιστον ένα άκρο που δεν έχει διασχιστεί στο παρελθόν σε καμία άλλη διαδρομή.
Αυτή η μέτρηση αναπτύχθηκε από τον Thomas J. McCabe το 1976 και βασίζεται σε μια αναπαράσταση ροής ελέγχου του προγράμματος. Η ροή ελέγχου απεικονίζει ένα πρόγραμμα ως γράφημα που αποτελείται από κόμβους και άκρες.
Στο γράφημα, οι κόμβοι αντιπροσωπεύουν εργασίες επεξεργασίας ενώ οι ακμές αντιπροσωπεύουν τη ροή ελέγχου μεταξύ των κόμβων.
Σημειογραφία Ροής για ένα Πρόγραμμα
Ο συμβολισμός γραφήματος ροής για ένα πρόγραμμα ορίζει αρκετούς κόμβους που συνδέονται μέσω των άκρων. Ακολουθούν διαγράμματα ροής για εντολές όπως 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
Ιδιότητες της Κυκλωματικής Πολυπλοκότητας
Ακολουθούν οι ιδιότητες της κυκλωματικής πολυπλοκότητας:
- V (G) είναι ο μέγιστος αριθμός ανεξάρτητων μονοπατιών στο γράφημα
- V (G) >=1
- Το G θα έχει ένα μονοπάτι εάν V (G) = 1
- Μια συνήθως χρησιμοποιούμενη οδηγία είναι να διατηρείται το V(G) στο 10 ή χαμηλότερα για μία μόνο ενότητα.
Πώς αυτή η μέτρηση είναι χρήσιμη για τον έλεγχο λογισμικού
Η δοκιμή διαδρομής βάσης είναι μια τεχνική White box και εγγυάται την εκτέλεση τουλάχιστον μίας εντολής κατά τη διάρκεια της δοκιμής. Ελέγχει κάθε γραμμικά ανεξάρτητη διαδρομή μέσω του προγράμματος, πράγμα που σημαίνει ότι Ο αριθμός των απαιτούμενων δοκιμαστικών περιπτώσεων ισούται με την κυκλοματική πολυπλοκότητα του προγράμματος.
Αυτή η μέτρηση είναι χρήσιμη λόγω των ιδιοτήτων της κυκλωματικής πολυπλοκότητας (M) -
- Το M μπορεί να είναι ο αριθμός των δοκιμαστικών περιπτώσεων για την επίτευξη κάλυψης υποκαταστήματος (Ανώτερο όριο)
- Το 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 μπορεί να είναι πολύ πιο δύσκολο να κατανοηθεί. Χρησιμοποιήστε τον αριθμό για να βρείτε υποψηφίους για αξιολόγηση, όχι ως στόχο προς εξαπάτηση.



.png)
.png)