Αποκτήστε πρακτική πρακτική με δοκιμαστική ανάπτυξη στο C #

Ας μιλήσουμε λοιπόν για το TDD - τι είναι αυτό;

Το TDD σημαίνει Test Driven Development και είναι μια διαδικασία σχεδιασμού στην ανάπτυξη λογισμικού. Βασίζεται στην επανάληψη ενός πολύ σύντομου κύκλου ανάπτυξης, και οι απαιτήσεις μετατρέπονται σε πολύ συγκεκριμένες περιπτώσεις δοκιμών.

Υπάρχουν μερικά βήματα στη διαδικασία TDD:

  1. Γράψτε μια δοκιμή μονάδας που αποτυγχάνει.
  2. Γράψτε αρκετό κωδικό για να περάσετε το τεστ - σε αυτό το βήμα δεν μας ενδιαφέρει ο καλός κώδικας.
  3. Αναμορφώστε τον κωδικό σας από το προηγούμενο βήμα.

Ποια είναι τα οφέλη αυτής της προσέγγισης;

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

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

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

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

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

Πριν αρχίσουμε να γράφουμε TDD…

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

Επομένως, μόλις εξήγησα τη γενική ιδέα και τα πλεονεκτήματα της διαδικασίας σχεδιασμού TDD.

Ήρθε η ώρα να γράψετε μερικές δοκιμές, οπότε ας το κάνουμε

Περιγραφή και απαιτήσεις

Θα χρησιμοποιήσουμε το C # για να γράψουμε μια εφαρμογή Stack. Γιατί C #; Λοιπόν, γιατί λατρεύω το C #, γιατί γιατί όχι; ;

Έτσι, οι απαιτήσεις μας είναι πολύ απλές: θέλουμε να εφαρμόσουμε μια τάξη Stack, οπότε οι απαιτήσεις είναι:

  1. Περιορίστε το μέγεθος της στοίβας.
  2. Προσθήκη στοιχείου. (Σπρώξτε)
  3. Αφαιρέστε το στοιχείο. (κρότος)
  4. Ελέγξτε ποιο ήταν το τελευταίο στοιχείο. (κρυφοκοίταγμα)
  5. Λάβετε το τρέχον μέγεθος της στοίβας.
  6. Έχετε μια τάξη που μπορεί να δεχτεί οποιονδήποτε τύπο δεδομένων.
  7. Όταν ο πελάτης υπερβαίνει το μέγεθος της στοίβας, πρέπει να ρίξουμε μια κατάλληλη εξαίρεση.

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

Εφαρμογή στοίβας σε TDD - Κατασκευή υποδομής

Χρησιμοποιώ το visual studio 2017. Σε αυτό, θα ανοίξω ένα νέο έργο:

Αρχείο -> Νέο -> P roject, C hoose Conso le App (.NET Framework).

Επιλέξτε ένα όνομα έργου - όπως το "Stack".

Τώρα θα ανοίξουμε ένα άλλο έργο μόνο για τις δοκιμές και θα το ονομάσουμε "StackTests".

Ανοίξτε τον εξερευνητή λύσης. Έχουμε ένα έργο εκεί που ονομάζεται "Stack". Τώρα κάντε δεξί κλικ στο Solution και επιλέξτε Add -> New Projct και choo se Class Libr ary (.NET Framework)

Ας εγκαταστήσουμε τις δοκιμές μονάδας μας: κάντε δεξί κλικ στο έργο StackTests , επιλέξτε Διαχείριση πακέτων NuGet , πλοηγηθείτε στο "Αναζήτηση" και εγκαταστήστε τα ακόλουθα πακέτα:

  • NUnit
  • Προσαρμογέας NUnit3Test

Προσθέστε μια νέα τάξη στο έργο StackTests και καλέστε το StackTest. Τώρα η λύση θα πρέπει να έχει την εξής μορφή:

Το package.config πρέπει να έχει την εξής μορφή:

Εφαρμογή στοίβας σε TDD - Γράψτε κώδικα

Θα αρχίσουμε να γράφουμε μονάδες δοκιμών στο έργο StackTests στην κατηγορία StackTest.

Προτού αρχίσουμε να γράφουμε τον κώδικα, πρέπει να μάθουμε 3 σημαντικά πράγματα: TestFixture, Test και Assert.

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

Το χαρακτηριστικό Test είναι ένας τρόπος επισήμανσης μιας μεθόδου σε μια κλάση TestFixture ως δοκιμή.

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

Εισαγάγετε το "NUnit.Framework" και τοποθετήστε το χαρακτηριστικό [TestFixture] πάνω από τον ορισμό της τάξης σας.

Δοκιμή δημιουργίας

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

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

Στη γραμμή εργαλείων, κάντε κλικ στην επιλογή Δοκιμή -> Εκτέλεση -> Όλες οι δοκιμές.

Εάν η δοκιμαστική σας εξερεύνηση δεν είναι ανοιχτή, κάντε κλικ στο Test -> Windows -> Test Ex plorer και αυτό θα επεκτείνει τον εξερευνητή δοκιμών

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

Ας κάνουμε την πρώτη δοκιμαστική εργασία μας:

  • Δημιουργήστε μια νέα τάξη στο έργο Stack και καλέστε αυτήν την τάξη "Stack". Κάντε αυτήν την τάξη μια γενική κατηγορία τύπου (τύπος T).
  • Ορίσαμε αυτήν την κατηγορία (Stack) που θα εφαρμοστεί ως μια σειρά, ως εκ τούτου, θα ορίσουμε το πεδίο μέλος ως σειρά τύπου Τ .
  • Πρέπει να περάσουμε το μέγιστο μήκος της στοίβας στον κατασκευαστή, επομένως θα δημιουργήσουμε έναν κατασκευαστή που θα παίρνει ένα όρισμα μεγέθους.
  • Και δεδομένου ότι απαιτούμε να λάβουμε το τρέχον μέγεθος της στοίβας σε οποιοδήποτε σημείο, θα ορίσουμε μια ιδιότητα "Μέγεθος" Φυσικά, κανείς δεν θα μπορεί να αλλάξει το μέγεθος, επομένως θα είναι ένα ιδιωτικό σετ .

Τώρα ας εκτελέσουμε ξανά τις δοκιμές (ελέγξτε παραπάνω πώς να εκτελέσετε δοκιμές) και δείτε τα αποτελέσματα.

Και εκεί πάμε, κάναμε την πρώτη επανάληψη με το σχεδιασμό TTD! Τώρα πρέπει να αναδιαμορφώσουμε τον κώδικά μας - αλλά σε αυτό το σημείο, δεν έχουμε πραγματικά τίποτα να αναπαράγουμε, έτσι θα προχωρήσουμε μπροστά.

Δοκιμή Push & Pop

Τώρα θέλουμε να δοκιμάσουμε τη λειτουργία push και pop, οπότε ας δημιουργήσουμε τη δοκιμαστική θήκη.

  • Το Push θα πάρει ένα όρισμα και θα το προσθέσει στην κορυφή της στοίβας.
  • Το Pop θα αφαιρέσει το στοιχείο από τη στοίβα και θα το επιστρέψει.

Θα προσθέσουμε 3 στοιχεία στη στοίβα και μετά θα βγάλουμε το τελευταίο στοιχείο. Σε αυτό το σημείο θα ελέγξουμε ότι το τελευταίο στοιχείο είναι το ακριβές που περιμένουμε να πάρουμε και ότι το μέγεθος της στοίβας μειώθηκε.

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

Ας ξαναρχίσουμε τις δοκιμές μας και ας πούμε, όλα λειτουργούν τέλεια! Όλες οι δοκιμές πέρασαν επιτυχώς;

Σφάλμα υπέρβασης του επιτρεπόμενου μεγέθους

Θέλουμε να κάνουμε προσαρμοσμένες εξαιρέσεις όταν:

  1. Πιέστε το νέο στοιχείο όταν η στοίβα είναι γεμάτη.
  2. Εμφανίστε το στοιχείο όταν δεν υπάρχουν στοιχεία στη στοίβα.

Όπως ήδη γνωρίζετε… τι πρέπει να κάνουμε τώρα;

Σωστός! Ορίζουμε δοκιμαστικές περιπτώσεις και μετά κάνουμε τον κώδικα να λειτουργεί.

Όπως μπορείτε να δείτε, πρέπει να δημιουργήσουμε δύο νέες εξατομικευμένες εξαιρέσεις.

  • ExpenditureProhibitedException - Αυτή η εξαίρεση θα συμβεί όταν η στοίβα είναι κενή και ο πελάτης προσπαθεί να βγει ένα νέο στοιχείο.
  • ExcededSizeException - Αυτή η εξαίρεση θα συμβεί όταν η στοίβα είναι γεμάτη και ο πελάτης προσπαθεί να προσθέσει ένα νέο στοιχείο στη στοίβα.

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

Τροποποιήστε την τρέχουσα λειτουργία push και pop για να κάνετε μια εξαίρεση όταν χρειάζεται.

Τώρα λοιπόν, ως μέρος του κύκλου ζωής του TDD, διεξάγουμε τις δοκιμές… και Hooray! Όλες οι δοκιμές έχουν περάσει με επιτυχία.

Ρίξτε μια ματιά στο τελευταίο στοιχείο

Πρόκειται να τελειώσουμε με τις τελευταίες δοκιμές. Θέλουμε να ρίξουμε μια ματιά στο τελευταίο στοιχείο στη στοίβα. Αν η στοίβα είναι άδεια, θα ρίξουμε μια εξαίρεση ExpenditureProhibitedException, διαφορετικά, θα επιστρέψουμε το τελευταίο στοιχείο.

Ας δημιουργήσουμε τις δοκιμαστικές μας περιπτώσεις.

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

Όταν εκτελούμε τις δοκιμές, θα αποτύχουν - η μέθοδος peek δεν υπάρχει καν και δεν υπάρχει λειτουργικότητα.

Θα δημιουργήσουμε τη λειτουργία Peek at Stack class .

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

Συμπερασματικά

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

Μπορείτε να δείτε ολόκληρο τον κώδικα στο Pastebin.

Κατηγορία στοίβας - Αυτή η κλάση περιέχει όλες τις υλοποιήσεις της στοίβας.

Κατηγορία StackTests - Περιέχει όλες τις δοκιμαστικές περιπτώσεις.

Τάξεις CustomExceptions - Περιέχει τις εξαιρέσεις που απαιτείται από το σύστημα για το σχεδιασμό TDD.

Κάθε σχόλιο και όλα τα σχόλια είναι ευπρόσδεκτα - αν είναι απαραίτητο, θα διορθώσω το άρθρο.

Μη διστάσετε να επικοινωνήσετε μαζί μου απευθείας στο LinkedIn - Κάντε κλικ εδώ.