Hvordan du kan teste dine Node.js-applikationer med Ava.js

Hvorfor vil du alligevel skrive testcases til dine ansøgninger? Nå, det er et spørgsmål, som en række udviklere forsøger at undvige, udelukkende fordi det tager kræfter og tid, og fordi manuel test er så meget mere tilfredsstillende. Klik på ... klik på ... udfyld en formular ... Klik på ... Presto. Min app fungerer, mine API'er er gode, alt er hunky dory.

Spol frem til næsten 30 pullanmodninger om dagen, der bliver flettet ind i din mastergren. Hvad synes du nu om at teste 30 funktioner manuelt eller omlægge en blok kode og ubevidst bryde en andens kode?

På dette tidspunkt vil du normalt sige, "Jeg ville ønske, at jeg havde skrevet et par testsager til at begynde med." Så tag lidt inspiration fra Facebook: de delte en ret cool artikel her, der forklarede, hvordan teamet udviklede React 16 med testdrevet udvikling.

Node applikationer i sig selv er ret nemme at bygge. Der er meget fællesskabsstøtte involveret, og du får normalt det, du har brug for, ved at spørge rundt. Node-apps kan være en god proxyserver til et antal API-servere, hvilket gør deres slutpunkttest mere afgørende.

I denne artikel har jeg dækket, hvordan man opsætter og skriver grundlæggende enhedstestsager med dækningsrapporter for Node.js applikationer .Så lad os hoppe ind.

Hej Ava

Ava er en JavaScript-testløber. Det bruger async I / O-karakteren af ​​Node og kører samtidige tests, hvorved dine testtider reduceres kraftigt.

Lad os komme igang

Opret en package.jsonfil i din arbejdsmappe, og tilføj følgende pakker:

yarn add ava babel-register

Opret en test mappe. Det er nyttigt at holde dine tests ét sted. Du kan også opbevare testmoduler / controllere der.

Din opdaterede package.jsonskal nu se sådan ud:

{ "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" ] }}

Den babel-registertranspiles ES6 koden ved runtime i tilfælde nogle maskiner kører på en gammel Knude version, som ikke understøtter ES6. Den verboseflaget vil give os nogle pæne udgang afhængigt af, om vores test mislykkes eller passere. Dette flag er ret nyttigt, når du debugger dine tests, men hvis du skriver hundreder af testsager, vil du måske slå det fra.

I din tests/index.test.jskan du tilføje din første testsag:

Den praktiske ting ved Ava er, at det giver dig mulighed for at køre async-tests via async wait-funktioner. Syntaksen er også ret ligetil. Planmetoden giver os mulighed for eksplicit at nævne antallet af påstande, vi gerne vil have pr. Test.

At køre yarn testfra din konsol giver dig følgende output:

Hvis en af ​​vores tests mislykkes, får vi:

Det er skønheden i verbosemode. Det giver dig en ren fejlstakke og intet af stack-spor-junk. I tilfælde af at du løber ind i en runtime-fejl, vil du også se en smuk syntaksfremhævning.

Du kan virkelig udnytte Ava API og bruge dets kraftfulde påstandsværktøj til at skrive fleksible testsager.

Opsætning af din Node-server

Indtil nu har vi kun talt om en grundlæggende opsætning til skrivning af test - og lad os være ærlige, det er ret ligetil. Så i dette afsnit forklarer jeg, hvordan en simpel Node-server kan udskilles, og dens slutpunkter testes med Ava.

yarn add express body-parser 

Opret et app.jsog tilføj følgende uddrag i din arbejdsmappe :

Årsagen til, at jeg har eksporteret app-modulet, er, så det kan bruges sammen med den mock API-server, som Ava skal bruge til at køre dine tests.

Opret en ny fil, server.jsog importer app-modulet for at starte serveren.

At køre npm start skal starte din server, og at navigere til // localhost / status slutpunktet skal give dig et svar på 200 OK.

Fantastisk, så vores server fungerer.

Et hurtigt blik på koden viser, at vi har oprettet 3 slutpunkter: et statusendepunkt, et hilsenendepunkt og et registerendepunkt. Der er en vis validering på registerets slutpunkt, som kaster en 400 (dårlig anmodning) i tilfælde af manglende karrosseripost. Ovenstående valideringsmetode er temmelig naiv, men den tjener vores formål med slutpunkttest - så jeg holder fast ved det.

Pro tip: Du kan altid tildele fejlhåndtering til en middleware og bruge næste til at påkalde fejlhåndteringen.

Lad os skrive nogle flere tests omkring slutpunktet. Jeg bruger supertestenmodul. Det ligner meget superagent: det bruger de samme API'er og har en lignende syntaks. Så vind-vind.

Vi har importeret det tidligere eksporterede appmodul og overført det til supertest. Supertest opretter en proxyserver, som derefter rammer alle de slutpunkts-URL'er, der er nævnt i testen. Du kan bruge deepEqualmetoden til at teste hele objektet eller ismetoden til manuelt at teste hvert felt.

At køre garnetesten giver følgende:

Store. Vi har skrevet fire prøver, og de består alle som forventet. Men hvad med kodedækning?

Hej nyc

Til oprettelse af disse dejlige dækningsrapporter bruger vi nyc, som er Istanbul.js 'kommandolinjegrænseflade. Det er meget nemt at bruge og har mange konfigurerbare muligheder. Af hensyn til enkelheden bruger vi en meget enkel konfiguration.

yarn add nyc --save

Den nyc Kommandoen ombrydes pænt over din test kommando og vil skabe en dækning mappe (dette bør være i din gitignore) i din arbejdsmappe.

Opdater din package.jsonsom vist nedenfor:

{ "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" ] }}

De typer reporter, du ønsker, kan konfigureres i nyc-sektionen i din package.jsonfil.

Lad os køre garndæksel:

Okay så vi har ikke 100% dækning endnu. Lad os ordne det. Først vil du gå ind i dækningsmappen i din arbejdsmappe og se, hvilken del af din kode der ikke er dækket.

Vi savnede klart et sted. Lad os tilføje vores sidste testcase i tests/index.tests.jsfilen, som dækker hele app.jsfilen.

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

Og nu….

Presto.

Pro tip: Hvis du vil tilføje en tærskel for testsager, kan du tilføje et script i din package.json-fil.
"check-coverage": "node_modules/.bin/nyc check-coverage --lines 100 --functions 100 --branches 100 --statements 100"

Denne kommando kan køres som en del af dine travis / gitlab pipeline build-systemer.

Konklusion

Vi har dækket en grundlæggende opsætning med Ava til enhedstest tilfælde af dine Node API'er. Dokumentationen er virkelig omfattende og kan henvises til i tvivlstilfælde.

PS: Håber du kan lide artiklen, ret mig, hvis jeg tager fejl overalt. Altid velkommen en diskussion.