Πώς μπορείτε να δοκιμάσετε τις εφαρμογές Node.js με το Ava.js

Γιατί θα θέλατε να γράψετε δοκιμαστικές θήκες για τις εφαρμογές σας; Λοιπόν, είναι μια ερώτηση που πολλοί προγραμματιστές προσπαθούν να αποφύγουν, καθαρά επειδή χρειάζεται προσπάθεια και χρόνο και επειδή οι μη αυτόματες δοκιμές είναι πολύ πιο ικανοποιητικές. Κάντε κλικ… κάντε κλικ… συμπληρώστε μια φόρμα… Κάντε κλικ… Presto. Η εφαρμογή μου λειτουργεί, τα API μου είναι καλά, όλα είναι χονδροειδή.

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

Σε αυτό το σημείο θα λέγατε συνήθως, "Μακάρι να γράψω μερικές δοκιμαστικές περιπτώσεις." Λάβετε λοιπόν έμπνευση από το Facebook: μοιράστηκαν ένα πολύ ωραίο άρθρο εδώ, εξηγώντας πώς η ομάδα ανέπτυξε το React 16 με δοκιμαστική ανάπτυξη.

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

Σε αυτό το άρθρο έχω καλύπτονται πώς να στήσετε και να γράφουν τις βασικές περιπτώσεις δοκιμής μονάδα με τις εκθέσεις κάλυψης για εφαρμογές Node.js .Ας πάμε λοιπόν.

Γεια σου Άβα

Η Ava είναι δρομέας δοκιμής JavaScript. Χρησιμοποιεί τη φύση ασύρματου I / O του κόμβου και εκτελεί ταυτόχρονες δοκιμές, μειώνοντας κατά πολύ τους χρόνους δοκιμής σας.

Ας αρχίσουμε

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

yarn add ava babel-register

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

Η ενημέρωσή σας package.jsonπρέπει τώρα να έχει την εξής μορφή:

{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start" : "node server.js", "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch" }, "dependencies": { "ava": "^0.23.0", "babel-register": "^6.26.0" }, "ava": { "require": [ "babel-register" ] }}

Το babel-registertranspiles ES6 code κατά το χρόνο εκτέλεσης σε περίπτωση που ορισμένα μηχανήματα εκτελούνται σε μια παλιά έκδοση του κόμβου που δεν υποστηρίζει το ES6 Η verboseσημαία θα μας δώσει κάποια καθαρή έξοδο ανάλογα με το αν οι δοκιμές μας αποτύχουν ή περάσουν. Αυτή η επισήμανση είναι αρκετά χρήσιμη κατά τον εντοπισμό σφαλμάτων των δοκιμών σας, αλλά αν γράψετε εκατοντάδες δοκιμαστικές περιπτώσεις, ίσως θελήσετε να την απενεργοποιήσετε.

Στο δικό σας tests/index.test.js, μπορείτε να προσθέσετε την πρώτη σας δοκιμαστική θήκη:

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

Η εκτέλεση yarn testαπό την κονσόλα σας δίνει την ακόλουθη έξοδο:

Σε περίπτωση αποτυχίας μιας από τις δοκιμές μας, θα λάβουμε:

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

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

Ρύθμιση του διακομιστή κόμβων

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

yarn add express body-parser 

Στον κατάλογο εργασίας σας, δημιουργήστε ένα app.jsκαι προσθέστε το ακόλουθο απόσπασμα:

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

Δημιουργήστε ένα νέο αρχείο server.jsκαι εισαγάγετε τη λειτουργική μονάδα για να ξεκινήσετε τον διακομιστή.

Η εκτέλεση της εκκίνησης npm πρέπει να ξεκινήσει τον διακομιστή σας και η πλοήγηση στο // localhost / τελικό σημείο κατάστασης θα σας δώσει μια απάντηση 200OK.

Τέλεια, οπότε ο διακομιστής μας λειτουργεί.

Μια γρήγορη ματιά του κώδικα δείχνει ότι έχουμε δημιουργήσει 3 τελικά σημεία: ένα τελικό σημείο κατάστασης, ένα τελικό σημείο χαιρετισμού και ένα τελικό σημείο εγγραφής. Υπάρχει κάποια επικύρωση στο τελικό σημείο του μητρώου, το οποίο ρίχνει 400 (Κακή αίτηση) σε περίπτωση που λείπουν οι παραμέτρους μετά το σώμα. Η παραπάνω μέθοδος επικύρωσης είναι αρκετά αφελής, αλλά εξυπηρετεί το σκοπό της δοκιμής τελικού σημείου - γι 'αυτό θα ακολουθήσω.

Επαγγελματική συμβουλή: Μπορείτε πάντα να αντιστοιχίσετε χειρισμό σφαλμάτων σε ένα μεσαίο λογισμικό και να το χρησιμοποιήσετε δίπλα για να καλέσετε τον χειριστή σφαλμάτων

Ας γράψουμε μερικές ακόμη δοκιμές γύρω από το τελικό σημείο. Θα χρησιμοποιήσω το supertestμονάδα μέτρησης. Είναι πολύ παρόμοιο με το υπερδραστήριο: χρησιμοποιεί τα ίδια API και έχει παρόμοια σύνταξη. Λοιπόν, win-win.

Έχουμε εισαγάγει την προηγουμένως εξαχθείσα appενότητα και την περάσαμε στο supertest. Το Supertest δημιουργεί έναν διακομιστή μεσολάβησης, ο οποίος στη συνέχεια θα χτυπήσει όλες τις διευθύνσεις URL τελικού σημείου που αναφέρονται στη δοκιμή. Μπορείτε να χρησιμοποιήσετε τη deepEqualμέθοδο για να ελέγξετε ολόκληρο το αντικείμενο ή τη isμέθοδο για να ελέγξετε χειροκίνητα κάθε πεδίο.

Η εκτέλεση του τεστ νήματος θα αποφέρει τα εξής:

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

Γεια σας

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

yarn add nyc --save

The nyc command wraps nicely over your test command and will create a coverage folder (this should be in your gitignore) in your working directory.

Update your package.json as shown below:

{ "name": "ava-test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "node_modules/.bin/ava tests/**/*.test.js --verbose", "test:watch": "node_modules/.bin/ava --verbose --watch", "cover": "node_modules/.bin/nyc yarn test", }, ... other dependencies "nyc": { "reporter": [ "lcov", "text", "html" ] }}

The types of reporter you want can be configured in the nyc section of your package.json file.

Let’s run yarn cover:

Okay so we don’t have 100% coverage yet. Let’s fix that. First you’d want to go into the coverage folder of your working directory and see which part of your code hasn’t been covered.

Clearly we missed a spot. Let’s add our final test case in the tests/index.tests.js file, which will cover the entire app.js file.

test('Create a new user', async t => { let username = 'some-hase' const password = 'some-hase' const response = await request(app) .post('/register') .send({username, password});
t.is(response.status, 200); t.is(response.body.message, `new user created`);});

And now….

Presto.

Pro tip: If you want to add a threshold for test cases you can add a script in your package.json file.
"check-coverage": "node_modules/.bin/nyc check-coverage --lines 100 --functions 100 --branches 100 --statements 100"

Αυτή η εντολή μπορεί να εκτελεστεί ως μέρος των συστημάτων κατασκευής αγωγών travis / gitlab.

συμπέρασμα

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

PS: Ελπίζω να σας αρέσει το άρθρο, διορθώστε με αν κάνω λάθος πουθενά. Καλωσορίζετε πάντα μια συζήτηση.