Node.js-koodin testaus Mochan ja Chain kanssa

esittely

Yksikkötestien kirjoittaminen on jotain niin aloittelijoille kuin kokeneille insinööreillekin, jotka tyypillisesti lykkäävät myöhempiä kehitysvaiheita varten, mutta ne ovat kuitenkin avainasemassa vakaassa ja kestävässä ohjelmistokehityksessä.

Perusajatus testilähtöinen kehitys (TDD) kirjoittaa testejäsi jo ennen kuin aloitat koodauksen. Se on hieno tavoite, johon kannattaa pyrkiä, mutta vaatii paljon kurinalaisuutta ja suunnittelua, kun yrität noudattaa sen periaatteita! Koko prosessin helpottamiseksi voit turvautua helppokäyttöisiin ja tehokkaisiin testaus- ja väitekehikkoihin, kuten mokkakahvi ja Chai.

Tässä artikkelissa aloitamme esittelemällä sinulle nämä kaksi kirjastoa ja sitten näytämme, kuinka voit käyttää niitä yhdessä luomaan nopeasti luettavia ja toimivia yksikkötestejä.

Chai

Chai on väitekirjasto, joka tarjoaa sekä BDD (käyttäytymiseen perustuva kehitys) ja TDD (testilähtöinen kehitys) ohjelmointityylejä koodin testaamista varten, ja se on tarkoitettu yhdistettäväksi testauskirjaston kanssa, jonka avulla voit järjestää testejä. Se yhdistetään hyvin yleisesti Mochan kanssa.

Siinä on kolme pääsovellusliittymää:

  • should
  • expect
  • assert

var.should.equal(var2)


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


assert.equal(var1, var2)

Tässä artikkelissa keskitymme BDD-tyyliin Chai'sin avulla expect käyttöliittymä, vaikka muiden käyttöliittymien/tyylien käyttäminen oman intuitiosi mukaan on täysin ok. The assert käyttöliittymä on kaikkein samankaltaisin yleinen TDD-väitekehys.

expect käyttää erittäin luonnollisen kielen sovellusliittymää väittämiesi kirjoittamiseen, mikä tekee testeistäsi helpompia kirjoittaa ja parantaa niitä myöhemmin. Tämä tehdään ketjuttamalla getterit yhteen väitteen luomiseksi ja suorittamiseksi, mikä helpottaa vaatimusten kääntämistä koodiksi:

let user = {name: 'Scott'};


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

Huomautus: Katso, kuinka voit lukea väitteen luonnollisella kielellä ja ymmärtää, mitä tapahtuu? Se on yksi Chain kaltaisen väitekirjaston käytön tärkeimmistä eduista!

Muutamia lisää esimerkkejä näistä gettereista ovat:

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

Monet näistä gettereistä voidaan ketjuttaa yhteen ja käyttää väittämismenetelmien, kuten true, ok, existja empty luodaksesi joitain monimutkaisia ​​väitteitä yhdellä rivillä:

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

Huomautus: Täydellinen luettelo käytettävissä olevista menetelmistä löytyy tätä.

Haluat ehkä myös tarkistaa saatavilla olevien tuotteiden luettelon liitännäiset Chai puolesta. Nämä helpottavat monimutkaisempien ominaisuuksien testaamista.

ottaa chai-http esimerkiksi, joka on laajennus, joka auttaa testaamaan palvelinreittejä:

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

Testitapausten järjestäminen mokkan kanssa – description() and it()

Mocha on Noden testauskehys, joka antaa sinulle joustavuuden ajaa asynkronista (tai synkronista) koodia sarjassa. Kaikki jääneet poikkeukset näkyvät sen testitapauksen vieressä, jossa se heitettiin, jolloin on helppo tunnistaa tarkalleen, mikä epäonnistui ja miksi.

On suositeltavaa asentaa Mocha maailmanlaajuisesti:

$ npm install mocha -g

Haluat sen olevan globaali asennus siitä lähtien mocha -komentoa käytetään projektin testien suorittamiseen paikallisessa hakemistossasi.

Mitä tämä koodinpala tekee?

it() pitäisi palauttaa X. it() määrittää testitapaukset, ja Mocha suorittaa jokaisen it() yksikkötestinä. Voimme järjestää useita yksikkötestejä describe() yhteinen toiminnallisuus, ja siten rakenne Mocha-testit.

Tätä kuvaa ehkä parhaiten konkreettinen esimerkki:

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

In describe() menetelmällä määritimme a testin nimi, Kutsutaan #abs(). Voit suorittaa testejä myös yksilöllisesti heidän nimensä perusteella – tästä kerrotaan myöhemmin.

Huomautus: Mokka-testeillä sinun ei tarvitse require() jokin Mocha-menetelmistä. Nämä menetelmät tarjotaan maailmanlaajuisesti, kun ne suoritetaan mocha komento.

Suorita nämä testit tallentamalla tiedostosi ja käyttämällä mocha komento:

$ mocha .

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


  1 passing (9ms)

Tulos on erittely suoritetuista testeistä ja niiden tuloksista. Huomaa, kuinka sisäkkäinen describe() kutsut siirtyvät tulostulokseen. On hyödyllistä yhdistää kaikki tietyn menetelmän tai ominaisuuden testit.

Nämä menetelmät ovat Mocha-testauskehyksen perusta. Käytä niitä kokeiden laatimiseen ja järjestämiseen haluamallasi tavalla. Näemme yhden esimerkin tästä seuraavassa osiossa.

Testien kirjoittaminen mokkan ja chain kanssa

Suositeltu tapa järjestää testit projektissasi on laittaa ne kaikki omaan muotoonsa /test hakemistosta. Oletuksena Mocha tarkistaa yksikkötestit käyttämällä globeja ./test/*.js ja ./test/*.coffee. Sieltä se lataa ja suorittaa minkä tahansa tiedoston, joka kutsuu describe() menetelmällä.

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

Testitiedostojen pääte on tavallista .test.js Mocha-testejä sisältäville lähdetiedostoille:

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

util.js vuonna test hakemistossa ei olisi yksikkötestejä, vain aputoimintoja testauksen avuksi.

Huomautuksia: Voit käyttää mitä tahansa sinulle järkevää rakennetta, yksikkötestit poimitaan automaattisesti.

Kun kyse on kokeiden kirjoittamisesta, se auttaa järjestämään ne käyttämällä describe() menetelmiä. Voit järjestää ne ominaisuuden, toiminnon, tiedoston tai minkä tahansa muun mielivaltaisen tason mukaan. Esimerkiksi testitiedosto, joka on järjestetty kuvaamaan toimintaa funktiotasolla, näyttää tältä:

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

Testien suorittaminen antaisi sitten tuloksen:

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

Laajenna entisestään, voit jopa sisältää useita menetelmiä koskevia testejä yhdessä tiedostossa. Tässä tapauksessa menetelmät ryhmitellään Math esine:

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

Mikä johtaa:

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

Mokkakoukut – ennen(), after(), ennen jokaista() ja afterEach()

Tosin useimmat yksikkötestit eivät ole näin yksinkertaisia. Usein tarvitset todennäköisesti muita resursseja testien suorittamiseen, kuten tietokannan tai jonkin muun ulkoisen resurssin (tai niiden pilan/osan). Tämän määrittämiseksi voimme käyttää yhtä tai useampaa seuraavista Mokka koukku menetelmät:

  • before(): Suoritetaan ennen kaikkia testejä tietyssä lohkossa
  • beforeEach(): Suoritetaan ennen jokaista testiä tietyssä lohkossa
  • after(): Suorittaa kaikkien testien jälkeen tietyssä lohkossa
  • afterEach(): Suoritetaan jokaisen testin jälkeen tietyssä lohkossa

Nämä koukut ovat täydellinen paikka suorittaa testejäsi varten tarvittavat asennus- ja purkutyöt. Yksi yleisimmistä käyttötapauksista on muodostaa yhteys tietokantaan ennen testien suorittamista:

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

Ennen Kaikki testeistä suoritetaan, funktio lähetetään meille before() menetelmä ajetaan (ja suoritetaan vain kerran testien aikana), mikä muodostaa yhteyden tietokantaan. Kun tämä on tehty, testisarjamme suoritetaan.

Koska emme halua yhden testipaketin tietojen vaikuttavan muihin testeihimme, meidän on tyhjennettävä tiedot tietokannastamme jokaisen sarjan suorittamisen jälkeen. Tämä on mitä afterEach() on varten. Käytämme tätä koukkua tyhjentämään kaikki tietokantatiedot sen jälkeen kukin testitapaus suoritetaan, jotta voimme aloittaa puhtaalta pöydältä seuraavia testejä varten.

Mokka-testien suorittaminen

Useimmissa tapauksissa tämä osa on melko yksinkertainen. Olettaen, että olet jo asentanut Mochan ja siirtynyt projektihakemistoon, useimpien projektien on vain käytettävä mocha komento ilman argumentteja testien suorittamiseksi:

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

Tämä eroaa hieman aiemmista esimerkeistämme, koska meidän ei tarvinnut kertoa Mochalle, missä testimme sijaitsevat. Tässä esimerkissä testikoodi on odotetussa paikassa /test.

On kuitenkin joitain hyödyllisiä vaihtoehtoja, joita voit halutessasi käyttää testejä suoritettaessa. Jos esimerkiksi jotkut testeistäsi epäonnistuvat, et todennäköisesti halua suorittaa koko sarjaa joka kerta, kun teet muutoksen. Joissakin projekteissa koko testipaketin valmistuminen voi kestää muutaman minuutin. Se on paljon hukattua aikaa, jos sinun tarvitsee todella suorittaa vain yksi testi.

Tällaisissa tapauksissa sinun pitäisi kerro Mochalle, mitkä testit suoritetaan. Tämä voidaan tehdä käyttämällä -g or -f vaihtoehtoja.

Voit suorittaa yksittäisiä testejä toimittamalla -g merkitse ja lisää yhteinen kuvio testien väliin, jotka haluat suorittaa. Jos esimerkiksi haluat suorittaa #sqrt() testit:

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

Huomaa, että #abs() testit eivät sisälly tähän ajoon. Jos suunnittelet vastaavasti testinimien kanssa, tätä vaihtoehtoa voidaan käyttää vain tiettyjen testien osien suorittamiseen.

Nämä eivät kuitenkaan ole ainoita hyödyllisiä vaihtoehtoja. Tässä on muutamia muita Mocha-vaihtoehtoja, jotka kannattaa tarkistaa:

  • --invert: Kääntää -g ja -f tulitikut
  • --recursive: Sisällytä alihakemistot
  • --harmony: Ota kaikki harmoniaominaisuudet käyttöön Nodessa

Huomautuksia: Voit tarkistaa täydellisen luettelon vaihtoehdoista käyttämällä mocha -h komento tai päällä Tämä sivu.

Mistä oppia lisää? Tästä aiheesta on paljon enemmän kuin voimme käsitellä lyhyessä artikkelissa, joten jos haluat oppia lisää, suosittelemme tutustumaan viralliseen mokkakahvi ja Chai dokumentointi.

Yhteenveto

Muista, että sekä Mochaa että Chaita voidaan käyttää melkein minkä tahansa Node-projektin testaamiseen, olipa kyseessä kirjasto, komentorivityökalu tai jopa verkkosivusto. Hyödyntämällä erilaisia ​​vaihtoehtoja ja laajennuksia, sinun pitäisi pystyä tyydyttämään testaustarpeesi melko helposti. Jokainen näistä kirjastoista on erittäin hyödyllinen koodisi validoinnissa, ja niitä tulisi käyttää lähes kaikissa Node-projekteissasi.

Toivottavasti tämä on ollut hyödyllinen johdatus Mochaan ja Chaihin. Opittavaa on paljon enemmän kuin mitä olen tässä esittänyt, joten muista tutustua asiakirjoihin saadaksesi lisätietoja.

Aikaleima:

Lisää aiheesta Stackabus