Δοκιμή κώδικα Node.js με Mocha και Chai

Εισαγωγή

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

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

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

Chai

Το Chai είναι μια βιβλιοθήκη ισχυρισμών που παρέχει και τα δύο BDD (ανάπτυξη με γνώμονα τη συμπεριφορά) και TDD (ανάπτυξη βάσει δοκιμής) στυλ προγραμματισμού για δοκιμή κώδικα και προορίζεται για σύζευξη με μια βιβλιοθήκη δοκιμών που σας επιτρέπει να οργανώνετε δοκιμές. Συνδυάζεται πολύ συχνά με μόκα.

Διαθέτει τρία κύρια API:

  • should
  • expect
  • assert

var.should.equal(var2)


expect.var.to.be.equal(var2)


assert.equal(var1, var2)

Σε όλο αυτό το άρθρο, θα επικεντρωθούμε στο στυλ BDD χρησιμοποιώντας το Chai's expect διεπαφή, αν και η χρήση άλλων διεπαφών/στυλ σύμφωνα με τη δική σας διαίσθηση είναι απολύτως εντάξει. ο assert Η διεπαφή είναι το πιο όμοιο κοινό πλαίσιο διαβεβαίωσης TDD.

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

let user = {name: 'Scott'};


expect(user).to.have.property('name');

Σημείωση: Δείτε πώς μπορείτε να διαβάσετε τον ισχυρισμό σε μια φυσική γλώσσα και να καταλάβετε τι συμβαίνει; Αυτό είναι ένα από τα κύρια πλεονεκτήματα της χρήσης μιας βιβλιοθήκης ισχυρισμών όπως το Chai!

Μερικά ακόμη παραδείγματα αυτών των συλλεκτών είναι:

  • to
  • be
  • is
  • and
  • has
  • have

Αρκετοί από αυτούς τους συλλέκτες μπορούν να συνδεθούν μεταξύ τους και να χρησιμοποιηθούν με μεθόδους διεκδίκησης όπως true, ok, exist, να empty για να δημιουργήσετε μερικούς πολύπλοκους ισχυρισμούς σε μία μόνο γραμμή:

"use strict";

const expect = require('chai').expect;


expect({}).to.exist;
expect(26).to.equal(26);
expect(false).to.be.false;
expect('hello').to.be.string;


expect([1, 2, 3]).to.not.be.empty;


expect([1, 2, 3]).to.have.length.of.at.least(3);

Σημείωση: Μπορείτε να βρείτε μια πλήρη λίστα με τις διαθέσιμες μεθόδους εδώ.

Μπορεί επίσης να θέλετε να δείτε τη λίστα των διαθέσιμων Plugins για τον Τσάι. Αυτά καθιστούν πολύ πιο εύκολο τον έλεγχο πιο περίπλοκων χαρακτηριστικών.

Πάρτε chai-http για παράδειγμα, το οποίο είναι ένα πρόσθετο που σας βοηθά να δοκιμάσετε διαδρομές διακομιστή:

"use strict";

const chai = require('chai');
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

chai.request(app)
    .put('/api/auth')
    .send({username: '[email protected]', password: 'abc123'})
    .end(function(err, res) {
        expect(err).to.be.null;
        expect(res).to.have.status(200);
    });

Οργάνωση δοκιμαστικών περιπτώσεων με μόκα – describe() and it()

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

Συνιστάται να εγκαταστήσετε το Mocha παγκοσμίως:

$ npm install mocha -g

Θα θέλετε να είναι μια παγκόσμια εγκατάσταση από το mocha Η εντολή χρησιμοποιείται για την εκτέλεση των δοκιμών για το έργο στον τοπικό σας κατάλογο.

Τι κάνει αυτό το κομμάτι κώδικα;

it() πρέπει να επιστρέψει το X. it() ορίζει τις δοκιμαστικές περιπτώσεις και το Mocha θα εκτελέσει το καθένα it() ως δοκιμή μονάδας. Για να οργανώσουμε πολλαπλές δοκιμές μονάδων, μπορούμε describe() μια κοινή λειτουργικότητα, και επομένως δομή των δοκιμών Mocha.

Αυτό ίσως περιγράφεται καλύτερα με ένα συγκεκριμένο παράδειγμα:

"use strict";
const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });
    });
});

Στο describe() μέθοδο, ορίσαμε α όνομα δοκιμής, Που ονομάζεται #abs(). Μπορείτε να εκτελέσετε δοκιμές μεμονωμένα και με το όνομά τους – αυτό θα καλυφθεί αργότερα.

Σημείωση: Με τις δοκιμές Mocha, δεν χρειάζεται require() οποιαδήποτε από τις μεθόδους Mocha. Αυτές οι μέθοδοι παρέχονται παγκοσμίως όταν εκτελούνται με το mocha εντολή.

Για να εκτελέσετε αυτές τις δοκιμές, αποθηκεύστε το αρχείο σας και χρησιμοποιήστε το mocha εντολή:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given number 


  1 passing (9ms)

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

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

Τεστ γραφής με μόκα και τσάι

Ο προτεινόμενος τρόπος για να οργανώσετε τις δοκιμές σας στο πλαίσιο του έργου σας είναι να τις τοποθετήσετε όλες στις δικές τους /test Ευρετήριο. Από προεπιλογή, το Mocha ελέγχει για δοκιμές μονάδας χρησιμοποιώντας τα globs ./test/*.js και ./test/*.coffee. Από εκεί, θα φορτώσει και θα εκτελέσει οποιοδήποτε αρχείο καλεί το describe() μέθοδος.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Είναι σύνηθες να προστίθεται επίθημα στα αρχεία δοκιμής με .test.js για τα αρχεία προέλευσης που περιέχουν δοκιμές Mocha:

├── package.json
├── lib
│   ├── db.js
│   ├── models.js
│   └── util.js
└── test
    ├── db.test.js
    ├── models.test.js
    ├── util.test.js
    └── util.js

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

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

Όταν πρόκειται να γράψετε πραγματικά τα τεστ, βοηθάει να τα οργανώσετε χρησιμοποιώντας το describe() μεθόδους. Μπορείτε να τα οργανώσετε ανά χαρακτηριστικό, λειτουργία, αρχείο ή οποιοδήποτε άλλο αυθαίρετο επίπεδο. Για παράδειγμα, ένα δοκιμαστικό αρχείο που οργανώνεται για να περιγράφει τις λειτουργίες σε επίπεδο συνάρτησης μοιάζει με:

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });
});

Η εκτέλεση των δοκιμών θα σας δώσει το αποτέλεσμα:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 


  3 passing (11ms)

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

"use strict";

const expect = require('chai').expect;

describe('Math', function() {
    describe('#abs()', function() {
        it('should return positive value of given negative number', function() {
            expect(Math.abs(-5)).to.be.equal(5);
        });

        it('should return positive value of given positive number', function() {
            expect(Math.abs(3)).to.be.equal(3);
        });

        it('should return 0 given 0', function() {
            expect(Math.abs(0)).to.be.equal(0);
        });
    });

    describe('#sqrt()', function() {
        it('should return the square root of a given positive number', function() {
            expect(Math.sqrt(25)).to.be.equal(5);
        });

        it('should return NaN for a given negative number', function() {
            expect(Math.sqrt(-9)).to.be.NaN;
        });

        it('should return 0 given 0', function() {
            expect(Math.sqrt(0)).to.be.equal(0);
        });
    });
});

Το οποίο έχει ως αποτέλεσμα:

$ mocha .

  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

Mocha Hooks – πριν(), after(), beforeEach() και afterEach()

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

  • before(): Εκτελείται πριν από όλες τις δοκιμές στο συγκεκριμένο μπλοκ
  • beforeEach(): Εκτελείται πριν από κάθε δοκιμή στο συγκεκριμένο μπλοκ
  • after(): Εκτελείται μετά από όλες τις δοκιμές στο συγκεκριμένο μπλοκ
  • afterEach(): Εκτελείται μετά από κάθε δοκιμή στο συγκεκριμένο μπλοκ

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

"use strict";

const expect = require('chai').expect;
let User = require('../models').User;

describe('Users', function() {

    let database = null;

    before(function(done) {
        
    });

    afterEach(function(done) {
        
    });

    describe('#save()', function() {
        it('should save User data to database', function(done) {
            
        });
    });

    describe('#load()', function() {
        it('should load User data from database', function(done) {
            
        });
    });
});

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

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

Εκτέλεση δοκιμών μόκας

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

$ mocha


  Math
    #abs()
      ✓ should return positive value of given negative number 
      ✓ should return positive value of given positive number 
      ✓ should return 0 given 0 
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  6 passing (10ms)

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

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

Για περιπτώσεις όπως αυτή, θα πρέπει πείτε στη Mocha ποιες δοκιμές να εκτελέσετε. Αυτό μπορεί να γίνει χρησιμοποιώντας το -g or -f επιλογές.

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

$ mocha -g sqrt

  Math
    #sqrt()
      ✓ should return the square root of a given positive number 
      ✓ should return NaN for a given negative number 
      ✓ should return 0 given 0 


  3 passing (10ms)

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

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

  • --invert: Αντεστραμμένα -g και -f σπίρτα
  • --recursive: Συμπεριλάβετε υποκαταλόγους
  • --harmony: Ενεργοποιήστε όλες τις λειτουργίες αρμονίας στο Node

Note: Μπορείτε να δείτε την πλήρη λίστα επιλογών χρησιμοποιώντας το mocha -h εντολή ή ενεργοποίηση αυτή η σελίδα.

Πού να μάθετε περισσότερα; Υπάρχουν πολύ περισσότερα σε αυτό το θέμα από όσα μπορούμε να καλύψουμε σε ένα σύντομο άρθρο, οπότε αν θέλετε να μάθετε περισσότερα, θα συνιστούσαμε να ελέγξετε την επίσημη Καφές της μέκας και Chai απόδειξη με έγγραφα.

Συμπέρασμα

Λάβετε υπόψη ότι τόσο το Mocha όσο και το Chai μπορούν να χρησιμοποιηθούν για δοκιμή σχεδόν οποιουδήποτε τύπου έργου Node, είτε πρόκειται για βιβλιοθήκη, εργαλείο γραμμής εντολών ή ακόμα και ιστότοπο. Χρησιμοποιώντας τις διάφορες επιλογές και πρόσθετα που έχετε στη διάθεσή σας, θα πρέπει να είστε σε θέση να ικανοποιήσετε τις ανάγκες δοκιμών σας πολύ εύκολα. Κάθε μία από αυτές τις βιβλιοθήκες είναι πολύ χρήσιμη για την επικύρωση του κώδικά σας και θα πρέπει να χρησιμοποιείται σχεδόν σε όλα τα έργα Node σας.

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

Σφραγίδα ώρας:

Περισσότερα από Stackabuse