Node.js koodi testimine Mocha ja Chai abil

Sissejuhatus

Üksusetestide kirjutamine on midagi, mida nii algajad kui ka kogenud insenerid lükkavad tavaliselt edasi arenduse hilisematesse etappidesse, kuid need on stabiilse ja jõulise tarkvaraarenduse võtmeks.

Põhiline eeldus testipõhine arendus (TDD) kirjutab oma teste juba enne kodeerimise alustamist. See on suurepärane eesmärk, mille poole püüelda, kuid see nõuab palju distsipliini ja planeerimist, kui proovite selle põhimõtteid järgida! Kogu selle protsessi palju lihtsamaks muutmiseks võite kasutada lihtsalt kasutatavaid ja võimsaid testimis- ja kinnitusraamistikke, näiteks Mocha ja Chai.

Selles artiklis tutvustame teile kõigepealt neid kahte teeki ja seejärel näitame teile, kuidas neid koos kasutada, et kiiresti luua loetavaid ja funktsionaalseid ühikuteste.

Chai

Chai on väideteek, mis pakub nii BDD (käitumispõhine areng) ja TDD (testipõhine arendus) koodi testimiseks mõeldud programmeerimisstiilid ja see on mõeldud sidumiseks testimise teegiga, mis võimaldab teil teste korraldada. See on väga sageli seotud Mochaga.

Sellel on kolm peamist API-d:

  • should
  • expect
  • assert

var.should.equal(var2)


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


assert.equal(var1, var2)

Kogu selles artiklis keskendume BDD stiilile, kasutades Chai's expect liides, kuigi teiste liideste/stiilide kasutamine oma intuitsiooni järgi on täiesti okei. The assert liides on kõige sarnasem levinud TDD kinnitusraamistik.

expect kasutab teie väidete kirjutamiseks väga loomuliku keele API-t, mis muudab teie testide kirjutamise lihtsamaks ja hiljem nende täiustamiseks. Selleks aheldatakse getterid väite loomiseks ja täitmiseks, mis muudab nõuete koodiks tõlkimise lihtsamaks:

let user = {name: 'Scott'};


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

Märge: Vaadake, kuidas saate väidet üsna palju loomulikus keeles lugeda ja aru saada, mis toimub? See on Chai-taolise väiteteegi kasutamise üks peamisi eeliseid!

Veel mõned näited nendest hankijatest on järgmised:

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

Päris paljusid neist getteritest saab aheldada ja kasutada selliste kinnitusmeetoditega nagu true, ok, existja empty keerukate väidete loomiseks vaid ühel real:

"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);

Märge: Saadaolevate meetodite täieliku loendi leiate siin.

Võib-olla soovite vaadata ka saadaolevate toodete loendit pluginad Chai jaoks. Need muudavad keerukamate funktsioonide testimise palju lihtsamaks.

Võtma chai-http Näiteks, mis on pistikprogramm, mis aitab testida serveri marsruute:

"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);
    });

Mochaga testjuhtumite korraldamine – kirjelda() ja it()

Mocha on Node'i testimisraamistik, mis annab teile paindlikkuse asünkroonse (või sünkroonse) koodi järjestikuseks käitamiseks. Kõik tabamata erandid kuvatakse kõrvuti katsejuhtumiga, kus see visati, mistõttu on lihtne tuvastada, mis täpselt ebaõnnestus ja miks.

Mocha on soovitatav installida ülemaailmselt:

$ npm install mocha -g

Soovite, et see oleks ülemaailmne installimine alates mocha käsku kasutatakse projekti testide käivitamiseks teie kohalikus kataloogis.

Mida see koodilõik teeb?

it() peaks tagastama X. it() määratleb testjuhtumid ja iga Mocha käivitab it() ühikutestina. Korraldada mitu ühikut teste saame describe() ühine funktsionaalsus ja seega struktureerida Mocha teste.

Seda saab ilmselt kõige paremini kirjeldada konkreetse näitega:

"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);
        });
    });
});

aasta describe() meetodit, määratlesime a testi nimiEhk #abs(). Saate katseid individuaalselt käivitada ka nende nimede järgi – seda käsitletakse hiljem.

Märge: Mocha testidega pole teil seda vaja require() mõni Mocha meetod. Neid meetodeid pakutakse globaalselt, kui neid käivitatakse koos mocha käsk

Nende testide käivitamiseks salvestage fail ja kasutage mocha käsk:

$ mocha .

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


  1 passing (9ms)

Väljund on läbiviidud testide ja nende tulemuste jaotus. Pange tähele, kuidas pesastatud describe() kõned kanduvad üle tulemuste väljundisse. Kasulik on panna kõik antud meetodi või funktsiooni testid kokku.

Need meetodid on Mocha testimise raamistiku aluseks. Kasutage neid testide koostamiseks ja korraldamiseks nii, nagu soovite. Järgmises jaotises näeme selle kohta ühte näidet.

Mocha ja Chai testide kirjutamine

Soovitatav viis oma projekti raames testide korraldamiseks on panna need kõik omaette /test kataloog. Vaikimisi kontrollib Mocha ühikutestide olemasolu gloobuste abil ./test/*.js ja ./test/*.coffee. Sealt laadib ja käivitab see kõik failid, mis kutsuvad üles describe() meetod.

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!

Testfailide järelliide on tavaline .test.js Mocha teste sisaldavate lähtefailide jaoks:

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

util.js aasta test kataloog ei sisaldaks ühikuteste, vaid testimisel abistavaid utiliite.

märkused: Võite kasutada mis tahes struktuuri, mis teile sobib, ühikutestid võetakse automaatselt üles.

Mis puutub testide kirjutamisse, siis aitab neid korraldada kasutades describe() meetodid. Saate neid korraldada funktsiooni, funktsiooni, faili või mõne muu suvalise taseme järgi. Näiteks funktsiooni tasemel toimimise kirjeldamiseks korraldatud testfail näeb välja järgmine:

"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);
        });
    });
});

Testide käivitamine annaks teile väljundi:

$ 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)

Veelgi enam laiendades võib teil olla ühes failis isegi mitme meetodi testid. Sel juhul on meetodid rühmitatud Math objekt:

"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);
        });
    });
});

Mille tulemuseks on:

$ 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 konksud – enne(), pärast(), enne iga() ja afterIga()

Tõsi, enamik ühikuteste pole nii lihtsad. Tõenäoliselt vajate testide tegemiseks sageli muid ressursse, näiteks andmebaasi või mõnda muud välist ressurssi (või nende näidis-/lõiustust). Selle seadistamiseks saame kasutada ühte või mitut järgmistest Moka konks meetodid:

  • before(): jookseb enne kõiki antud ploki teste
  • beforeEach(): jookseb enne iga testi antud plokis
  • after(): Käitab pärast kõiki antud ploki teste
  • afterEach(): jookseb pärast iga testi antud plokis

Need konksud on ideaalne koht testide jaoks vajalike seadistus- ja rebimistööde tegemiseks. Üks levinumaid kasutusjuhtumeid on enne testide käivitamist andmebaasiga ühenduse loomine.

"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) {
            
        });
    });
});

enne mistahes testidest käivitatakse, saadetakse funktsioon meie before() käivitatakse meetod (ja ainult üks kord kogu testide jooksul), mis loob ühenduse andmebaasiga. Kui see on tehtud, käivitatakse meie testkomplektid.

Kuna me ei soovi, et ühe testkomplekti andmed mõjutaksid meie teisi teste, peame pärast iga komplekti käitamist andmed oma andmebaasist kustutama. See on mis afterEach() on jaoks. Kasutame seda konksu kõigi andmebaasiandmete pärast kustutamiseks iga testjuhtum käivitatakse, nii et saame järgmiste testide jaoks alustada puhtalt lehelt.

Mocha testide läbiviimine

Enamikul juhtudel on see osa üsna lihtne. Eeldades, et olete juba Mocha installinud ja projektikataloogi navigeerinud, peavad enamik projekte lihtsalt kasutama mocha argumentideta käsk nende testide käivitamiseks:

$ 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)

See erineb veidi meie eelmistest näidetest, kuna me ei pidanud Mochale ütlema, kus meie testid asuvad. Selles näites on testkood eeldatavas asukohas /test.

Siiski on mõned kasulikud valikud, mida võiksite testide käitamisel kasutada. Näiteks kui mõni teie test ebaõnnestub, ei taha te tõenäoliselt iga muudatuse tegemisel kogu komplekti käivitada. Mõne projekti puhul võib täieliku testkomplekti valmimiseks kuluda mõni minut. See on palju raisatud aega, kui teil on tõesti vaja teha ainult üks test.

Sellistel juhtudel peaksite seda tegema ütle Mochale, milliseid teste teha. Seda saab teha kasutades -g or -f võimalusi.

Individuaalsete testide tegemiseks võite esitada -g liputage ja lisage ühine muster nende testide vahele, mida soovite käivitada. Näiteks kui soovite käivitada #sqrt() testid:

$ 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)

Pange tähele, et #abs() teste sellesse jooksu ei kaasatud. Kui plaanite vastavalt oma testide nimedele, saab seda valikut kasutada ainult konkreetsete testide osade käitamiseks.

Need pole aga ainsad kasulikud valikud. Siin on veel mõned Mocha võimalused, mida võiksite kontrollida:

  • --invert: Inverteerib -g ja -f tikud
  • --recursive: kaasake alamkataloogid
  • --harmony: lubage Node'is kõik harmooniafunktsioonid

märkused: valikute täielikku loendit saate vaadata kasutades mocha -h käsk või sisse Sellel leheküljel.

Kust rohkem teada saada? Sellel teemal on palju rohkem, kui suudame lühikese artikliga hõlmata, nii et kui soovite rohkem teada saada, siis soovitame tutvuda ametliku Mocha ja Chai dokumentatsioon.

Järeldus

Pidage meeles, et nii Mochat kui ka Chaid saab kasutada peaaegu igat tüüpi Node projekti testimiseks, olgu selleks siis raamatukogu, käsurea tööriist või isegi veebisait. Kasutades teile saadaolevaid erinevaid valikuid ja pistikprogramme, peaksite oma testimisvajadusi üsna lihtsalt rahuldama. Kõik need teegid on teie koodi kinnitamiseks väga kasulikud ja neid tuleks kasutada peaaegu kõigis teie sõlmeprojektides.

Loodetavasti on see Mocha ja Chai jaoks kasulik sissejuhatus. Siin on palju rohkem õppida kui see, mida ma siin esitasin, nii et lisateabe saamiseks vaadake kindlasti dokumente.

Ajatempel:

Veel alates Stackabus