Как можете да тествате вашите Node.js приложения с Ava.js

Защо бихте искали да пишете тестови случаи за вашите приложения, така или иначе? Е, това е въпрос, който редица разработчици се опитват да избегнат, само защото отнема усилия и време и защото ръчното тестване е много по-удовлетворяващо. Щракнете ... щракнете ... попълнете формуляр ... Щракнете ... Presto. Приложението ми работи, приложните ми програмни интерфейси (API) са добри, всичко е нахално.

Превъртайте напред до почти 30 заявки за изтегляне на ден, които се обединяват във вашия главен клон. Сега как се чувствате при ръчно тестване на 30 функции или рефакторинг на блок код и несъзнателно чупене на чужд код?

В този момент обикновено казвате: „Бих искал да напиша няколко тестови случая, за да започна.“ Затова вземете малко вдъхновение от Facebook: те споделиха тук доста страхотна статия, обясняваща как екипът е разработил React 16 с тестова разработка.

Приложните приложения сами по себе си са доста лесни за изграждане. Включена е много подкрепа от общността и обикновено ще получите това, от което се нуждаете, като попитате наоколо. Приложните приложения могат да бъдат чудесен прокси сървър за редица API сървъри, като по този начин тестването на крайните им точки е по-важно.

В тази статия съм включил как да настроите и пишат основни случаи единица тест с доклади покритие за Node.js приложения .Така че нека да скочим.

Здравей Ава

Ava е изпълнител на тестове за JavaScript. Той използва асинхронната I / O природа на Node и изпълнява едновременни тестове, като по този начин значително намалява времето за тестване.

Да започваме

Във вашата работна директория създайте package.jsonфайл и добавете следните пакети:

yarn add ava babel-register

Създайте папка за тестове . Полезно е да държите тестовете си на едно място. Можете да държите там и тестови модули / контролери.

Вашият актуализиран package.jsonсега трябва да изглежда така:

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

В babel-registertranspiles ES6 кода по време на изпълнение в случай че някои машини се изпълняват на старата версия на възел, който не поддържа ES6. В verboseзнаме ще ни даде някои чист изход в зависимост от това дали нашите тестове се провалят или да преминат. Този флаг е доста полезен при отстраняване на грешки в тестовете ви, но ако напишете стотици тестови случаи, може да искате да го изключите.

Във вашия tests/index.test.jsможете да добавите първия си тест:

Удобното при Ava е, че ви позволява да стартирате асинхронни тестове чрез async await функции. Синтаксисът също е доста ясен. Методът на плана ни позволява да споменем изрично броя на твърденията, които бихме искали да имаме за тест.

Стартирането yarn testот вашата конзола ви дава следния изход:

В случай, че някой от нашите тестове се провали, ще получим:

Това е красотата на verboseрежима. Той ви дава чист стек за грешки и нищо от боклука за проследяване на стека. В случай, че срещнете грешка по време на изпълнение, ще видите и хубаво подчертаване на синтаксиса.

Наистина можете да използвате Ava API и да използвате мощния му инструмент за твърдение, за да пишете гъвкави тестови случаи.

Настройка на вашия сървър Node

Досега говорихме само за основна настройка за писане на тестове - и нека бъдем откровени, това е доста направо напред. Така че в този раздел ще обясня как може да се отдели обикновен сървър на Node и да се тестват крайните му точки с Ava.

yarn add express body-parser 

Във вашата работна директория създайте app.jsи добавете следния фрагмент:

Причината, поради която експортирах модула на приложението, е така, че той може да се използва с фалшивия API сървър, който Ava ще трябва да изпълни вашите тестове.

Направете нов файл server.jsи импортирайте модула на приложението, за да стартирате сървъра.

Изпълнението на npm start трябва да стартира вашия сървър и навигирането до // localhost / крайната точка на състоянието трябва да ви даде отговор от 200OK.

Страхотно, така че нашият сървър работи.

Бърз поглед на кода показва, че сме създали 3 крайни точки: крайна точка на състоянието, поздравителна крайна точка и крайна точка на регистър. Има някаква проверка на крайната точка на регистъра, която хвърля 400 (лоша заявка), в случай че липсват параметри на тялото на тялото. Горният метод за валидиране е доста наивен, но служи на нашата цел за тестване на крайни точки - така че ще се придържам към него.

Професионален съвет: Винаги можете да присвоите обработка на грешки на междинен софтуер и да използвате до него, за да извикате манипулатора на грешки.

Нека напишем още няколко теста около крайната точка. Ще използвам супертестамодул. Той е много подобен на суперагента: той използва същите API и има подобен синтаксис. Така че, печелете.

Импортирахме експортирания преди това appмодул и го предадохме в супертест. Supertest създава прокси сървър, който след това ще удари всички URL адреси на крайните точки, споменати в теста. Можете да използвате deepEqualметода за тестване на целия обект или isметода за ръчно тестване на всяко поле.

Изпълнението на теста за прежда ще даде следното:

Страхотен. Написахме четири теста и всички те преминаха според очакванията. Но какво ще кажете за покритието на кода?

Здравей nyc

За създаването на тези прекрасни отчети за покритието ще използваме nyc, който е интерфейсът на командния ред на Istanbul.js. Той е много лесен за използване и има много конфигурируеми опции. За улеснение ще използваме много проста конфигурация.

yarn add nyc --save

Командата nyc се увива добре върху вашата тестова команда и ще създаде папка за покритие (това трябва да е във вашия gitignore) във вашата работна директория.

Актуализирайте, package.jsonкакто е показано по-долу:

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

Типовете репортери, които искате, могат да бъдат конфигурирани в nyc секцията на вашия package.jsonфайл.

Нека пуснем покритие за прежда:

Добре, значи все още нямаме 100% покритие. Нека поправим това. Първо бихте искали да влезете в папката за покритие на вашата работна директория и да видите коя част от кода ви не е покрита.

Явно пропуснахме място. Нека добавим окончателния тестов случай във tests/index.tests.jsфайла, който ще обхване целия app.jsфайл.

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

И сега….

Presto.

Професионален съвет: Ако искате да добавите праг за тестови случаи, можете да добавите скрипт във вашия файл package.json.
"check-coverage": "node_modules/.bin/nyc check-coverage --lines 100 --functions 100 --branches 100 --statements 100"

This command can be run as part of your travis / gitlab pipeline build systems.

Conclusion

We’ve covered a basic setup with Ava for unit test cases of your Node APIs. The documentation is really extensive and can be referred to in case of doubt.

PS: Hope you like the article, correct me if I am wrong anywhere. Always welcome a discussion.