Τι είναι το Module Testing; Ορισμός, Παραδείγματα

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

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

  • 🎯 Στόχος: Ο στόχος είναι να αποκαλυφθούν σφάλματα σε μια ενότητα, όχι να αποδειχθεί ότι η ενότητα λειτουργεί.
  • Προσανατολισμός: Η τεχνική είναι σε μεγάλο βαθμό λευκού κουτιού, που συμπληρώνεται από περιπτώσεις μαύρου κουτιού που προέρχονται από την προδιαγραφή.
  • â © Παραλληλισμός: Μπορούν να δοκιμαστούν ταυτόχρονα πολλές ενότητες, γεγονός που μειώνει το συνολικό χρονικό διάστημα δοκιμής.
  • 🔗 Δύο μέθοδοι: Οι ενότητες συνδυάζονται είτε σταδιακά, είτε βήμα προς βήμα, είτε μη σταδιακά σε ένα πέρασμα.
  • 🧰 Σκαλωσιά: Οι οδηγοί παρέχουν δεδομένα δοκιμής σε μια ενότητα, ενώ τα stubs αντικαθιστούν τις ενότητες που καλεί.
  • 🆚 Ιδιοκτησία: Οι δοκιμαστές γράφουν δοκιμές ενοτήτων μετά τον προγραμματισμό, ενώ οι προγραμματιστές γράφουν δοκιμές μονάδων κατά τη διάρκεια αυτού.
  • ⚠️ Προκλήσεις: Η μη σταδιακή εργασία, οι παρεξηγημένες διπλές δοκιμές και η συχνή διόρθωση σφαλμάτων καταναλώνουν το μεγαλύτερο μέρος της προσπάθειας.

Επεξήγηση δοκιμών ενότητας με μεθόδους, προγράμματα οδήγησης, stubs και συγκρίσεις

Τι είναι το Module Testing;

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

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

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

Γιατί να κάνετε Δοκιμή Ενοτήτων

Συνιστάται η δοκιμή μονάδων επειδή αλλάζει τα οικονομικά της ανίχνευσης ελαττωμάτων.

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

Πώς να κάνετε Δοκιμή Ενοτήτων;

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

  • Προδιαγραφές για τη μονάδα
  • Ο πηγαίος κώδικας της ενότητας

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

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

  • Μη σταδιακή μέθοδος — όλες οι ενότητες δοκιμάζονται ανεξάρτητα. Αρχικά συνδυάζει όλες τις ενότητες και στη συνέχεια δοκιμάζει ολόκληρο το πρόγραμμα.
  • Αυξητική μέθοδος — κάθε ενότητα δοκιμάζεται πρώτα και στη συνέχεια προστίθεται σταδιακά στη συλλογή που έχει υποβληθεί σε δοκιμή. Πραγματοποιεί μια σταδιακή επανάληψη της δοκιμής.
  • Στο πλαίσιο των σταδιακών δοκιμών υπάρχουν δύο προσεγγίσεις, από πάνω προς τα κάτω και από κάτω προς τα πάνω δοκιμών.
  • Για την εκτέλεση της ενότητας με τα επιλεγμένα δεδομένα, απαιτείται ένας οδηγός για την παροχή των δεδομένων δοκιμής, την παρακολούθηση της εκτέλεσης και την καταγραφή των αποτελεσμάτων.

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

Άποψη Αυξητική μέθοδος Μη σταδιακή μέθοδος
Συνδυασμός Μία ενότητα κάθε φορά, προστίθεται σε μια δοκιμασμένη συλλογή Όλες οι ενότητες συνδυάστηκαν και στη συνέχεια δοκιμάστηκαν μαζί
Απαιτείται σκαλωσιά Περισσότεροι οδηγοί και stubs, γραμμένοι σταδιακά Λιγότερες διπλές δοκιμές, καθώς υπάρχουν πραγματικές ενότητες
Λανθασμένη απομόνωση Ισχυρό — μια βλάβη υποδεικνύει την ενότητα που μόλις προστέθηκε Αδύναμο — μια αποτυχία θα μπορούσε να προέλθει από οπουδήποτε
κατάλληλο για Μεγάλες κατασκευές με πολλές αλληλεπιδρώσες ενότητες Μικρά προγράμματα με λίγες ενότητες και χαμηλή σύνδεση

Οδηγοί και Stub σε Δοκιμές Μονάδων

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

  • Οδηγός — αντικαθιστά την καλούσα ενότητα πάνω από αυτήν που βρίσκεται υπό δοκιμή. Παρέχει τα δεδομένα δοκιμής, καλεί την ενότητα, παρακολουθεί την εκτέλεση και καταγράφει τα αποτελέσματα. Η δοκιμή από κάτω προς τα πάνω εξαρτάται από τους οδηγούς, επειδή οι κατώτερες ενότητες είναι έτοιμες πριν από τις υψηλότερες.
  • Στέλεχος — αντικαθιστά μια καλούμενη ενότητα κάτω από αυτήν που βρίσκεται υπό δοκιμή. Δέχεται την κλήση και επιστρέφει μια σταθερή, γνωστή απόκριση, ώστε η ενότητα που βρίσκεται υπό δοκιμή να μπορεί να ολοκληρώσει τη διαδρομή της. Η δοκιμή από πάνω προς τα κάτω εξαρτάται από τα stubs, επειδή οι υψηλότερες ενότητες είναι έτοιμες πρώτες.

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

Παραδείγματα Συμβουλών για Δοκιμή Ενοτήτων

Ακολουθούν μερικές συμβουλές που πρέπει να λάβετε υπόψη πριν από την εκτέλεση δοκιμών ενότητας.

  • RevΕξετάστε τις δοκιμαστικές περιπτώσεις πριν τις χρησιμοποιήσετε.
  • Αποφύγετε τη σύγχυση σχετικά με την πηγή των αποκλίσεων.
  • Χρησιμοποιήστε αυτοματοποιημένα εργαλεία δοκιμών.
  • Εξετάστε τις μεταβλητές που θα έπρεπε να παραμείνουν αμετάβλητες.
  • Εναλλάξτε τις ενότητες μεταξύ των δοκιμαστών για να αποφύγετε τους αυτοέλεγχους.
  • Επαναχρησιμοποιήστε τις δοκιμαστικές περιπτώσεις.

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

Δοκιμή μονάδας έναντι δοκιμής ενότητας

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

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

Δοκιμή ενότητας έναντι δοκιμής στοιχείων έναντι δοκιμής ολοκλήρωσης

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

Άποψη Δοκιμή ενότητας Δοκιμή εξαρτημάτων Δοκιμή ολοκλήρωσης
Υπό δοκιμή Ένα υποπρόγραμμα, κλάση ή διαδικασία Ένα αυτόνομο στοιχείο με τις άμεσες εξαρτήσεις του Οι διεπαφές μεταξύ συνδυασμένων ενοτήτων
Συνήθης ιδιοκτήτης Ελεγκτής, αφού γραφτεί ο κώδικας Δοκιμαστής Δοκιμαστής ολοκλήρωσης
Σκαλωσιά Οδηγοί και αποκόμματα Stubs για εξωτερικές εξαρτήσεις Σταδιακά λιγότερα διπλά τεστ
Ελάττωμα αποκαλυφθέν Λογικό σφάλμα μέσα στην ενότητα Σφάλμα συμπεριφοράς στο στοιχείο Σφάλμα διεπαφής και διέλευσης δεδομένων

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

Προκλήσεις στη Δοκιμή Ενοτήτων

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

  • Η μη σταδιακή δοκιμή απαιτεί περισσότερη δουλειά — ο συνδυασμός όλων των στοιχείων πρώτα σημαίνει ότι μια μεμονωμένη αποτυχία μπορεί να στείλει τους δοκιμαστές πίσω σε ολόκληρο το πρόγραμμα.
  • Το τεστ παρεξήγησης διπλασιάζεται — ένα stub που επιστρέφει μια μη ρεαλιστική τιμή παράγει μια πράσινη εκτέλεση που δεν αποδεικνύει τίποτα.
  • Δοκιμές εντοπισμού σφαλμάτων συχνά — ο κώδικας σκαλωσιάς φέρει τα δικά του ελαττώματα και ο χρόνος που αφιερώνεται στην επιδιόρθωση ενός προγράμματος οδήγησης είναι χρόνος που δεν αφιερώνεται στον έλεγχο της ενότητας.
  • Πρέπει να κατανοήσετε τον κώδικα — ο προσανατολισμός του λευκού κουτιού σημαίνει ότι ένας δοκιμαστής που δεν μπορεί να διαβάσει την ενότητα δεν μπορεί να σχεδιάσει ουσιαστικές περιπτώσεις για αυτήν.

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

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

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

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

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

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

Ακολουθήστε τον υπάρχοντα κώδικα. Η επιλογή "top down" (από πάνω προς τα κάτω) ταιριάζει σε έργα όπου η λογική ελέγχου γράφεται πρώτα και οι κάτω ενότητες ολοκληρώνονται, ενώ η επιλογή "bottom up" ταιριάζει σε έργα όπου οι βοηθητικές ενότητες καταλήγουν πρώτες και οι οδηγοί τις καλούν.

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

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

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