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. Theassert
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
, exist
ja 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ä lohkossabeforeEach()
: Suoritetaan ennen jokaista testiä tietyssä lohkossaafter()
: Suorittaa kaikkien testien jälkeen tietyssä lohkossaafterEach()
: 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.