Як ви можете протестувати свої програми Node.js за допомогою Ava.js

Чому б ви хотіли написати тестові кейси для своїх додатків? Ну, це питання, яке багато розробників намагаються ухилитися, лише тому, що це вимагає зусиль і часу, і тому, що ручне тестування набагато задовольніше. Клацніть… клацніть… заповніть форму… Клацніть… Presto. Мій додаток працює, мої API хороші, все модно.

Перемотуйте вперед майже 30 запитів на витяг на день, які об’єднуються у вашу головну гілку. Тепер, як ви ставитесь до тестування 30 функцій вручну або рефакторингу блоку коду та несвідомо зламування чужого коду?

На цьому етапі ви зазвичай говорите: "Я би хотів, щоб я написав кілька тестових кейсів для початку". Тож черпайте натхнення у Facebook: тут вони поділились досить класною статтею, яка пояснює, як команда розробила React 16 із тестовою розробкою.

Вузлові додатки самі по собі досить прості у побудові. Залучена велика підтримка громади, і ви зазвичай отримуєте те, що вам потрібно, розпитуючи. Вузлові програми можуть бути чудовим проксі-сервером для ряду серверів API, тим самим роблячи їх тестування кінцевих точок більш важливим.

У цій статті я описав , як встановити і записати основні випадки модульного тестування зі звітами покриття для додатків Node.js .Тож давайте заскочимо.

Привіт Ава

Ava - програма для тестування JavaScript. Він використовує асинхронну природу вводу-виводу 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 повинен запустити ваш сервер, а перехід до // локальної точки хосту / кінцевої точки повинен дати вам відповідь 200OK.

Чудово, тому наш сервер працює.

A quick glance of the code shows that we’ve created 3 endpoints: a status endpoint, a greet endpoint, and a register endpoint. There is some validation on the register end point, which throws a 400(Bad request) in case post body params are missing. The above validation method is pretty naïve, but it serves our purpose of endpoint testing — so I’m going to stick with it.

Pro tip : You can always assign error handling to a middleware and use next to invoke the error handler.

Let’s write some more tests around the endpoint. I will use the supertestmodule. It’s very similar to superagent: it uses the same APIs, and has a similar syntax. So, win-win.

We have imported the previously exported app module and passed it into supertest. Supertest creates a proxy server, which will then hit all the endpoint URLs mentioned in the test. You can use the deepEqual method to test the entire object or the is method to manually test each field.

Running the yarn test will yield the following:

Great. We’ve written four tests and they all pass as expected. But what about code coverage?

Hello nyc

For creating those lovely coverage reports, we’ll use nyc which is Istanbul.js’ command line interface. It’s very easy to use and has a lot of configurable options. For the sake of simplicity, we’ll use a very simple configuration.

yarn add nyc --save

The nyc command wraps nicely over your test command and will create a coverage folder (this should be in your gitignore) in your working directory.

Update your package.json as shown below:

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

The types of reporter you want can be configured in the nyc section of your package.json file.

Let’s run yarn cover:

Okay so we don’t have 100% coverage yet. Let’s fix that. First you’d want to go into the coverage folder of your working directory and see which part of your code hasn’t been covered.

Clearly we missed a spot. Let’s add our final test case in the tests/index.tests.js file, which will cover the entire app.js file.

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

And now….

Presto.

Pro tip: If you want to add a threshold for test cases you can add a script in your package.json file.
"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.