Перейти до основного вмісту

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) — перевірка на строгу рівність отриманого значення value
  • expect(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 яку будемо використовувати для написання модульних тестів.