Έτσι, δαπανήσαμε ένα σύνολο μικρών στρογγυλών του χρόνου κατά τα τελευταία δύο διαλέξεις μιλάμε για διαφορετικά είδη των δοκιμών σχετικά με την μονάδα δοκιμές έναντι της δοκιμής ολοκλήρωσης Μας μίλησε σχετικά με τον τρόπο χρήσης RSpec για να απομονώσετε πραγματικά τα τμήματα του κώδικα που θέλετε να ελέγξετε έχετε επίσης, το γνωρίζετε, λόγω σπίτι 3, και άλλα πράγματα, όπως το κάνουμε BDD, όταν μας έχετε χρησιμοποιούν Αγγούρι για να ενεργοποιήσετε τις ιστορίες του χρήστη σε, ουσιαστικά, οι δοκιμές ολοκλήρωσης και αποδοχή Έτσι που έχετε δει δοκιμές σε δυο διαφορετικά επίπεδα και ο στόχος εδώ είναι είδος για να κάνουμε μερικές παρατηρήσεις να, γνωρίζετε, ας αντιγράφων ασφαλείας λίγο bit Δείτε τη συνολική εικόνα και μπορείτε να συνενώσετε αυτά τα πράγματα Έτσι αυτό είδος εκτείνεται σε υλικό που καλύπτει τρεις ή τέσσερις ενότητες στο βιβλίο και θέλω να χτυπήσει μόνο τα υψηλά σημεία σε διάλεξη Έτσι μια ερώτηση που προέρχεται Είμαι βέβαιος ότι κατέληξε για εσάς όπως σας κάνουν σπίτι είναι: "πόσο δοκιμές είναι αρκετά;" Και, δυστυχώς, για πολύ καιρό είδος του αν το ερώτημα στη βιομηχανία η απάντηση ήταν βασικά «Καλά, έχουμε μια προθεσμία αποστολής, Έτσι όμως η δοκιμή πολύ μπορούμε να κάνουμε πριν από την προθεσμία αυτή, αυτό είναι πόσο." Αυτό είναι τι έχετε χρόνο για. Έτσι, ξέρετε, ότι μια μικρή αναστροφή προφανώς δεν είναι πολύ καλή Έτσι, μπορείτε να κάνετε λίγο καλύτερα, δικαίωμα; Είστε εκεί κάποια στατική μέτρα όπως πόσες γραμμές κώδικα σας app διαθέτει και πόσες γραμμές των δοκιμών που έχετε; Και δεν είναι ασυνήθιστο στη βιομηχανία σε ένα καλά κομμάτι λογισμικού για τον αριθμό των γραμμών των δοκιμών να υπερβαίνουν κατά πολύ τον αριθμό των γραμμών του κώδικα Έτσι, ακέραιο πολλαπλάσιο δεν είναι ασυνήθιστο Και θεωρώ ακόμη και για είδος της, γνωρίζετε, έρευνα κώδικα ή παλι ποσοστό, γνωρίζετε, ίσως 1.5 δεν είναι παράλογο έτσι μία δυόμισι φορές το ποσό των Κώδικας δοκιμής όπως έχετε κωδικό εφαρμογής Και σε πολλά συστήματα παραγωγής όπου είναι πολύ συμπαθητικοί πληροφορίες για τη δοκιμή είναι πολύ υψηλότερα από αυτό Έτσι ίσως καλύτερα να θέσω μια ερώτηση: Αντί να λέει "πόσο δοκιμές είναι αρκετά;" είναι να ζητήσουμε από το "πόσο καλές είναι οι δοκιμές που κάνω τώρα; Πώς διεξοδική είναι;" Αργότερα σε αυτό το εξάμηνο Καθηγητής Sen θα μιλήσουμε για λίγο σχετικά με τυπικές μεθόδους και ταξινόμηση του τι είναι στα σύνορα της δοκιμές και τον εντοπισμό σφαλμάτων Αλλά δύο πράγματα που μπορούμε να μιλήσουμε για με βάση αυτό που ήδη γνωρίζετε είναι ορισμένες βασικές έννοιες σχετικά με τη δοκιμή κάλυψης Και αν και θα ήθελα να πω γνωρίζετε, έχετε λέμε όλα μαζί Τυπικές μέθοδοι, πραγματικά δεν λειτουργούν σε μεγάλα συστήματα Πιστεύω ότι η δήλωση αυτή, κατά τη γνώμη μου προσωπική αληθεύει όντως πολύ λιγότερο από ό, τι ήταν Πιστεύω ότι υπάρχουν ορισμένες συγκεκριμένες θέσεις ιδιαίτερα σε δοκιμές και τον εντοπισμό σφαλμάτων όπου τυπικές μέθοδοι να προχωρήσει γρήγορα και Koushik Sen, είναι ένας από τους ηγέτες που Έτσι θα έχετε την ευκαιρία να ακούσουμε περισσότερα σχετικά με αυτό αργότερα αλλά προς το παρόν νομίζω, είδους ψωμί και βουτύρου Ας είναι λόγος για κάλυψη μέτρησης επειδή αυτό είναι όπου το καουτσούκ πληροί της οδού όσον αφορά τον τρόπο σας θα αξιολογηθούν Εάν το κάνετε αυτό για πραγματικά χρήματα Τι είναι λοιπόν κάποια βασικά στοιχεία; Εδώ είναι μια πραγματικά απλή κλάση που μπορείτε να χρησιμοποιήσετε να μιλάμε για διαφορετικούς τρόπους για τη μέτρηση Πώς μας δοκιμής καλύπτει αυτόν τον κωδικό Και υπάρχουν μερικά διαφορετικά επίπεδα με διαφορετικές ορολογίες Δεν είναι πραγματικά καθολική σε όλα τα σπίτια του λογισμικού Αλλά ένα κοινό σύνολο ορολογία ότι εκθέτει το βιβλίο είναι θα μπορούσε να μιλάμε για S0 όπου μόλις θα σημαίνουν σας έχετε ονομάζεται μία φορά κάθε μέθοδος Έτσι ώστε να γνωρίζετε, εάν καλέσετε foo και κλήση ράβδου, είστε έτοιμοι Αυτό είναι κάλυψη S0: δεν τρομερά εις βάθος Είναι λίγο πιο αυστηρά, S1, μπορούμε να πούμε, μας κλήση της κάθε μεθόδου από κάθε τόπο που θα μπορούσε να ονομαστεί Συνεπώς τι σημαίνει αυτό; Αυτό σημαίνει, για παράδειγμα δεν είναι αρκετό για την κλήση ράβδου Έχετε για να βεβαιωθείτε ότι έχετε να το ονομάσουμε τουλάχιστον μία φορά από εδώ και αυτό απαιτεί μία φορά από οποιαδήποτε εξωτερικά καθήκοντα που μπορεί να θέσει το C0, που είναι ό, τι τα μέτρα που SimpleCov (όσοι από εσάς έχετε πάρει SimpleCov και εκτέλεση) ουσιαστικά, λέει που έχετε εκτελείται κάθε δήλωση έχετε θίξατε κάθε δήλωση στον κώδικά σας μία φορά Αλλά την επιφύλαξη εκεί είναι ότι conditionals μετράνε πραγματικά μόνο από μία πρόταση Οπότε, αν εσείς, ανεξάρτητα από το ποια υποκατάστημα αυτό "Εάν" που τραβήξατε όσο διάστημα θίξατε ένα από το άλλο σκέλος που έχετε εκτελείται η "Εάν «δήλωση Συνεπώς, ακόμη και C0 είναι ακόμη, γνωρίζετε, είδος επιφανειακή κάλυψης Αλλά, όπως θα δούμε ο τρόπος που θα θέλετε να διαβάσετε πληροφορίες είναι: Εάν λαμβάνετε * κακό * κάλυψη σε επίπεδο C0 στη συνέχεια έχετε πραγματικά πολύ άσχημα κάλυψης Επομένως, εάν δεν είστε είδος των αποφάσεων Αυτό το απλό επίπεδο επιφανειακή κάλυψης στη συνέχεια δοκιμής σας είναι πιθανώς ελλειπείς C1 είναι το επόμενο βήμα επάνω από αυτό Θα μπορούσαμε να πούμε: Λοιπόν, πρέπει να λάβουμε κάθε υποκατάστημα προς τις δύο κατευθύνσεις Έτσι, όταν κάνουμε αυτή τη δήλωση "if" θα πρέπει να βεβαιωθείτε ότι θα κάνουμε το "Εάν x" μέρος μία φορά και το "αν δεν x" τμήμα τουλάχιστον μία φορά σε πληρούν C1 Μπορείτε να προσθέσετε που με απόφαση κάλυψη λέει: λοιπόν, αν τώρα να... Εάν έχουμε δηλώσεων "if" όπου η Συνθήκη αποτελείται από πολλούς όρους θα πρέπει να βεβαιωθείτε ότι κάθε δευτερεύουσα έκφραση έχει αξιολογηθεί τις δύο κατευθύνσεις Με άλλα λόγια, αυτό σημαίνει ότι Αν τώρα την αποτυχία αυτή δήλωση "if" θα πρέπει να βεβαιωθείτε ότι αυτό αποτύχει, τουλάχιστον μία φορά επειδή y ήταν false σε τουλάχιστον μια φορά επειδή z ήταν ψευδείς Με άλλα λόγια, κάθε δευτερεύουσα έκφραση που θα μπορούσε να ανεξάρτητα, αλλάζουν το αποτέλεσμα της κατάστασης πρέπει να ασκείται κατά τις δύο κατευθύνσεις Και, στη συνέχεια, είδος, το ένα, γνωρίζετε, πολλοί άνθρωποι προσβλέπουν σε αλλά υπάρχει διαφωνία σχετικά με τον τρόπο πολύ πιο αξιόλογες είναι είναι μπορείτε να κάθε διαδρομή μέσω του κώδικα Προφανώς, αυτό είναι είδος δύσκολο επειδή τείνει να είναι εκθετική του αριθμού των συνθηκών Και γενικά είναι δύσκολο να αξιολογήσει εάν έχετε λάβει κάθε διαδρομή μέσω του κώδικα Υπάρχουν τυπικές τεχνικές που μπορείτε να χρησιμοποιήσετε να σας πω όπου βρίσκονται οι οπές όμως είναι ότι, η γραμμή κάτω σε πιο εμπορικού λογισμικού σπίτια θα έλεγα, δεν υπάρχει πλήρης συναίνεση σχετικά με τον τρόπο πολύ πιο πολύτιμο C2 είναι σε σύγκριση με C0 ή C1 Έτσι, πιστεύω ότι, για την τάξη μας σας να εκτεθεί στην ιδέα για το πώς μπορείτε να χρησιμοποιήσετε πληροφορίες κάλυψης SimpleCov εκμεταλλεύεται ορισμένες ενσωματωμένες δυνατότητες Ruby για να σας δώσω C0 κάλυψης [] Δεν πολύ ωραία εκθέσεις Μπορούμε να το δούμε αυτό είδος στο επίπεδο των μεμονωμένων γραμμών στο αρχείο σας Μπορείτε να δείτε τι είναι σας κάλυψης και πιστεύω ότι αυτό είναι είδος, γνωρίζετε μια καλή αρχή για πού είμαστε Έτσι, έχοντας δείτε ένα είδος διαφορετικές γεύσεις των δοκιμών Ενίσχυση των πίσω και Κοιτώντας πίσω από την μεγάλη εικόνα Τι είναι το διαφορετικό είδος των δοκιμών που έχουμε δει συγκεκριμένα; και τι είναι μειονεκτημάτων μεταξύ χρησιμοποιώντας αυτά τα διαφορετικά είδη δοκιμές; Έτσι έχουμε δει στο επίπεδο των επιμέρους κλάδους ή μεθόδους χρησιμοποιούμε RSpec, με την εκτεταμένη χρήση χλευάζει και stubbing Έτσι, για παράδειγμα, όταν κάνουμε μέθοδοι δοκιμών του μοντέλου Αυτό θα είναι ένα παράδειγμα της μονάδας δοκιμές Κάναμε επίσης κάτι που είναι αρκετά παρόμοια με λειτουργική ή λειτουργική μονάδα δοκιμής Όταν υπάρχουν περισσότερες από μία λειτουργική μονάδα συμμετέχουν Έτσι, για παράδειγμα, όταν κάναμε προδιαγραφές του ελεγκτή το είδαμε — μας προσομοιώσετε μια ενέργεια POST αλλά να θυμάστε ότι η ενέργεια POST πρέπει να περάσει το υποσύστημα δρομολόγησης πριν από αυτό παίρνει στον ελεγκτή Μόλις γίνει ο ελεγκτής θα προσπαθήσει για την απόδοση μιας προβολής Έτσι στην πραγματικότητα υπάρχει άλλα τεμάχια που συνεργάζονται με τον ελεγκτή ότι πρέπει να εργάζονται για προδιαγραφές του ελεγκτή να περάσει Έτσι, που είναι κάπου inbetween: Όταν κάνουμε περισσότερο από μία μόνο μέθοδος αγγίζει περισσότερο από μία και μοναδική κλάση αλλά εμείς, ακόμη, συγκέντρωση προσοχή [μας] σε ένα σχετικά στενό slice του συστήματος σε μια εποχή και εξακολουθεί να χρησιμοποιούμε την χλευάζει και stubbing εκτεταμένα για να απομονώσετε είδους η συμπεριφορά που θέλουμε για τη δοκιμή Και στη συνέχεια στο επίπεδο της σενάρια Αγγούρι αυτά είναι περισσότερο σαν ολοκλήρωσης ή των δοκιμών του συστήματος Αυτά ασκούν πλήρεις διαδρομές σε όλη την εφαρμογή Αγγίζουν πιθανότατα πολύ διαφορετικές ενότητες Τους κάνετε ελάχιστη χρήση των mocks και των στελεχών Επειδή μέρος του στόχου της μια ολοκλήρωση δοκιμής είναι ακριβώς για να ελέγξετε την αλληλεπίδραση μεταξύ τεμαχίων Έτσι, δεν θέλετε να το απόκομμα ή να ελέγξετε αυτές τις αλληλεπιδράσεις Θέλετε να αφήσετε το σύστημα να κάνει πραγματικά Τι θα κάνει πραγματικά Εάν αυτό ήταν ένα σενάριο που συμβαίνουν στην παραγωγή Πώς θα συγκρίνουμε αυτά τα διαφορετικά είδη δοκιμές; Υπάρχει λίγα διαφορετικούς άξονες που μπορούμε να εξετάσουμε Ένας από αυτούς είναι χρόνο και αν χρειαστεί να εκτελέσετε Τώρα, τόσο το RSpec όσο και το Αγγούρι έχουν, είδος, χρόνους υψηλό εκκίνησης και πράγματα όπως αυτή Αλλά, όπως θα δείτε καθώς αρχίζετε προσθήκη όλο και περισσότερες δοκιμές RSpec και τη χρήση autotest ώστε να εκτελούνται στο παρασκήνιο σε μεγάλο βαθμό, μια φορά RSpec είδος ξεκινήσει το εφαλτήριο εκτελείται πολύ γρήγορα προδιαγραφές ότι η εκτέλεση Αγγούρι δυνατότητες μόλις καθυστερεί πολύ όπως ουσιαστικά πυρκαγιές σας ολόκληρο εφαρμογής Και αργότερα σε αυτό το εξάμηνο θα δούμε ένας τρόπος για να Αγγούρι ακόμα χαμηλότερες — που είναι να πετύχει την πυρκαϊά μέχρι ένα ολόκληρο πρόγραμμα περιήγησης βασικά ενεργεί σαν μια μαριονέτα, απομακρυσμένο έλεγχο Firefox Έτσι μπορείτε να ελέγξετε κώδικα Javascript Θα κάνουμε το ότι όταν εμείς πραγματικά — Πιστεύω ότι θα είμαστε σε θέση να εργαστείτε με τους φίλους μας σε SourceLabs Έτσι μπορείτε να το κάνετε στο σύννεφο — που θα είναι συναρπαστικές Έτσι, "εκτέλεση fast" έναντι "αργή εκτέλεση" Ανάλυση: Εάν το σφάλμα συμβαίνει σε σας μονάδα δοκιμές συνήθως είναι πολύ εύκολη για να υπολογίσει και να παρακολουθήσετε αυτό το αρχείο προέλευσης αυτού του σφάλματος είναι επειδή οι δοκιμές είναι τόσο απομονωμένος Σας έχετε stubbed που ό, τι δεν έχει σημασία και σας εστιάζοντας μόνο τη συμπεριφορά του ενδιαφέροντος Έτσι, εάν έχετε κάνει καλή δουλειά που κάνουν όταν κάτι πάει λάθος σε μία από τις δοκιμές δεν υπάρχει σε πολλά μέρη κάτι που μπορούσε να πάει στραβά Αντίθετα, εάν εκτελείτε ένα σενάριο Αγγούρι Ιδού, γνωρίζετε, 10 βήματα και αγγίζει κάθε βήμα ένα σωρό τεμάχια το app Αυτό θα μπορούσε να πάρει πολύ καιρό για να λάβετε πραγματικά στο κάτω μέρος ενός σφάλματος Επομένως, είναι είδος του ανταλλαγή μεταξύ πόσο καλά μπορεί να σας localize σφάλματα Κάλυψη: Είναι δυνατόν αν γράψετε μια καλή σουίτα μονάδα και λειτουργικές δοκιμές Μπορείτε να λάβετε πραγματικά υψηλή κάλυψη Μπορείτε να εκτελέσετε την έκθεσή σας SimpleCov και πράγματι, μπορείτε να αναγνωρίσετε συγκεκριμένες γραμμές στα αρχεία σας που δεν έχουν γίνει ασκείται από οποιαδήποτε δοκιμή και στη συνέχεια μπορείτε να πάτε δικαίωμα σε δοκιμές που καλύπτουν τους Έτσι, έχει καθορίσει Τρόπος βελτίωσης σας κάλυψης για παράδειγμα, σε επίπεδο C0 είναι κάτι πολύ πιο εύκολα να γίνει με μονάδα δοκιμές ότι, με μια δοκιμή Αγγούρι — ένα σενάριο Αγγούρι — σας * είναι * συγκινητικό πολλά τμήματα του κώδικα αλλά σας κάνουν πολύ αραιοκατοικημένες Έτσι, εάν ο στόχος σας είναι να σηκωθείτε σας κάλυψης Χρησιμοποιήστε τα εργαλεία στο βρίσκονται στα επίπεδα μονάδα έτσι ώστε να μπορείτε να εστιάζοντας στην κατανόηση ποια τμήματα ή κωδικός είναι undertested και στη συνέχεια μπορείτε να γράψετε πολύ στοχοθετημένες δοκιμές απλώς να εστιασθεί τους Και, να ταξινομήσετε, γνωρίζετε, προκειμένου να ενοποιήσουμε αυτά τα κομμάτια οι δοκιμές μονάδα απομόνωσή τους και τους εξαίρετου ψηφίσματος τείνουν να χρησιμοποιήσετε πολλά mocks για να απομονώσετε το συμπεριφορές που σας δεν νοιάζονται για Αλλά αυτό σημαίνει ότι, εξ ορισμού που δεν ελέγχετε τις διασυνδέσεις και είναι είδος ένα "παραλήφθηκαν Σοφία" στο λογισμικό ότι πολλές από τις ενδιαφέρουσες σφάλματα παρατηρούνται κατά τις διασυνδέσεις μεταξύ τεμάχια και δεν ταξινομηθούν του μέσα σε μια κλάση ή μέσα σε μια μέθοδο — αυτές είναι είδος την εύκολη bugs για να παρακολουθήσετε το Και στο άλλο άκρο όσο περισσότερο έχετε έναντι της δοκιμής ολοκλήρωσης ακραίες που έπρεπε να εξαρτώνται όλο και λιγότερο mocks για αυτόν ακριβώς τον λόγο Σήμερα είδαμε, εάν που δοκιμάζετε κάτι σαν να πω, σε ένα service-oriented αρχιτεκτονική Όταν πρέπει να αλληλεπιδράσει με την απομακρυσμένη τοποθεσία στο τέλος θα έχετε έχοντας να κάνουμε μια δίκαιη ποσό χλευάζει και stubbing έτσι ώστε να μην βασίζεστε στο Internet για να σας δοκιμές να περάσει αλλά, μιλώντας γενικά προσπαθείτε να καταργήσετε καθώς πολλά από τα mocks που μπορείτε και αφήστε το σύστημα να εκτελέσει τον τρόπο θα εκτελεστεί στην πραγματική ζωή Έτσι, τα καλά νέα είναι σας * είναι * δοκιμές τις διασυνδέσεις * αλλά * όταν κάτι πάει στραβά σε μία από τις διασυνδέσεις επειδή το ψήφισμά σας δεν είναι τόσο καλό θα χρειαστεί περισσότερος χρόνος για να καταλάβετε τι είναι Έτσι, τι είδους το bit υψηλής σειράς από αυτή την ανταλλαγή είναι δεν θέλετε πραγματικά να βασιζόμαστε σε πολύ μεγάλο βαθμό κάθε ένα είδος της δοκιμής Εξυπηρετούν διάφορους σκοπούς και, ανάλογα με την προσπαθείτε να ασκήσουν σας περισσότερες διασυνδέσεις ή προσπαθείτε να βελτιωθεί σας κάλυψη πρόστιμο κόκκους Αυτό επηρεάζει τον τρόπο μπορείτε να αναπτύξετε σας δοκιμαστική σουίτα και σας θα εξελιχθεί αυτό μαζί με το λογισμικό σας Έτσι, μας έχετε χρησιμοποιήσει ένα συγκεκριμένο σύνολο ορολογία δοκιμές Είναι η ορολογία που, από και μεγάλο χρησιμοποιείται ευρέως στην Κοινότητα του Rails αλλά υπάρχει κάποια παραλλαγή [και] ορισμένοι όροι που θα ακούγεται Αν πάτε να βρείτε δουλειά κάπου και σας ακούμε για δοκιμή μετάλλαξης που εμείς δεν το έχετε κάνει Αυτή είναι μια ενδιαφέρουσα ιδέα που ήταν, νομίζω, επινοήθηκε από Ammann και Offutt, οι οποίοι έχουν, ταξινόμηση των το οριστικό βιβλίο για δοκιμή λογισμικού Η ιδέα είναι: Ας υποθέσουμε ότι θα παρουσιάζει ένα σφάλμα που σκόπιμη μου κώδικα αναγκαστική ότι κάποια δοκιμή να αποτύχει; Επειδή, εάν άλλαξε, γνωρίζετε, "Εάν x" να "αν όχι x" και δεν έλεγχοι αποτύχουν, τότε είτε εγώ λείπουν κάποια κάλυψη ή μου app είναι πολύ περίεργη και κατά κάποιον τρόπο μη προσδιοριστικών Fuzz δοκιμών, που Koushik Sen μπορεί να μιλήσει περισσότερο για βασικά, αυτό είναι το "10.000 πιθήκους σε γραφομηχανές ρίχνουν τυχαίας εισόδου σε σας κώδικα" Τι είναι το ενδιαφέρον σχετικά με αυτό είναι ότι οι δοκιμές που έχετε κάνουμε ουσιαστικά, είναι κατασκευασμένο για να δοκιμάσετε το app ο τρόπος που σχεδιάστηκε και αυτά, γνωρίζετε, fuzz δοκιμές είναι πληροφορίες για τη δοκιμή της app με τρόπους αυτό * δεν * σημαίνει να χρησιμοποιηθεί Έτσι, τι συμβαίνει σε περίπτωση που το πετάμε υποβολές τεράστια φόρμας Τι θα συμβεί αν τοποθετήσετε χαρακτήρες ελέγχου φορμών σας; Τι θα συμβεί εάν υποβάλετε ξανά και ξανά το ίδιο πράγμα; Και, Koushik έχει μια στατιστική που Microsoft βρίσκει έως το 20% της τους σφάλματα χρησιμοποιούν κάποια παραλλαγή των δοκιμών fuzz και ότι περίπου 25 % τα κοινά προγράμματα της γραμμής εντολών Unix μπορεί να γίνει για να διακοπεί η λειτουργία του [όταν] τίθενται μέσω επιθετική fuzz δοκιμών Καθορισμός χρήσης κάλυψης είναι κάτι που εμείς δεν το έχετε κάνει αλλά είναι μια άλλη ενδιαφέρουσα ιδέα Η ιδέα είναι ότι σε κάθε σημείο του προγράμματος μου υπάρχει θέση όπου ορίζω — ή αναθέσω μια τιμή σε ορισμένες μεταβλητή — και στη συνέχεια, υπάρχει μια θέση κατάντη όπου προφανώς πρόκειται να καταναλώνουν την τιμή — κάποιος θα χρησιμοποιήσει την τιμή Μου έχουν καλυφθεί κάθε ζεύγος; Με άλλα λόγια, δεv έχω δοκιμές όπου κάθε ζεύγος τον ορισμό μιας μεταβλητής και χρήση τους κάπου εκτελείται σε κάποιο μέρος της μου σουίτες δοκιμής Μερικές φορές ονομάζεται DU-κάλυψης Και άλλοι όροι που θεωρώ ότι δεν ευρύτερα χρησιμοποιούνται πλέον blackbox έναντι των whitebox ή blackbox, έναντι glassbox Χονδρικά, μια δοκιμή blackbox είναι ένα που είναι γραμμένο από την άποψη των εξωτερικών προδιαγραφών του το πράγμα [Για παράδειγμα:] "Αυτό είναι ένα πίνακα hash Όταν σε ένα κλειδί θα πρέπει να πίσω μια τιμή Εάν η διαγραφή του κλειδιού που η τιμή δεν πρέπει να υπάρχουν" Αυτό είναι μια δοκιμή blackbox, γιατί δεν λέει τίποτα σχετικά με το πώς υλοποιείται πίνακα hash και αυτό δεν προσπαθούν να τονίσω την εφαρμογή Μπορεί να είναι μια αντίστοιχη δοκιμή whitebox: «Γνωρίζω κάτι σχετικά με τη συνάρτηση κατακερματισμού και πρόκειται να δημιουργήσει επίτηδες τα κλειδιά κατακερματισμού σε περιπτώσεις μου δοκιμής που προκαλούν πολλές συγκρούσεις κατακερματισμού για να βεβαιωθείτε ότι εγώ δοκιμές τμήμα της λειτουργικότητας" Τώρα, ένα C0 δοκιμή κάλυψη εργαλείο, όπως SimpleCov θα αποκαλύψει ότι, εάν όλα τα είχατε είναι blackbox δοκιμές Ίσως διαπιστώσετε ότι κάλυψη κώδικα σύγκρουσης δεν ήταν πλήττεται και πολύ συχνά Και που θα μπορούσε να συμβουλή σας και να πω: "Ok, αν θέλω πραγματικά να την ενισχύσει — για μία, αν θέλω να ενισχύσει την κάλυψη για τις δοκιμές αυτές τώρα πρέπει να γράψετε μια whitebox ή glassbox δοκιμή Πρέπει να εξετάσετε το εσωτερικό, δείτε τι σημαίνει την εφαρμογή συγκεκριμένες λύσεις να προσπαθήσει να σπάσει την εφαρμογή με κακό τρόπους" Έτσι, νομίζω, δοκιμές είναι ένα είδος τρόπο ζωής, σωστά; Έχουμε πάρει από τη φάση της "Θα οικοδομούμε το όλο θέμα και στη συνέχεια εμείς θα τη δοκιμάσετε" και έχουμε πάρει στην φάση της "Μας δοκιμάζετε δρόμος" Δοκιμή είναι πραγματικά περισσότερο σαν εργαλείο ανάπτυξης και όπως τόσα πολλά εργαλεία ανάπτυξης εξαρτάται από την αποτελεσματικότητα της σχετικά με το αν χρησιμοποιείτε μια καλαίσθητη τρόπο Έτσι, μπορούμε να πούμε: "καλά, ας δούμε — μου κλώτσησε λάστιχα Γνωρίζετε, εγώ που τροφοδοτούνται από το πρόγραμμα περιήγησης, προσπάθησα δύο πράγματα (ζητωκραυγές χέρι) Μοιάζει λειτουργεί! Αναπτύξετε!" Αυτό είναι, προφανώς, μια περιφρόνηση κάτι περισσότερο από ό, τι θα θέλετε να Και, από τον τρόπο, ένα από τα πράγματα που ανακαλύψαμε με αυτό online μαθήματος που μόλις εκκίνηση Όταν 60.000 άτομα είναι εγγεγραμμένοι κατά τη διάρκεια και 0,1% από αυτά τα άτομα έχουν πρόβλημα θα λάβετε 60 μηνύματα ηλεκτρονικού ταχυδρομείου Το πόρισμα είναι: όταν η τοποθεσία σας χρησιμοποιείται από πολλά άτομα ορισμένες ηλίθια σφάλμα που δεν μπορέσατε να βρείτε αλλά ότι θα μπορούσαν να έχουν βρεθεί με δοκιμή πολύ γρήγορα θα μπορούσε να δημιουργήσει * μια παρτίδα * του πόνου Από την άλλη πλευρά, δεν θέλετε να είναι δογματική και να πω "ΕΕΕ, μέχρις ότου έχουμε κάλυψης 100% και κάθε δοκιμής είναι πράσινο Εμείς οπωσδήποτε δεν θα περιλαμβάνεται" Δεν είναι υγιές είτε Και η ποιότητα δοκιμής δεν είναι απαραίτητα ο συσχετισμός με τη δήλωση εκτός εάν έχετε να πείτε κάτι σχετικά με την ποιότητα των σας δοκιμών μόνο και μόνο επειδή που έχετε εκτελείται κάθε γραμμή δεν σημαίνει ότι έχετε ελέγξει τις ενδιαφέρουσες υποθέσεις Έτσι, κάπου εν τω μεταξύ, θα μου πείτε "Καλά, θα χρησιμοποιήσουμε κάλυψη εργαλεία για τον εντοπισμό undertested ή κακώς έχουν δοκιμαστεί σε τμήματα του κώδικα και θα τους χρησιμοποιήσουμε ως κατευθυντήρια γραμμή για την ταξινόμηση της βοήθειας να βελτιωθεί μας επίπεδο συνολικής εμπιστοσύνης" Να θυμάστε, όμως Αζίλ είναι σχετικά με την αποδοχή των αλλαγών και διαχείρισή τους Μέρος της αλλαγής είναι τα πράγματα θα αλλάξει αυτό θα προκαλέσει σφάλματα που δεν μπορείτε να προβλέψετε και η σωστή αντίδραση είναι: Είναι αρκετά άνετο για τα εργαλεία δοκιμών [αυτό] ότι μπορείτε να βρείτε γρήγορα τα λάθη αυτά Γράψτε μια δοκιμή που αναπαράγει το σφάλμα Και στη συνέχεια, να τη δοκιμή πράσινο Μπορείτε στη συνέχεια θα το διορθώσετε πραγματικά Αυτό σημαίνει ότι, ο τρόπος που πραγματικά μπορείτε να διορθώσετε ένα σφάλμα είναι Εάν δημιουργήσατε μια δοκιμή που σωστά απέτυχε για να αναπαραγάγετε το σφάλμα και στη συνέχεια επανήλθε και καθορισθεί κώδικα για να κάνετε τις δοκιμές αυτές περνούν Ομοίως, δεν θέλετε να πω "Καλά, μονάδα δοκιμές σας δώσει καλύτερη κάλυψη Τους κάνετε πιο εμπεριστατωμένη και λεπτομερή Ας εστιασθεί όλων μας ενέργειας που" σε αντίθεση με "Ω, εστιασθεί δοκιμές ολοκλήρωσης επειδή είναι πιο ρεαλιστική, σωστά; Αντικατοπτρίζουν αυτό τον πελάτη που είπε θέλουν Έτσι, εάν οι δοκιμές ολοκλήρωσης εξ ορισμού μας σύσκεψη ανάγκη πελάτη". Και πάλι, δύο άκρα είναι είδος ανθυγιεινά επειδή κάθε μία από αυτές μπορεί να εντοπίσετε προβλήματα που θα η απόκλιση από την άλλη Έτσι, έχοντας έναν καλό συνδυασμό αυτών είναι το είδος του σύνολο είναι όλα σχετικά με Είναι το τελευταίο πράγμα που θέλω να αφήσω με, νομίζω ότι όσον αφορά τις δοκιμές, είναι "TDD έναντι Αυτό που αποκαλώ συμβατικών εντοπισμού σφαλμάτων — δηλαδή, ο τρόπος που το ότι όλοι μας είδος κάνουμε ακόμη και αν λέμε ότι δεν το κάνουμε" και όλοι προσπαθούμε να πάρετε καλύτερα, δικαίωμα; Είμαστε όλοι είδος στο περιθώριο βιβλιοδεσίας Ορισμένοι από εμάς εξετάζουν τα αστέρια προσπαθεί να βελτιώσει τις πρακτικές Αλλά, έχοντας τώρα έζησε με αυτό για 3 ή 4 ετών ο ίδιος και — θα είναι έντιμη — πριν από 3 χρόνια δεν κάνω TDD Θα το κάνουμε τώρα, επειδή θεωρώ ότι είναι καλύτερο και εδώ είναι μου απόσταξη, γιατί νομίζω ότι δουλεύει για μένα Συγγνώμη, τα χρώματα είναι λίγο περίεργο αλλά στην αριστερή στήλη του πίνακα [] λέει "Συμβατικό εντοπισμού σφαλμάτων" και η δεξιά πλευρά λέει "TDD" Τι είναι λοιπόν ο τρόπος που χρησιμοποίησα για να γράψετε κώδικα; Ίσως ορισμένοι από εσάς εξακολουθεί να κάνετε αυτό Γράφω ένα σωρό γραμμές ίσως μερικές δεκάδες γραμμές κώδικα Είμαι * βεβαιωθείτε ότι * είναι σωστή — Εννοώ, μου * am * ένα καλό προγραμματιστή, σωστά; Αυτό δεν είναι που σκληρά Μπορώ να τον εκτελέσω – δεν λειτουργεί OK, φωτιά μέχρι το πρόγραμμα εντοπισμού σφαλμάτων – αρχίζουν να βάζουν στο του printf Εάν σας χρησιμοποιεί TDD τι θα κάνω αντίθετα; Καλά θα γράφω ένα * μερικές * γραμμές κώδικα, έχοντας γράψει πρώτα μια δοκιμή Τόσο ως σύντομα, όπως η δοκιμή πηγαίνει από κόκκινο σε πράσινο Γνωρίζω ότι απέστειλα ο κωδικός που εργάζεται — ή τουλάχιστον τα μέρη της συμπεριφοράς που θα είχα κατά νουν Τα τμήματα της συμπεριφοράς έργο, διότι είχα μια δοκιμή OK, πίσω στο συμβατικό εντοπισμού σφαλμάτων: Εκτελώ προγράμματος μου, που προσπαθεί να βρει τα σφάλματα Ξεκινώ την τοποθέτηση στο printf του παντού για να εκτυπώσετε τις τιμές των πραγμάτων που είναι πολύ διασκεδαστικό Όταν προσπαθείτε να διαβάσετε τους εκτός από τις 500 γραμμές της εξόδου του αρχείου καταγραφής ότι θα λάβετε σε ένα Σιδηροτροχιές app προσπαθούμε να βρούμε * σας * του printf γνωρίζετε, "γνωρίζω τι θα κάνω — Θα σε βάλω σε 75 αστερίσκους πριν και μετά Αυτό θα καταστήσει αναγνώσιμο"(γέλια) Ποιος δεν — Ok, να αυξήσει τα χέρια σας, εάν δεν το κάνετε! Ευχαριστώ πολύ για σας εντιμότητα. (γέλια) Ok. Ή — Ή θα μπορούσε να κάνει κάτι άλλο που πρέπει, θα μπορούσα να πω: Αντί να εκτυπώσετε την τιμή μιας μεταβλητής γιατί δεν γράφω μια δοκιμή που επιθεωρεί το στο η προσδοκία που πρέπει να και θα γνωρίζω αμέσως στο φωτεινό κόκκινο γράμματα Εάν δεν πληρούται αυτή την προσμονή Εντάξει, εγώ πίσω για το συμβατικό debugging πλευρά: Εγώ ξεσπάσει το big guns: μου απομακρύνετε το Ruby πρόγραμμα εντοπισμού σφαλμάτων Ορίζω ένα σημείο διακοπής εντοπισμού σφαλμάτων, και να ξεκινήσω τώρα * tweaking * και να πω "Ω, ας δούμε, θα πρέπει να ξεπεράσουμε αυτή τη δήλωση «αν» Συνεπώς, πρέπει να οριστεί ότι πράγμα Ω, πρέπει να καλέσετε τη μέθοδο αυτή και επομένως θα πρέπει να..." Όχι! Εγώ * θα μπορούσε να * αντίθετα — αν πρόκειται να το κάνουμε αυτό έτσι κι αλλιώς — Ας κάνουμε αυτό απλώς, σε ένα αρχείο, η οποία έχει συσταθεί ορισμένες mocks και τα αποκόμματα για να ελέγξετε τη διαδρομή κώδικα, να ακολουθήσουν τον δρόμο που θέλω Και τώρα, "Ok, σίγουρα θα έχετε καθοριστεί! Θα πάρω από το πρόγραμμα εντοπισμού σφαλμάτων, το εκτελέσετε ξανά όλα! " Και, φυσικά, 9 φορές από 10, δεν διορθώσετε αυτό ή σας είδος εν μέρει έχει καθορισθεί αλλά εντελώς δεν μπορείτε να διορθώσετε το και τώρα πρέπει να κάνετε μη αυτόματη όλα αυτά όλα άνω ξανά ή το * έχω ήδη μια δέσμη των δοκιμών και σας μπορούν απλώς επανεκτέλεση τους αυτόματα και θα μπορούσα, εάν ορισμένα από αυτά δεν "Ω, σας διόρθωσε το όλο θέμα Κανένα πρόβλημα, θα μόλις μετάβαση πίσω!" Έτσι, το συμπέρασμα είναι ότι γνωρίζετε, σας * θα μπορούσε να * το κάνουμε στην αριστερή πλευρά αλλά χρησιμοποιείτε τις ίδιες τεχνικές και στις δύο περιπτώσεις Η μόνη διαφορά είναι, σε μία περίπτωση το κάνετε με μη αυτόματο τρόπο που είναι βαρετό και επιρρεπής Στην άλλη περίπτωση που κάνετε λίγο περισσότερη εργασία αλλά μπορείτε να το κάνετε αυτόματη και επαναλαμβανόμενης και έχουν, ξέρετε, ορισμένες υψηλή εμπιστοσύνη ότι, καθώς αλλάζετε τα πράγματα στον κώδικά σας δεν γίνεται ανασυσκευασία πράγματα που χρησιμοποιούνται για την επεξεργασία και ουσιαστικά είναι πιο παραγωγικοί Έτσι κάνετε όλα τα ίδια πράγματα αλλά με, ένα είδος, το «δέλτα"επιπλέον εργασία χρησιμοποιείτε σας προσπάθεια σε πολύ υψηλότερο μόχλευση Γι είδος άποψή μου είναι καλό να TDD Είναι πραγματικά, να μην απαιτεί νέες δεξιότητες Αυτό ακριβώς απαιτεί [] να refactor τις υπάρχουσες δεξιότητές σας Επίσης, προσπάθησε όταν σας — ξανά, ειλικρινείς Εξομολογήσεις, δεξιά; — όταν άρχισα να κάνει αυτό ήταν σαν "Ok, εγώ πρόκειται να διδάσκει μια σειρά μαθημάτων επί σιδηροτροχιών Εγώ πραγματικά θα πρέπει να επικεντρωθεί στις δοκιμές Έτσι πήγα πίσω με κάποιον κώδικα που έστειλα επιστολή Αυτό ήταν * εργασίας * — γνωρίζετε, που ήταν αξιοπρεπή κώδικα — και άρχισα προσπαθώντας να γράψει δοκιμές για και ήταν * τόσο επίπονη * επειδή ο κώδικας δεν ήταν γραμμένο με τρόπο που ήταν αναπτύξετε Υπήρχαν κάθε είδους αλληλεπιδράσεων Υπήρχαν, όπως, ένθετα conditionals Και αν θέλετε να απομονώσετε μια ιδιαίτερη δήλωση και να το δοκιμάσετε — δοκιμή έναυσμα — μόνο η δήλωση το ποσό της πράγματα που θα πρέπει να οριστεί στον σας δοκιμής να συμβεί — να θυμάστε όταν μίλησε για ναυάγια διακωμωδώ αμαξοστοιχίας — πρέπει να ορίσετε όλες τις εν λόγω υποδομή απλώς, για να αποκτήσετε το * μία * γραμμή κώδικα και να που κάνετε και να πας "Gawd, δοκιμές πραγματικά δεν είναι αξίζει! Έγραψα 20 γραμμές του προγράμματος εγκατάστασης έτσι ώστε θα μπορούσαν να δοκιμάζω δύο γραμμές στη μου συνάρτηση!" Αυτό που πραγματικά λέγοντάς σας — όπως αντιλαμβάνομαι τώρα — είναι η συνάρτηση σας είναι * κακό * Είναι μια κακή γραπτή συνάρτηση Δεν πρόκειται για μια συνάρτηση αναπτύξετε Ότι το πήρε πάρα πολλά κινητά στοιχεία των οποίων εξαρτήσεις * μπορεί να * έχει διακοπεί Δεν υπάρχει καμία ραφές μου συνάρτησης αυτό επιτρέψτε μου να μεμονωμένα, να ελέγξετε τις διαφορετικές συμπεριφορές Και μόλις ξεκινήσετε να κάνει την πρώτη ανάπτυξη δοκιμής γιατί πρέπει να γράψετε σας δοκιμές σε μικρά κομμάτια είδος του θέτει το ζήτημα αυτό να εξαφανιστούν Έτσι ώστε να έχει μου Θεοφάνια