Jest
Jest — інструмент командного рядка, побудований на основі інший популярної бібліотеки тестування Jasmine. Розробкою Jest займається Facebook, і Jest часто використовується разом з React та цілком логічно фулл-стек розробнику в стеку MERN використовувати для модульного тестування саме його.
Переваги та особливості Jest:
- Вбудована у бібліотеку імітація модулів JavaScript/Node спрощує ізоляцію коду при модульному тестуванні
- Щоб почати працювати з бібліотекою немає необхідності в підготовці порівняно з іншими бібліотеками виконання тестів, наприклад для Mocha потрібне імпортування Chai, підключення Istanbul і т.д.
- Ізольоване (sandboxed) та паралельне виконання тестів, що призводить до прискорення їх виконання
- Забезпечує модульність, різноманітне налаштування та адаптованість
Бібліотеки для модульного тестування використовують одні і ті ж конструкції для визначення тестів та їх наборів і Jest не є винятком у цьому випадку.
Конструкції:
describe
- набір тестівtest
(абоit
) - тестовий випадокbeforeAll
- підготовка перед тестуваннямbeforeEach
- підготовка для кожного набору чи тестового випадкуafterAll
- завершальні дії після тестуванняafterEach
- завершальні дії для кожного набору чи випадку
Команда describe
визначає набір тестів. Він використовується як
контейнер для набору тестів. Команда test
використовується для одиничного тесту
або по-іншому тестового випадку. Інші конструкції, такі як beforeAll
,
afterAll
, beforeEach
та afterEach
, як бачимо з назви виконуються перед
або після набору тестів чи тестового випадку. При beforeEach
та afterEach
внутрішній код цих функцій виконується багаторазово замість одного разу. Тести
повинні містити як мінімум по одній команді describe
та test
і
необмежену кількість. Інші команди не є обов'язковими
Давайте створимо простий приклад. Для використання Jest, у новій папці проекту необхідно виконати команду
npm init -y
Це створить файл package.json
. Після встановимо Jest:
npm i jest -D
Тепер потрібно відкрити файл package.json
та вручну змінити запис команди
test
на jest
, як показано нижче. Ми додали команду тестування.
{
"name": "test-jest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "jest"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"jest": "^26.6.1"
}
}
Створимо модуль pow.js
, який містить функцію зведення у ступінь. Її ми й
будемо у якості приклада тестувати.
module.exports = (a, b) => {
return a ** b;
};
Тепер створимо файл із тестами pow.test.js
. У імені він міститиме
ключове слово test
(вимога Jest)
const pow = require('./pow');
describe('hooks', function () {
beforeAll(() => {
console.log('Виконати на початку тестів');
});
afterAll(() => {
console.log('Виконати після тестів');
});
beforeEach(() => {
console.log('Виконати на початку кожного тесту');
});
afterEach(() => {
console.log('Виконати наприкінці кожного тесту');
});
test('1 to power 2 to equal 1', () => {
console.log('1 to power 2 to equal 1');
expect(pow(1, 2)).toBe(1);
});
test('3 to power 2 to equal 9', () => {
console.log('3 to power 2 to equal 9');
expect(pow(3, 2)).toBe(9);
});
});
Як приклад, ми використовували всі конструкції. У кожній ми виводимо за
допомогою console.log
відповідне повідомлення. Ми виконуємо тестування
функції двома тестами, де очікуємо, що функція зведення у ступінь поверне
правильний результат.
Запуск тесту проводиться тепер командою
npm run test
При запуску, ми повинні отримати такий лог у консолі:
PASS ./pow.test.js
hooks
√ 1 to power 2 to equal 1 (12 ms)
√ 3 to power 2 to equal 9 (7 ms)
console.log
Виконати на початку тестів
at Object.<anonymous> (pow.test.js:5:13)
console.log
Виконати на початку кожного тесту
at Object.<anonymous> (pow.test.js:13:13)
console.log
1 to power 2 to equal 1
at Object.<anonymous> (pow.test.js:21:13)
console.log
Виконати наприкінці кожного тесту
at Object.<anonymous> (pow.test.js:17:13)
console.log
Виконати на початку кожного тесту
at Object.<anonymous> (pow.test.js:13:13)
console.log
3 to power 2 to equal 9
at Object.<anonymous> (pow.test.js:26:13)
console.log
Виконати наприкінці кожного тесту
at Object.<anonymous> (pow.test.js:17:13)
console.log
Виконати після тестів
at Object.<anonymous> (pow.test.js:9:13)
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 3.903 s
Ran all test suites.
Зверніть увагу на порядок виконання конструкцій.
У Jest використовується синтаксис BDD і в основі лежить мова затвердження Expect. Перерахуємо основні методи Expect, які підтримує Jest, інші можна подивитися в документації.
not
— інвертує наступне порівняння в ланцюжку.expect(func(arg)).toBe(value)
— перевірка на строгу рівність отриманого значення valueexpect(func(arg)).toEqual(value)
— глибоке порівняння якщо повертаються значення об'єктexpect(func(arg)).toBeTruthy()
— перевіряє значення на те, що чи можна значення, що повертається вважати істиннимexpect(func(arg)).toBeNull()
— перевіряє значення на рівністьnull
.expect(func(arg)).toBeUndefined()
— перевіряє значення наundefined
expect(func(arg)).toBeDefined()
— перевіряє, що функція повертає щось
В expect()
передається тестована функція, яка повертає фактичне
значення і використовуючи методи Expect вона порівнюється з очікуваним значення, жорстко
заданим у тестах.
Ми розібрали бібліотеку Jest яку будемо використовувати для написання модульних тестів.