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


* Τι είναι αυτό?
* Τι κάνει για μένα;
* Γιατί να το χρησιμοποιήσω;
* Πότε θα πρέπει να το χρησιμοποιήσετε (και όταν όχι);
* Ποιες είναι μερικές κοινές παγίδες και παρανοήσεις

 
Τι είναι ο έλεγχος μονάδας;
===========================



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


* Διεξαγωγή των δοκιμών γίνεται αυτοματοποίηση-θέση και επαναλαμβανόμενη
* Μπορείτε να δοκιμάσετε σε ένα πολύ πιο λεπτομερές επίπεδο από το σημείο-και-κλικ έλεγχο μέσω ενός GUI


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


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


* Δεν γράφουν κερδοσκοπικές «Εγώ μπορεί να χρειαστεί στο μέλλον» κώδικα - απλά αρκετά για να κάνουν τις εξετάσεις περνούν
* Ο κωδικός που έχετε γράψει πάντα καλύπτονται από δοκιμές
* Με το γράψιμο το τεστ πρώτο, είστε αναγκασμένοι να σκεφτεί για το πώς θέλετε να καλέσετε τον κώδικα, το οποίο συνήθως βελτιώνει το σχεδιασμό του κώδικα σε μακροπρόθεσμη βάση.


Αν δεν έχετε κάνει τον έλεγχο μονάδας τώρα, θα σας συνιστούσαμε να ξεκινήσετε με αυτό. Πάρτε ένα καλό βιβλίο, σχεδόν κάθε xUnit-book θα κάνει, διότι οι έννοιες είναι πολύ μεταβιβάζονται μεταξύ τους.


Μερικές φορές, γράφοντας εξετάσεις μονάδα μπορεί να είναι επώδυνη. Όταν γίνεται με αυτόν τον τρόπο, προσπαθήστε να βρείτε κάποιον να σας βοηθήσει, και να αντισταθεί στον πειρασμό να «απλά γράψτε το καταραμένο κώδικα». Μονάδα δοκιμών είναι πολλά όπως το πλύσιμο των πιάτων. Δεν είναι πάντα ευχάριστο, αλλά διατηρεί μεταφορική κουζίνα σας καθαρή, και θέλετε πραγματικά να είναι καθαρό. :)




---


Επεξεργασία: Μια λανθασμένη αντίληψη έρχεται στο μυαλό, αν και δεν είμαι σίγουρος αν είναι τόσο κοινή. Έχω ακούσει ένας διαχειριστής έργου λένε ότι οι δοκιμές μονάδα έκανε η ομάδα γράψετε όλο τον κώδικα δύο φορές. Εάν φαίνεται και αισθάνεται αυτόν τον τρόπο, επίσης, κάνετε λάθος. Δεν είναι μόνο το γράψιμο οι δοκιμές συνήθως επιταχύνει την ανάπτυξη, αλλά σας δίνει επίσης μια βολική «τώρα είμαι γίνει» δείκτης που διαφορετικά δεν θα είχαν.

 

Δεν διαφωνώ με τον Dan (αν και η καλύτερη επιλογή μπορεί να είναι απλώς να μην απαντήσω) ... αλλά ...


Μονάδα δοκιμών είναι η διαδικασία της γραφής κώδικα για να ελέγξετε τη συμπεριφορά και τη λειτουργικότητα του συστήματος σας.


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


1. Κάντε το πιο εύκολο να αλλάξετε την τεχνική εφαρμογή, ενώ φροντίζοντας να μην αλλάξετε τη συμπεριφορά (refactoring). Σωστά κωδικό μονάδας δοκιμάστηκε μπορεί να refactored επιθετικά / καθαριστεί με μικρή πιθανότητα να σπάσει κάτι χωρίς να το καταλαβαίνουν.
2. Δώστε την ανάπτυξη εμπιστοσύνης κατά την προσθήκη συμπεριφορά ή κάνοντας διορθώσεις.
3. Τεκμηριώστε τον κωδικό σας
4. Αναφέρετε περιοχές του κωδικού σας που είναι στενά συνδεδεμένες. Είναι δύσκολο να κώδικα δοκιμής μονάδα που είναι στενά συνδεδεμένη
5. Παρέχει ένα μέσο για να χρησιμοποιήσετε το API σας και αναζητήστε τις δυσκολίες νωρίς
6. Υποδεικνύει τις μεθόδους και τις κατηγορίες που δεν είναι πολύ συνεκτικό


Θα πρέπει να δοκιμή μονάδα λόγω της το ενδιαφέρον σας για να παραδώσει μια διατηρήσιμη και την ποιότητα του προϊόντος στον πελάτη σας.


Θα πρότεινα να το χρησιμοποιήσετε για οποιοδήποτε σύστημα, ή μέρος ενός συστήματος, το οποίο μοντέλα στον πραγματικό κόσμο συμπεριφορά. Με άλλα λόγια, είναι ιδιαίτερα κατάλληλη για την ανάπτυξη των επιχειρήσεων. Δεν θα το χρησιμοποιήσει για προγράμματα / χρησιμότητα πλάγιο μακριά. Δεν θα το χρησιμοποιήσει για μέρη ενός συστήματος που είναι προβληματικές για δοκιμή (UI είναι ένα κοινό παράδειγμα, αλλά αυτό δεν συμβαίνει πάντα)


Η μεγαλύτερη παγίδα είναι ότι οι προγραμματιστές δοκιμάσει πολύ μεγάλη μονάδα, ή θεωρούν μια μέθοδο μια μονάδα. Αυτό ισχύει ιδιαίτερα αν δεν καταλαβαίνετε [Αντιστροφή του ελέγχου](https://en.wikipedia.org/wiki/Inversion_of_control) - οπότε δοκιμές μονάδα σας θα γίνει πάντα σε δοκιμές ολοκλήρωσης end-to-end. Δοκιμή μονάδα θα πρέπει να ελέγξετε ατομικές συμπεριφορές - και οι περισσότερες μέθοδοι έχουν πολλές συμπεριφορές.


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

 

Αυτή είναι η δική μου σε αυτό. Θα έλεγα έλεγχο μονάδας είναι η πρακτική της γραφής δοκιμές του λογισμικού για να βεβαιωθείτε ότι το λογισμικό σε πραγματικό σας κάνει ό, τι είναι γραφτό να. Αυτό ξεκίνησε με [JUnit](http://junit.org/) στον κόσμο Java και έχει γίνει μια βέλτιστη πρακτική σε PHP, καθώς και με [SimpleTest](http://simpletest.org/) και [phpunit](http://www.phpunit.de/) . Είναι μια βασική πρακτική της Extreme Προγραμματισμός και σας βοηθά να είστε σίγουροι ότι το λογισμικό σας εξακολουθεί να λειτουργεί όπως θα έπρεπε μετά την επεξεργασία. Αν έχετε επαρκή κάλυψη της δοκιμής, μπορείτε να κάνετε μεγάλες refactoring, διόρθωση σφαλμάτων ή να προσθέσετε χαρακτηριστικά γρήγορα με πολύ λιγότερο φόβο της εισαγωγής και άλλων προβλημάτων.


Είναι πιο αποτελεσματική όταν όλες οι δοκιμές μονάδα μπορεί να εκτελεστεί αυτόματα.


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


Το πλαίσιο θα τρέξει όλες τις δοκιμές ενάντια κωδικό σας και στη συνέχεια να υποβάλει σχετική έκθεση την επιτυχία ή την αποτυχία της κάθε δοκιμής. phpunit εκτελείται από τη γραμμή εντολών του Linux από προεπιλογή, αν και υπάρχουν διασυνδέσεις HTTP που διατίθενται για αυτό. SimpleTest είναι web-based από τη φύση και είναι πολύ πιο εύκολο να ιδρυθεί και να λειτουργήσει, ΙΜΟ. Σε συνδυασμό με xDebug, phpunit μπορεί να σας δώσει αυτοματοποιημένο στατιστικές για την κάλυψη κωδικό που μερικοί άνθρωποι βρίσκουν πολύ χρήσιμα.


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


Είναι καλή πρακτική να κρατήσει τις δοκιμές μονάδα σας στο ίδιο αποθετήριο ως την αίτησή σας.

 

Μονάδα-δοκιμή είναι η δοκιμή μιας μονάδας του κώδικα (π.χ. ένα ενιαία λειτουργία) χωρίς την ανάγκη για την υποδομή που αυτή η μονάδα του κώδικα βασίζεται σε. δηλαδή δοκιμή σε απομόνωση.


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


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


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


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

 

Πήγα σε μια παρουσίαση σχετικά με τον έλεγχο της μονάδας σε FoxForward 2007 και μου είπαν ποτέ σε τίποτα δοκιμή μονάδα που λειτουργεί με τα δεδομένα. Μετά από όλα, αν δοκιμάσετε σε ζωντανά δεδομένα, τα αποτελέσματα είναι απρόβλεπτα, και αν δεν δοκιμάσετε σε ζωντανά στοιχεία, δεν είστε στην πραγματικότητα τον έλεγχο του κώδικα που γράψατε. Δυστυχώς, αυτό είναι το μεγαλύτερο μέρος της κωδικοποίησης που κάνω αυτές τις μέρες. :-)


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


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

 


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


Μπορείτε να ξεκινήσετε τις μικρές. Το έργο Πήρα ακριβώς στο δεν είχε τον έλεγχο της μονάδας μέχρι πριν από λίγους μήνες. Όταν η κάλυψη ήταν ότι τα χαμηλά, θα πάρει απλά ένα αρχείο που δεν είχε καμία κάλυψη και κάντε κλικ στο «add δοκιμές».


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


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

 

Chipping σε σχετικά με τις φιλοσοφικές υπέρ των δοκιμών μονάδας και TDD εδώ είναι μερικά από αυτά πλήκτρο «λάμπα» παρατηρήσεις που μου έκανε εντύπωση στο δειλά τα πρώτα μου βήματα στο δρόμο προς την TDD φώτιση (καμία αρχική ή κατ 'ανάγκη ειδήσεις) ...


1. TDD δεν σημαίνει γράφοντας το διπλάσιο του ποσού του κώδικα. Κώδικας δοκιμής είναι συνήθως αρκετά γρήγορη και ανώδυνη για να γράψει και να αποτελεί βασικό μέρος της διαδικασίας σχεδιασμού και κριτικά.
2. TDD σας βοηθά να συνειδητοποιήσουμε πότε να σταματήσει την κωδικοποίηση! τις δοκιμές σας να σας δώσει την εμπιστοσύνη που έχετε κάνει αρκετά για τώρα και να σταματήσει μικροαλλαγές και να προχωρήσουμε στο επόμενο πράγμα.
3. Οι δοκιμές και ο κωδικός συνεργάζονται για την επίτευξη καλύτερων κώδικα. Ο κωδικός σας θα μπορούσε να είναι κακό / λάθη. TEST σας θα μπορούσε να είναι κακό / λάθη. Στην TDD που τραπεζών σχετικά με τις πιθανότητες και των δύο είναι κακό / buggy είναι αρκετά χαμηλό. Συχνά, η δοκιμή της που χρειάζεται για τον καθορισμό, αλλά αυτό είναι ακόμα ένα καλό αποτέλεσμα.
4. TDD βοηθά με την κωδικοποίηση της δυσκοιλιότητας. Γνωρίζετε ότι αισθάνεστε ότι έχετε τόσα πολλά να κάνουμε σας μόλις ξέρετε από πού να αρχίσω; Είναι Παρασκευή απόγευμα, αν απλά χρονοτριβούν για μια-δυο ώρες ... TDD σας επιτρέπει να συμπληρώσουν πολύ γρήγορα τι νομίζετε ότι πρέπει να κάνουμε, και παίρνει σας κωδικοποίηση κινείται γρήγορα. Επίσης, σαν ποντίκια εργαστηρίου, νομίζω ότι όλοι ανταποκριθεί σε αυτό το μεγάλο πράσινο φως και να εργαστεί σκληρότερα για να το δείτε και πάλι!
5. Στο ίδιο πνεύμα, αυτοί οι τύποι σχεδιαστής μπορεί να δει αυτό που εργάζεστε. Μπορούν να περιπλανηθείτε στα ανοικτά για ένα χυμό / τσιγάρο / iphone διάλειμμα και να επιστρέψει σε μια οθόνη που τους δίνει αμέσως μια οπτική ένδειξη για το πού πήραν για να. TDD μας δίνει κάτι παρόμοιο. Είναι εύκολο να δούμε πού έχουμε όταν παρεμβαίνει η ζωή ...
6. Νομίζω ότι ήταν Fowler ο οποίος είπε: «Ατελής δοκιμές, εκτελέστε συχνά, είναι πολύ καλύτερη από ό, τι τέλειο εξετάσεις που δεν είναι γραμμένα σε όλους». Θα ερμηνεύσει αυτό ως που μου έδωσε την άδεια να γράψω εξετάσεις, όπου πιστεύω ότι θα είναι πιο χρήσιμο ακόμη και αν το υπόλοιπο της κάλυψης κώδικα μου είναι θλιβερά ελλιπής.
7. TDD βοηθά σε όλα τα είδη των έκπληξη τρόπους κάτω από τη γραμμή. Καλή δοκιμές μονάδα μπορεί να βοηθήσει έγγραφο τι κάτι έπρεπε να κάνουν, μπορούν να σας βοηθήσουν να μεταναστεύσουν κώδικα από το ένα έργο στο άλλο και να σας δώσει μια αδικαιολόγητη αίσθηση της ανωτερότητας έναντι των μη-δοκιμή τους συναδέλφους σας :)


[Αυτή η παρουσίαση](http://www.masukomi.org/talks/unit_testing_talk_2/index.xul?data=slide_data.txt#page1) είναι μια εξαιρετική εισαγωγή σε όλα τα λαχταριστά συνεπάγεται δοκιμές καλοσύνη.

 

Test Driven Development έχει είδους αναλάβει τη δοκιμή διάρκειας μονάδα. Ως ένα παλιό χρονόμετρο θα αναφέρω το πιο γενικό ορισμό της.


Μονάδα δοκιμής σημαίνει επίσης δοκιμή ένα μόνο συστατικό σε ένα μεγαλύτερο σύστημα. Αυτό το ενιαίο συστατικό θα μπορούσε να είναι ένα dll, exe, βιβλιοθήκη κατηγορίας, κλπ Θα μπορούσε ακόμη και να είναι ένα ενιαίο σύστημα σε μια εφαρμογή πολλαπλών συστημάτων. Έτσι, τελικά, Μονάδα δοκιμών καταλήγει να είναι η δοκιμή του ό, τι θέλετε να καλέσετε ένα μόνο κομμάτι ενός μεγαλύτερου συστήματος.


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

 

Χρησιμοποιώ δοκιμές μονάδα για να εξοικονομήσετε χρόνο.


Κατά την οικοδόμηση της επιχειρηματικής λογικής (ή πρόσβαση σε δεδομένα) λειτουργικότητα δοκιμή μπορεί συχνά να περιλαμβάνει την πληκτρολόγηση πράγματα σε πολλές οθόνες που μπορεί ή δεν μπορεί να ολοκληρωθεί ακόμα. Αυτοματοποίηση αυτές τις εξετάσεις εξοικονομεί χρόνο.


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


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


Είναι πολύ πιο γρήγορα για μένα να ανακαλύψουν ότι νέος κωδικός μου σπάει κάτι σε δοκιμές μονάδα μου στη συνέχεια να ελέγξει τον κωδικό και να έχουν κάποια front-end developer να βρει ένα πρόβλημα.


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


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

 

Χρησιμοποιήστε [Testivus](http://www.artima.com/weblogs/viewpost.jsp?thread=203994) . Όλα όσα πρέπει να ξέρετε είναι εκεί :)

 

Ποτέ δεν είχε διδάξει τον έλεγχο μονάδας στο πανεπιστήμιο, και μου πήρε λίγο χρόνο για να «πάρει» αυτό. Διάβασα γι 'αυτό, πήγε «αχ, δεξιά, αυτόματο έλεγχο, που θα μπορούσε να είναι δροσερό υποθέτω», και στη συνέχεια, ξέχασα γι' αυτό.


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


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


Η λύση είναι εξετάσεις μονάδα. Θα πιάσει προβλήματα όταν γράφετε κώδικα - το οποίο είναι καλό - αλλά θα μπορούσε να κάνει αυτό με το χέρι. Η πραγματική πληρωμή είναι ότι θα πιάσει τα προβλήματα εννέα μήνες κάτω από τη γραμμή όταν είστε τώρα εργάζεται σε ένα τελείως διαφορετικό έργο, αλλά το καλοκαίρι οικότροφος νομίζει ότι θα δούμε τακτοποιών αν οι παράμετροι ήταν σε αλφαβητική σειρά - και, στη συνέχεια, η μονάδα ελέγχου γράψατε δρόμο της επιστροφής αποτυγχάνει, και κάποιος ρίχνει πράγματα στο intern μέχρι που αλλάζει τη σειρά παραμέτρων πίσω. **Αυτό είναι** το «γιατί» της μονάδας δοκιμών. :-)

 

Μονάδα δοκιμών είναι σχετικά με τη σύνταξη κώδικα που ελέγχει κώδικα της εφαρμογής σας.


Η *Μονάδα* μέρος του ονόματος είναι σχετικά με την πρόθεση να δοκιμάσει μικρές μονάδες του κώδικα (μία μέθοδο για παράδειγμα) σε μια στιγμή.


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


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


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

 

Η κύρια διαφορά των δοκιμών μονάδα, σε αντίθεση με την «απλά ανοίγοντας ένα νέο έργο και να δοκιμάσουν αυτό το συγκεκριμένο κώδικα» είναι ότι είναι *αυτοματοποιημένη* , έτσι *επαναλαμβανόμενη* .


Αν δοκιμάσετε τον κωδικό σας με το χέρι, μπορεί να σας πείσει ότι ο κώδικας λειτουργεί άψογα - *στην τρέχουσα κατάστασή του* . Αλλά τι γίνεται με μία εβδομάδα αργότερα, όταν έκανε μια μικρή τροποποίηση σε αυτό; Είστε διατεθειμένος να το δοκιμάστε ξανά πάλι με το χέρι κάθε φορά που *κάτι* αλλάζει στον κωδικό σας; Πιθανότατα δεν :-(


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


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


* δοκιμές μονάδα **μειώσει το βρόχο ανάδρασης ανάπτυξη** δραματικά: με ένα ξεχωριστό τμήμα δοκιμών μπορεί να χρειαστούν εβδομάδες για να μπορείτε να ξέρετε ότι υπάρχει ένα σφάλμα στον κώδικα σας, οπότε έχετε ήδη ξεχάσει ένα μεγάλο μέρος του πλαισίου, έτσι μπορεί να σας πάρει ώρες για να βρείτε και να διορθώσετε το σφάλμα? OTOH με τις δοκιμές μονάδα, ο κύκλος ανατροφοδότησης μετριέται σε δευτερόλεπτα, και η διαδικασία διόρθωσης σφάλματος είναι συνήθως κατά μήκος των γραμμών του «Ω sh * t, ξέχασα να ελέγξετε για αυτή την κατάσταση εδώ» :-)
* δοκιμές για αποτελεσματική **τεκμηρίωση** (κατανόησή σας) τη συμπεριφορά του κωδικού σας
* δυνάμεις τον έλεγχο της μονάδας να επανεκτιμήσουν τις επιλογές του σχεδιασμού σας, η οποία οδηγεί σε **απλούστερη, καθαρότερη σχεδίαση**


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

 

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


[xUnit](http://en.wikipedia.org/wiki/XUnit) , [NUnit](http://en.wikipedia.org/wiki/NUnit) , [mbUnit](http://mbunit.com/) , κλπ είναι εργαλεία που θα σας βοηθήσουν στη συγγραφή των δοκιμών.

 

Βιβλιοθήκες, όπως [NUnit](http://en.wikipedia.org/wiki/NUnit) , [xUnit](http://en.wikipedia.org/wiki/XUnit) ή [JUnit](http://en.wikipedia.org/wiki/JUnit) είναι μόνο υποχρεωτική, αν θέλετε να αναπτύξετε τα έργα σας, χρησιμοποιώντας το [TDD](http://en.wikipedia.org/wiki/Test-driven_development) προσέγγιση διαδόθηκε από Kent Beck:


Μπορείτε να διαβάσετε *[Εισαγωγή στο Test Driven Development (TDD)](http://www.agiledata.org/essays/tdd.html)* ή το βιβλίο Kent Beck για *[Test Driven Development: Με το παράδειγμα](http://rads.stackoverflow.com/amzn/click/0321146530)* .


Στη συνέχεια, αν θέλετε να είστε σίγουροι δοκιμές σας καλύπτουν ένα «καλό» μέρος του κωδικού σας, μπορείτε να χρησιμοποιήσετε το λογισμικό όπως το [NCover](http://en.wikipedia.org/wiki/NCover) , [JCover](http://www.mmsindia.com/JCover.html) , [PartCover](http://sourceforge.net/projects/partcover/) ή οτιδήποτε άλλο. Θα σας πω το ποσοστό κάλυψης του κωδικού σας. Ανάλογα με το πόσο είστε έμπειροι στην TDD, θα ξέρετε αν έχετε ασκηθεί αρκετά καλά :)

 

Πρώτα απ 'όλα, αν μιλάει για τον έλεγχο μονάδας ή οποιαδήποτε άλλα είδη των αυτοματοποιημένων (Integration, φορτίου, δοκιμή UI κλπ), η βασική διαφορά από αυτό που δείχνουν είναι ότι είναι αυτοματοποιημένη, επαναλαμβανόμενη και δεν απαιτεί καμία ανθρώπινου δυναμικού να καταναλωθεί (= κανείς δεν έχει την εκτέλεση των δοκιμών, που συνήθως λειτουργούν σε ένα πάτημα ενός κουμπιού).

 

Νομίζω ότι το σημείο που δεν καταλαβαίνουν είναι ότι τα πλαίσια ελέγχου μονάδας όπως NUnit (και άλλα παρόμοια) θα σας βοηθήσει στην *αυτοματοποίηση* μικρού και μεσαίου μεγέθους δοκιμές. Συνήθως, μπορείτε να εκτελέσετε τις δοκιμές σε ένα γραφικό περιβάλλον (αυτή είναι η περίπτωση με [NUnit](http://www.nunit.org/) , για παράδειγμα), απλά κάνοντας κλικ σε ένα κουμπί και στη συνέχεια - ελπίζουμε - δείτε τη γραμμή προόδου παραμείνει πράσινο. Αν γίνεται κόκκινο, το πλαίσιο που που αποτυχημένη δοκιμή και τι ακριβώς πήγε στραβά δείχνει. Σε μια κανονική δοκιμή μονάδα, που συχνά χρησιμοποιούν ισχυρισμούς, όπως π.χ. `Assert.AreEqual(expectedValue, actualValue, "some description")`- οπότε αν οι δύο τιμές είναι άνισες, θα δείτε ένα σφάλμα λέγοντας «κάποια περιγραφή: Αναμένεται <expectedValue> αλλά <actualValue>».


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

 

Θα ήθελα να συστήσω το xUnit Δοκιμές Πρότυπα βιβλίο του Gerard Meszaros. Είναι μεγάλα, αλλά είναι ένας μεγάλος πόρος για τον έλεγχο μονάδας. Εδώ είναι μια σύνδεση με την ιστοσελίδα του, όπου περιγράφει τα βασικά στοιχεία των δοκιμών μονάδας. <http://xunitpatterns.com/XUnitBasics.html>

 

Αυτό απαντά γιατί θα πρέπει να κάνουμε δοκιμές μονάδα.




---


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


Μονάδα Δοκιμή: Λεπτά Τώρα θα σώσει ώρες αργότερα - Eric Mann - <https://www.youtube.com/watch?v=_UmmaPe8Bzc>


Δοκιμή JS Μονάδα (πολύ καλή) - <https://www.youtube.com/watch?v=-IYqgx8JxlU>


Γράφοντας ελέγξιμες JavaScript - <https://www.youtube.com/watch?v=OzjogCFO4Zo>




---


Τώρα είμαι μόνο μαθαίνοντας για το θέμα γι 'αυτό μπορεί να μην είναι 100% σωστή και υπάρχει περισσότερος σε αυτό από ό, τι είμαι περιγράφουν εδώ, αλλά βασική κατανόηση μου για τον έλεγχο μονάδας είναι ότι μπορείτε να γράψετε κάποιο κώδικα δοκιμής (η οποία διατηρείται χωριστά από το κύριο κωδικό) που καλεί μια λειτουργία στην κύρια κωδικό σας με είσοδο (επιχειρήματα) ότι η λειτουργία απαιτεί και ο κώδικας στη συνέχεια ελέγχει εάν παίρνει πίσω μια έγκυρη τιμή επιστροφής. Αν δεν πάρει πίσω μια έγκυρη τιμή του πλαισίου ελέγχου μονάδας που χρησιμοποιείτε για την εκτέλεση των δοκιμών εμφανίζεται με πράσινο χρώμα (όλα καλά) αν η τιμή είναι άκυρη μπορείτε να πάρετε ένα κόκκινο φως και στη συνέχεια μπορείτε να διορθώσετε το πρόβλημα αμέσως πριν κυκλοφορήσει το νέο κώδικα με την παραγωγή, χωρίς έλεγχο δεν μπορεί στην πραγματικότητα να έχουν αλιευθεί το σφάλμα.


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




---


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


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




---


Είναι αρκετά συγκεχυμένη, όταν για πρώτη φορά ακούω το θέμα και σκέφτεστε για τον εαυτό σας, δεν είμαι ήδη δοκιμές τον κωδικό μου; Και ο κώδικας που έχετε γράψει λειτουργεί όπως υποτίθεται ότι ήδη, «γιατί χρειάζομαι ένα άλλο πλαίσιο;» ... Ναι έχετε ήδη δοκιμές κωδικό σας, αλλά ένας υπολογιστής είναι καλύτερη στο να γίνει αυτό. Απλά πρέπει να γράψει αρκετά καλό τεστ για τη λειτουργία / μονάδα κωδικό μία φορά και το υπόλοιπο έχει ληφθεί μέριμνα για σας από το ισχυρό επεξεργαστή, αντί να χρειάζεται να ελέγξετε το χέρι ότι όλα κωδικός σας εξακολουθεί να λειτουργεί όταν κάνετε μια αλλαγή σε ο κωδικός σου.


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

 

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

 