текст перекладу
Тестування є важливою складовою, що забезпечує надійність і стабільність наших додатків. Jest — це потужний фреймворк для тестування JavaScript та TypeScript проєктів. Він швидкий, простий у використанні та має вбудовані функції, такі як мокінг (mocking), тестування знімків (snapshot testing) і покриття коду (code coverage). Цей курс допоможе вам розпочати роботу з Jest, зрозуміти основні концепції та написати свої перші тестові кейси.
Розпочнемо!
Необхідні вимоги
Перед початком переконайтеся, що ви маєте:
- Базові знання JavaScript (ES6+).
- Встановлений Node.js на вашій системі.
Встановлення Jest
Давайте почнемо з встановлення Jest у нашому проєкті. Ви можете використовувати будь-який текстовий редактор, але я буду використовувати Visual Studio Code.
Створимо приклад проєкту та ініціалізуємо Node.js:
mkdir jest-demo && cd jest-demo && npm init --yes
Це створить каталог з назвою jest-demo
, змінить поточний каталог на нього за допомогою команди cd
і ініціалізує його за допомогою npm init --yes
.
Щоб встановити Jest, запустимо:
npm install --save-dev jest
Додайте скрипт до вашого файлу package.json
, щоб запускати Jest:
// package.json
...
"scripts": {
"test": "jest"
},
Готово! Тепер ми можемо запускати наші тести за допомогою команди npm run test
. Але не робіть цього поки що. Спочатку нам потрібно написати деякі тести. Давайте зробимо це зараз.
Написання першого тесту:
Створимо два файли: один для основного коду проєкту та інший безпосередньо для тестів. Файл з тестами має відповідати імені основного файлу коду, але містити .test
наприкінці. Це дозволяє Jest автоматично виявляти і виконувати тести. Наприклад, ми називатимемо файли getSum.js
для основного коду та getSum.test.js
для тестів.
Файл з основним кодом містить функцію, що генерує привітання:
//getSum.js
function getSum(a, b) {
return a + b;
}
module.exports = getSum;
Тепер ми можемо почати створювати тест для функції додавання. У Jest використовуються функції test()
або її синонім it()
. Будь-яка з них працює — вони взаємозамінні. Перший параметр — це назва тесту, а другий параметр — це функція, яку потрібно виконати.
test('Що має робити функція під тестом', () => {
// очікуваний результат залежно від вхідних даних
});
it('Що має робити функція під тестом', () => {
// очікуваний результат залежно від вхідних даних
});
Далі ми описуємо сам тест: по суті ми кажемо, що якщо передати ці аргументи функції, очікуємо цей результат. Ось тут на допомогу приходить функція expect()
. Вона приймає очікуване значення як аргумент і повертає об’єкт з методами для тестування, які називаються матчерами (matcher functions). Одним із таких матчингів є метод toBe()
, який порівнює своє значення з тим, що передається в expect()
.
expect(1).toBe(1); // true
expect(1).toBe(2); // false
Отже, ми можемо передати результат функції getSum()
до expect()
і порівняти його з очікуваним результатом ось так:
const getSum = require('./getSum');
test('додає 1 + 2 і має дорівнювати 3', () => {
expect(getSum(1, 2)).toBe(3);
});
Читання результатів тестів:
Коли наші тести готові, ми можемо запустити їх за допомогою команди npm run test
:
# результат у консолі
PASS ./getSum.test.js
✓ Створює привітання (3ms)
Test Suites: 1 пройшло, 1 всього
Тести: 1 пройшло, 1 всього
Знімки: 0 всього
Час: 1.747с
Запущено всі тестові набори.
Слово “PASS” з'являється поряд з назвою файлу тестів, що означає, що наш код успішно пройшов усі тести.
текст перекладу
Тепер давайте подивимося, як виглядає тест, що не пройшов:
Змінімо наш тест для getSum:
const getSum = require('./getSum');
test('додає 1 + 2 і має дорівнювати 3', () => {
expect(getSum(1, 2)).toBe(4);
});
Запустимо npm run test
і подивимося на результат у терміналі:
FAIL ./getSum.test.js
× додає 1 + 2 і має дорівнювати 3 (5 ms)
● додає 1 + 2 і має дорівнювати 3
expect(received).toBe(expected) // Object.is equality
Expected: 4
Received: 3
2 |
3 | test('додає 1 + 2 і має дорівнювати 3', () => {
> 4 | expect(getSum(1, 2)).toBe(4);
| ^
5 | });
at Object.toBe (getSum.test.js:4:24)
Test Suites: 1 не пройшло, 1 всього
Тести: 1 не пройшло, 1 всього
Знімки: 0 всього
Час: 0.588 с, оцінено 1 с
Запущено всі тестові набори.
Правильно прочитавши результати тестів, ми легко можемо визначити, які помилки сталися і де вони сталися. Це робить їх пошук і виправлення набагато простішими.
Загальні методи тестування:
Усі методи тестування перевіряють, чи відповідає результат виконання певного фрагмента коду нашим очікуванням. Більшість наших тестів буде виконуватися за допомогою наступних методів:
. toBe()
використовується для порівняння примітивних значень і посилань на об'єкти:
// pass
expect('Очікування').toBe('Очікування');
const x = {};
const y = x;
expect(x).toBe(y);
// fail
expect('Очікування').toBe('Реальність');
const x= {};
const y= {};
expect(x).toBe(y);
. toEqual()
використовується для порівняння об'єктів і масивів:
Коли порівнюємо об'єкти, метод toEqual()
гарантує, що результатуючий об'єкт має ті ж самі ключі та відповідні значення, що й очікуваний об'єкт. Якщо об'єкт, який тестується, містить додаткові властивості, яких немає в очікуваному об'єкті, toEqual()
ігнорує ці зайві властивості.
Для масивів метод toEqual()
перевіряє, чи всі елементи фактичного результату точно співпадають з очікуваними. Однак він вважає відсутні елементи та значення undefined
еквівалентними.
// pass
expect({ a: undefined, b: 10, c: 'text' }).toEqual({ b: 10, c: 'text' });
// fail
expect({ a: undefined, b: 10, c: 'text' }).toEqual({ a: 12, b: 10, c: 'text' });
. Метод toStrictEqual()
використовується для порівняння об'єктів і масивів з більш строгими критеріями. Фактичний об'єкт або масив повинен точно відповідати очікуваному, включаючи наявність однакових властивостей або елементів без будь-яких пропусків або додаткових елементів. На відміну від toEqual()
, метод toStrictEqual()
не вважає undefined
і відсутні елементи еквівалентними. Наприклад:
// pass
expect([1, 2, undefined]).toStrictEqual([1, 2, undefined]);
// fail
expect([[undefined, 1]]).toStrictEqual([[, 1]])
. toBeTruthy()
і toBeFalsy()
перевіряють, чи є результат true
або false
відповідно:
// pass
expect(1).toBeTruthy();
expect(true).toBeTruthy();
expect(undefined).toBeFalsy();
// fail
expect(null).toBeTruthy();
expect(0).toBeTruthy();
. toBeUndefined()
і toBeDefined()
порівнюють результат з undefined
:
// pass
expect(1).toBeDefined();
expect(null).toBeDefined();
expect('рядок').toBeDefined();
// fail
const x;
expect(x).toBeDefined();
expect(undefined).toBeDefined();
toBeNull()
перевіряє, чи є результат null
:
Перекладено з: Jest Crash Course: A Beginner’s Guide to Testing in JavaScript