Τι είναι το Mutation Testing; (Παράδειγμα)
⚡ Έξυπνη Σύνοψη
Ο έλεγχος μεταλλάξεων εισάγει σκόπιμα μικρά σφάλματα στον πηγαίο κώδικα και στη συνέχεια εκτελεί την υπάρχουσα σουίτα δοκιμών σε κάθε ελαττωματική έκδοση, μετρώντας εάν αυτές οι δοκιμές είναι αρκετά ισχυρές για να ανιχνεύσουν την αλλαγή.
Τι είναι το Mutation Testing;
Έλεγχος μετάλλαξης είναι ένας τύπος δοκιμής λογισμικού στον οποίο ορισμένες δηλώσεις του πηγαίου κώδικα αλλάζουν ή μεταλλάσσονται, για να ελεγχθεί εάν οι δοκιμαστικές περιπτώσεις είναι σε θέση να εντοπίσουν σφάλματα στον πηγαίο κώδικα. Ο στόχος του Mutation Testing είναι να διασφαλίσει την ποιότητα των δοκιμαστικών περιπτώσεων όσον αφορά την ανθεκτικότητα, έτσι ώστε να αποτύχουν έναντι του μεταλλαγμένου πηγαίου κώδικα.
Η αλλαγή που γίνεται σε ένα μεταλλαγμένο πρόγραμμα πρέπει να διατηρείται εξαιρετικά μικρή, έτσι ώστε να μην επηρεάζει τον συνολικό στόχο του προγράμματος. Ο έλεγχος μεταλλάξεων ονομάζεται επίσης στρατηγική ελέγχου βάσει σφαλμάτων, επειδή περιλαμβάνει την σκόπιμη δημιουργία ενός σφάλματος στο πρόγραμμα. Είναι μια μορφή Λευκό Box Δοκιμές που εφαρμόζεται κυρίως κατά τη διάρκεια Δοκιμή μονάδας.
Ο έλεγχος μεταλλάξεων προτάθηκε το 1971 σε μια φοιτητική εργασία του Richard Lipton και επισημοποιήθηκε στην εργασία του 1978 με τίτλο «Υποδείξεις για την επιλογή δεδομένων δοκιμών» των DeMillo, Lipton και Sayward. Έχασε την ορμή του λόγω του κόστους υπολογιστών της εποχής και έκτοτε έχει ανακτήσει έδαφος για γλώσσες όπως η Java, C#, Python, JavaΣκριπτ και XML.
Πώς να εκτελέσετε τη δοκιμή μετάλλαξης;
Ακολουθούν τα βήματα για την εκτέλεση δοκιμών μετάλλαξης, γνωστές και ως ανάλυση μετάλλαξης:
Βήμα 1: Τα σφάλματα εισάγονται στον πηγαίο κώδικα του προγράμματος δημιουργώντας πολλές εκδόσεις που ονομάζονται μεταλλαγμένες. Κάθε μεταλλαγμένη έκδοση θα πρέπει να περιέχει ένα μόνο σφάλμα και ο στόχος είναι να προκληθεί η αποτυχία της μεταλλαγμένης έκδοσης, γεγονός που καταδεικνύει την αποτελεσματικότητα των δοκιμαστικών περιπτώσεων.
Βήμα 2: Οι δοκιμαστικές περιπτώσεις εφαρμόζονται στο αρχικό πρόγραμμα αλλά και στο μεταλλαγμένο πρόγραμμα. A Δοκιμαστική θήκη θα πρέπει να είναι επαρκής και έχει τροποποιηθεί για να ανιχνεύει σφάλματα σε ένα πρόγραμμα.
Βήμα 3: Συγκρίνετε τα αποτελέσματα του αρχικού και του μεταλλαγμένου προγράμματος.
Βήμα 4: Εάν το αρχικό πρόγραμμα και το μεταλλαγμένο πρόγραμμα παράγουν διαφορετική έξοδο, τότε το μεταλλαγμένο πρόγραμμα τερματίζεται από την δοκιμαστική περίπτωση. Επομένως, η δοκιμαστική περίπτωση είναι αρκετά καλή για να ανιχνεύσει την αλλαγή μεταξύ του αρχικού και του μεταλλαγμένου προγράμματος.
Βήμα 5: Εάν το αρχικό πρόγραμμα και το μεταλλαγμένο πρόγραμμα παράγουν την ίδια έξοδο, το μεταλλαγμένο πρόγραμμα διατηρείται ζωντανό. Σε τέτοιες περιπτώσεις, πρέπει να δημιουργηθούν πιο αποτελεσματικές δοκιμές που σκοτώνουν όλα τα μεταλλαγμένα.
Το παρακάτω διάγραμμα tracείναι τα ίδια πέντε βήματα, από το αρχικό πρόγραμμα μέσω της γενιάς μεταλλαγμένων έως την ετυμηγορία για τον θάνατο ή την επιβίωση.
Πώς να δημιουργήσετε Μεταλλαγμένα Προγράμματα;
Μια μετάλλαξη δεν είναι τίποτα άλλο παρά μια μεμονωμένη συντακτική αλλαγή που γίνεται σε μια εντολή προγράμματος. Κάθε μεταλλαγμένο πρόγραμμα θα πρέπει να διαφέρει από το αρχικό πρόγραμμα κατά ακριβώς μία μετάλλαξη.
| Πρωτότυπο πρόγραμμα | Μεταλλαγμένο πρόγραμμα |
| Αν (x>y) Εκτύπωση "Γεια σου" Αλλού Εκτύπωση "Γεια" |
Αν (x Εκτύπωση "Γεια σου" Αλλού Εκτύπωση "Γεια" |
Στο παραπάνω ζεύγος μόνο ο τελεστής σύγκρισης άλλαξε, ωστόσο μια δοκιμαστική περίπτωση όπου το x είναι μεγαλύτερο από το y τώρα εκτυπώνει "Γεια" αντί για "Γεια". Η εικόνα δείχνει ότι έγινε μία συντακτική επεξεργασία.
Τι να αλλάξετε σε ένα Μεταλλαγμένο Πρόγραμμα;
Υπάρχουν αρκετές τεχνικές που μπορούν να χρησιμοποιηθούν για τη δημιουργία μεταλλαγμένων προγραμμάτων. Οι τρεις παρακάτω οικογένειες καλύπτουν τους περισσότερους τελεστές μεταλλάξεων που συνοδεύουν τα εργαλεία.
| Operaκαι χειριστές αντικατάστασης | Τελεστές τροποποίησης έκφρασης | Τελεστές τροποποίησης δήλωσης |
| Αντικαταστήστε τον τελεστή με έναν άλλο τελεστή (x με y ή y με x) ή με μια σταθερή τιμή. | Αντικατάσταση ενός τελεστή ή εισαγωγή ενός νέου τελεστή σε μια εντολή προγράμματος. | Οι προγραμματικές δηλώσεις τροποποιούνται για τη δημιουργία μεταλλαγμένων προγραμμάτων. |
| Παράδειγμα: If(x>y) αντικαταστήστε τις τιμές x και y Αν(5>y) αντικαταστήστε το x με τη σταθερά 5 |
Παράδειγμα: Αν(x==y) Μπορούμε να αντικαταστήσουμε το == με >= και να έχουμε το μεταλλαγμένο πρόγραμμα ως If(x>=y) και εισάγοντας το ++ στην πρόταση Αν(x==++y) |
Παράδειγμα: Διαγράψτε το άλλο μέρος σε μια δήλωση if-else Διαγράψτε ολόκληρη την εντολή if-else για να ελέγξετε πώς συμπεριφέρεται το πρόγραμμα |
Μερικοί τελεστές μετάλλαξης δείγματος:
- Αντικατάσταση ετικέτας GOTO
- Αντικατάσταση δήλωσης επιστροφής
- Διαγραφή δήλωσης
- Εισαγωγή μοναδιαίου τελεστή (όπως – και ++)
- Λογική αντικατάσταση βύσματος
- Συγκρίσιμη αντικατάσταση ονόματος πίνακα
- Αφαίρεση του μέρους else μιας εντολής if-else
- Προσθήκη ή αντικατάσταση τελεστών
- Αντικατάσταση δήλωσης με αλλαγή των δεδομένων
- Τροποποίηση δεδομένων για τις μεταβλητές
- Τροποποίηση τύπων δεδομένων στο πρόγραμμα
OperaΟι παράγοντες που αγγίζουν μια οριακή συνθήκη επιβιώνουν συχνότερα, επομένως τα αποτελέσματα μεταλλάξεων συχνά υποδεικνύουν κενά σε ανάλυση οριακών τιμών.
Τύποι δοκιμών μετάλλαξης
In Τεχνολογία Λογισμικού, Ο έλεγχος μεταλλάξεων κατηγοριοποιείται ουσιαστικά σε τρεις τύπους — μετάλλαξη δήλωσης, μετάλλαξη τιμής και μετάλλαξη απόφασης.
- Δήλωση Μετάλλαξης – μια πρόταση αποκόπτεται, επικολλάται ή διαγράφεται, επομένως το αποτέλεσμα μπορεί να είναι η αφαίρεση ορισμένων γραμμών κώδικα.
- Μετάλλαξη Αξίας – οι τιμές των κύριων παραμέτρων και των σταθερών τροποποιούνται, για παράδειγμα αλλάζοντας ένα όριο βρόχου ή ένα κατώφλι.
- Μετάλλαξη Απόφασης – οι εντολές ελέγχου αλλάζουν, για παράδειγμα flipping ένας σχεσιακός τελεστής ή η άρνηση μιας συνθήκης.
Τα εργαλεία ομαδοποιούν τους τελεστές τους κάτω από αυτές τις τρεις επικεφαλίδες, έτσι ώστε η οικογένεια που παρήγαγε μια επιζώσα μεταλλαγμένη μεταβλητή να λέει στον δοκιμαστή ποιο είδος ισχυρισμού λείπει. Μια επιζώσα μεταλλαγμένη απόφαση συνήθως σηματοδοτεί έναν μη δοκιμασμένο κλάδο, ο οποίος επικαλύπτεται με δοκιμή βρόχου.
Αυτοματοποίηση της δοκιμής μετάλλαξης
Η δοκιμή μεταλλάξεων είναι εξαιρετικά χρονοβόρα και περίπλοκη στην εκτέλεση χειροκίνητα, επομένως συνιστάται η χρήση εργαλείων αυτοματισμού, τα οποία μειώνουν επίσης το κόστος. Ένα εργαλείο μεταλλάξεων μεταγλωττίζει τα μεταλλαγμένα, προγραμματίζει τις εκτελέσεις, καταγράφει ποια μετάλλαξη σκοτώθηκε από κάθε αποτυχημένη δοκιμή και αναφέρει τη βαθμολογία.
Λίστα διαθέσιμων εργαλείων:
- Stryker — ένα πλαίσιο δοκιμών μεταλλάξεων ανοιχτού κώδικα με εκδόσεις για JavaΣενάριο και TypeScript (StrykerJS), C# και .NET (Stryker.NET) και Scala (Stryker4s).
- PIT, επίσης γραμμένο PITest — ένα σύστημα ελέγχου μεταλλάξεων για Java και η JVM που μεταλλάσσει τον μεταγλωττισμένο bytecode και συνδέεται στο Maven και Gradle χτίζει παράλληλα JUnit.
Και τα δύο εκτελούνται ως βήμα κατασκευής, επομένως ανήκουν στο ίδιο συνεχή ολοκλήρωση αγωγός όπως και το υπόλοιπο δοκιμές αυτοματισμού για.
Βαθμολογία μετάλλαξης
Η βαθμολογία μετάλλαξης ορίζεται ως το ποσοστό των θανατωμένων μεταλλαγμένων στελεχών επί του συνολικού αριθμού μεταλλαγμένων στελεχών.
Βαθμολογία μετάλλαξης = (Killed Mutants / Συνολικός αριθμός Mutants) * 100
Ο τύπος εμφανίζεται παρακάτω με τη μορφή που τον αναφέρουν τα περισσότερα εργαλεία.
Οι περιπτώσεις δοκιμής περιγράφονται ως επαρκείς για μετάλλαξη όταν η βαθμολογία φτάσει το 100%. Στην πράξη, ο παρονομαστής πρέπει να αποκλείει ισοδύναμα μεταλλαγμένα — μεταλλαγμένα στελέχη των οποίων η αλλαγμένη σύνταξη συμπεριφέρεται ακριβώς όπως το πρωτότυπο, επομένως καμία δοκιμή δεν μπορεί να τα σκοτώσει. Επομένως, τα εργαλεία αναφέρουν τα θανατωμένα μεταλλαγμένα στελέχη διαιρούμενα με τα θανατωμένα και τα επιζώντα μη ισοδύναμα μεταλλαγμένα στελέχη και αφήνουν τον δοκιμαστή να επισημάνει τα ισοδύναμα.
Τα πειραματικά αποτελέσματα έχουν δείξει ότι ο έλεγχος μεταλλάξεων είναι ένας αποτελεσματικός τρόπος για τη μέτρηση της επάρκειας των δοκιμαστικών περιπτώσεων. Το κύριο μειονέκτημα είναι το κόστος δημιουργίας των μεταλλάξεων και εκτέλεσης κάθε δοκιμαστικής περίπτωσης έναντι καθεμίας από αυτές.
Δοκιμή Μετάλλαξης έναντι Code Κάλυψη
Ψηλά κάλυψη δοκιμών δεν αποδεικνύει ισχυρές δοκιμές. Η κάλυψη γραμμών και κλάδων καταγράφει ποιες εντολές εκτελέστηκαν, όχι αν κάτι επαληθεύτηκε στη συνέχεια, επομένως μια δοκιμή που καλεί μια μέθοδο και δεν δηλώνει τίποτα εξακολουθεί να μετράει ως καλυμμένη. Η δοκιμή μεταλλάξεων καλύπτει αυτό το κενό, επειδή μια μεταλλαγμένη μέθοδος πεθαίνει μόνο όταν μια δήλωση αποτυγχάνει στην πραγματικότητα.
| Άποψη | Code κάλυψη | Βαθμολογία μετάλλαξης |
| Τι μετρά | Ποιες γραμμές ή κλάδοι εκτελέστηκαν οι δοκιμές | Ποια σφάλματα ενέκριναν οι δοκιμές |
| Ευαίσθητο σε ισχυρισμούς | Όχι — μια δοκιμή με μηδενικούς ισχυρισμούς εξακολουθεί να προσθέτει κάλυψη | Ναι — ένα μεταλλαγμένο άτομο επιβιώνει όταν καμία δήλωση δεν αποτυγχάνει |
| Κόστος μιας διαδρομής | Μία δοκιμαστική εκτέλεση με όργανα | Μία δοκιμαστική εκτέλεση ανά επιζώντα μεταλλαγμένο, μέχρι στιγμής πολύ πιο αργή |
| Τυπική χρήση | Μια γρήγορη πύλη σε κάθε υποβολή | Ένας πιο ενδελεχής περιοδικός έλεγχος σε κρίσιμες ενότητες |
| Λειτουργία αποτυχίας | 100% κάλυψη χωρίς πραγματική επαλήθευση | Ισοδύναμα μεταλλαγμένα που δεν μπορούν ποτέ να θανατωθούν |
Οι δύο μετρήσεις είναι συμπληρωματικές. Η κάλυψη ονομάζει τον κώδικα που δεν επιτεύχθηκε ποτέ. Η βαθμολογία μετάλλαξης ονομάζει τον κώδικα που επιτεύχθηκε και δεν ελέγχθηκε ποτέ. Και οι δύο τροφοδοτούν το ίδιο. διαδικασία διαχείρισης ελαττωμάτων, παράλληλα με μέτρα όπως πυκνότητα ελαττώματος.
Πλεονεκτήματα του ελέγχου μετάλλαξης
Ακολουθούν τα πλεονεκτήματα του ελέγχου μετάλλαξης:
- Είναι μια ισχυρή προσέγγιση για την επίτευξη υψηλής κάλυψης του πηγαίου προγράμματος.
- Δοκιμάζει την ίδια τη σουίτα δοκιμών, την οποία καμία άλλη δεν τεχνική δοκιμής λογισμικού κάνει άμεσα.
- Ο έλεγχος μεταλλάξεων προσφέρει ένα καλό επίπεδο ανίχνευσης σφαλμάτων στον προγραμματιστή λογισμικού.
- Η μέθοδος αποκαλύπτει ασάφειες στον πηγαίο κώδικα και έχει την ικανότητα να αποκαλύψει σφάλματα που οι συνηθισμένες εκτελέσεις δεν φτάνουν ποτέ.
- Οι επιζώντες μεταλλαγμένοι είναι επιδεκτικοί δράσης: ο καθένας ονομάζει μια συγκεκριμένη γραμμή και μια συγκεκριμένη αλλαγή που η σουίτα δεν πρόσεξε.
- Οι πελάτες επωφελούνται από αυτές τις δοκιμές, καθώς λαμβάνουν ένα πιο αξιόπιστο και σταθερό σύστημα.
Μειονεκτήματα του ελέγχου μετάλλαξης
Από την άλλη πλευρά, τα μειονεκτήματα του Mutation Testing είναι τα ακόλουθα:
- Ο έλεγχος μεταλλάξεων είναι εξαιρετικά δαπανηρός και χρονοβόρος, επειδή πρέπει να δημιουργηθεί και να μεταγλωττιστεί ένας μεγάλος αριθμός προγραμμάτων μεταλλάξεων.
- Δεδομένου ότι είναι χρονοβόρο, είναι δίκαιο να πούμε ότι αυτός ο έλεγχος δεν μπορεί να γίνει χωρίς ένα εργαλείο αυτοματισμού.
- Κάθε μεταλλαγμένος τύπος ασκείται από τον ίδιο αριθμό δοκιμαστικών περιπτώσεων με το αρχικό πρόγραμμα, επομένως ένας μεγάλος πληθυσμός μεταλλαγμένων πρέπει να εκτελεστεί σε ολόκληρη τη σουίτα δοκιμών.
- Ισοδύναμα μεταλλαγμένα στελέχη δεν μπορούν να θανατωθούν με καμία δοκιμή και ο διαχωρισμός τους από τα γνήσια επιζώντα στελέχη συνήθως απαιτεί χειροκίνητη αναθεώρηση.
- Επειδή η μέθοδος αλλάζει τον πηγαίο κώδικα, δεν είναι εφαρμόσιμη σε Μαύρο Box Δοκιμές.
Πότε να χρησιμοποιείτε τον έλεγχο μεταλλάξεων
Το παραπάνω προφίλ κόστους σημαίνει ότι ο έλεγχος μεταλλάξεων σπάνια εκτελείται σε ολόκληρη τη βάση κώδικα σε κάθε υποβολή. Αποδίδει το κόστος του σε περιπτώσεις όπου ένα μη ανιχνευμένο σφάλμα είναι ακριβό και ο υπό δοκιμή κώδικας είναι αρκετά μικρός για να μεταλλαχθεί γρήγορα.
- Λογική κρίσιμη για την ασφάλεια ή οικονομική — υπολογισμός πληρωμών, φορολογικοί κανόνες και έλεγχοι εξουσιοδότησης, όπου μια σιωπηλή λάθος απάντηση είναι χειρότερη από ένα ατύχημα.
- Σουίτες με ύποπτα υψηλή κάλυψη — όταν η κάλυψη φτάνει το 100%, αλλά τα ελαττώματα εξακολουθούν να διαφεύγουν.
- Παλαιός κώδικας που αναδιαμορφώνεται — τα αποτελέσματα των μεταλλάξεων αποκαλύπτουν εάν οι υπάρχουσες δοκιμές θα μπορούσαν να εντοπίσουν μια παλινδρόμηση.
- Βιβλιοθήκες και κοινόχρηστα στοιχεία — ένα σφάλμα σε μια επαναχρησιμοποιούμενη συστατικό πολλαπλασιάζεται σε κάθε καλούντα.
- Ομάδες που προπονούνται δοκιμαστική ανάπτυξη — η βαθμολογία ελέγχει ότι οι πρώτες γραπτές δοκιμασίες αποδίδουν πραγματικά.
Συνήθως δεν αξίζει να εκτελείται σε πρωτότυπα μιας χρήσης, σε λεπτή κόλλα ή σε δημιουργημένο κώδικα χωρίς λογική διακλάδωσης ή σε σουίτες που κυριαρχούνται από αργούς κώδικες. δοκιμές ολοκλήρωσης που ήδη χρειάζονται ώρες για ένα μόνο πέρασμα.
Επομένως, οι περισσότερες ομάδες ορίζουν το εύρος της εκτέλεσης σε τροποποιημένα αρχεία, ορίζουν ένα όριο για τις ενότητες που έχουν σημασία και επιτρέπουν στο ευρύτερο δοκιμή παλινδρόμησης η σουίτα μεταφέρει το υπόλοιπο κύκλος ζωής δοκιμής λογισμικού.



