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

Jest 20: 💖 Приємне тестування & 🏃🏽 Багатопроєктний виконавець

· 6 хвилин читання

Кілька місяців тому ми анонсували Jest 19, який мав важливі нові функції та був найбільшим релізом Jest на той момент. Jest 20 має подвійну кількість змін у порівнянні з попередньою версією та містить повністю перероблений виконавець тестів, додається новий тестовий API. Новий реліз надає новий рівень персоналізації та конфігурації проєктів, при цьому оновлення не забере багато часу. Окрім Безпроблемного JavaScript Тестування, ми вважаємо, що Jest тепер надає Чудовий Досвід Тестування JavaScript. Розглянемо глибше найкращі нові функції та зміни:

Багатопроєктний виконавець & Зміна конфігурації

До сьогодні, Jest міг працювати лише в одному проєкті за раз. Це може перевантажувати процес, якщо ви працюєте над багатьма малими проєктами, кожен з яких має власні налаштування та конфігурацію. В Jest 20, ми повністю переписали виконавець тестів для одночасного запуску багато проєктів в одному екземплярі Jest; наприклад, якщо ви працюєте з фронтом React frontend і беком node.js. Ось відео з Jest, що виконує тести для React Relay, Yarn і Jest одночасно:

multi-runner

Наразі Jest згортає інструкцію використання після першого запуску тестів, щоб зберегти вертикальний простір в терміналі.

Також, ми повністю змінили спосіб роботи конфігураційної системи всередині Jest. Тепер ви можете передати будь-який параметр конфігурації через консоль для перезапису тих, що зазначені у вашому файлі конфігурації. Разом з цим ми внесли зміни Jest, аби шукати jest.config.js за замовчуванням, що означає, що тепер ви можете визначати конфігурацію Jest за допомогою JavaScript, так само як і налаштовувати її в package.json, як робилось раніше. Після додавання всіх цих нових функцій, ви тепер можете поєднувати Jest ще більш дієвими способами. Наприклад, якщо ви хочете дізнатись, які тести з вказаного набору змінених файлів з декількох проєктів в монорепозиторії Jest буде запускати, ви можете поєднати аргументи командного рядка наступним чином:

$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]

Це особливо корисно для систем безперервної інтеграції (CI), де ви можете запустити лише підмножину тестів для запитів на злиття, аби запобігти виконанню тисячі тестів при кожній маленькій зміні.

Нарешті, тепер покриття коду зіставляється належним чином при використанні TypeScript; діє запуск неперевірених файлів у робочих процесах, що значно прискорює цю функцію.

Новий & Покращений тестовий API

Ми зробили низку доповнень та вдосконалень до API тестів, що допоможе з написанням ефективніших тестів. Ми хотіли б зазначити, що всі ці вдосконалення були повністю зроблені членами спільноти!

  • Краще асинхронне тестування: додано нову підтримку async/Promise через модифікатори resolves/rejects в expect: expect(Promise(…)).resolves.toEqual(…). Дивіться документацію.
  • Очікування n тверджень: разом з наявним expect.assertions(n), новий expect.hasAssertions() можна використовувати для перевірки, що тест мав принаймні одне твердження.
  • Плагін Lint: в eslint-plugin-jest додано правило valid-expect для перевірки виклику твердження після виклику expect. Це запобігатиме помилкам, як-то випадкове expect(banana); з відсутнім викликом твердження.
  • Плагін Pretty-Format: було додано кілька нових Pretty-Format плагінів. Тепер ми форматуємо структури даних Immutable.js і HtmlElements для провальних тверджень та знімків.
  • Користувацьке середовище: Тепер можна додати анотацію @jest-environment node|jsdom до коментаря тестового файлу doc-block, щоб для окремих тестів використовувати тестове середовище, відмінне від стандартного.

Ось приклад того, як всі нові API разом покращують процес тестування:

/**
* @jest-environment node
*/

test('compares apples and bananas', async () => {
expect.hasAssertions(); // Цей тест гарантовано має мати хоча б одне твердження.

await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));

expect('banana'); // valid-expect в eslint-plugin-jest показуватиме помилку.
});

Цей приклад виведе подібну помилку:

testing-apis

Важливі Зміни

Як і в кожному великому релізі, ми здійснюємо ряд змін для внесення більших змін в майбутньому, а також для того, щоб вивести досвід тестування на новий рівень. Цього разу ми спробували зламати лише API, які не мають вплинути на більшості користувачів Jest:

  • Відгалуження Jasmine 2.5: Ми нарешті вирішили відгалузити Jasmine й отримати право власності на власний виконавець тестів Jest. Це дозволить нам поліпшити усі аспекти досвіду модульного тестування у майбутньому, але зараз ми зосереджені на поступовому переписі та зменшенні API. Якщо ви помітили тест, який ламається в результаті відсутності Jasmine API, пошукайте еквівалентну функцію в об'єктах jest або expect. Ми видалили багато функцій, які зазвичай не використовуються в більшості баз коду.
  • Нові знімки в CI: Знімки повинні завжди зберігатися разом з тестом та модулями, які вони перевіряють. Після змін, Jest не зберігає нові знімки автоматично в рамках безперервної інтеграції (CI) або якщо вказано прапорець --ci. Щоб перевизначити цю поведінку, що в цілому не рекомендується, можна використовувати прапорець --updateSnapshot.
  • Babel-Polyfill: Раніше Jest завантажував babel-polyfill автоматично при використанні babel-jest, що призводило до витоку пам’яті всередині Jest. У більшості версій node, babel-polyfill завантажувати не обов'язково, тож ми видалили це автовключення і замість цього маємо лише regenerator-runtime за замовчуванням, що зазвичай використовується для підтримки async/await в старих версіях Node.js. Якщо вам необхідний babel-polyfill, ви можете вручну включити його у файлі налаштувань.

Інші покращення

  • Документація: Документація має вирішальне значення для поширення передового досвіду, як писати ефективні тести, які покращать якість програмного забезпечення. За останні кілька тижнів ми також розширили документацію Jest розділом Часті запитання щодо тестування знімками, керівництвом з інформацією про використання Jest з поширеними JavaScript бібліотеками, а також задокументованими новими функціями, описаними вище.
  • Переклади: Ми просимо вас допомогти перекласти документацію Jest, щоб спростити процес навчання користуванням Jest.
  • Користувацькі генератори звітів: Jest тепер підтримує користувацькі генератори звітів тестів за допомогою опції конфігурації reporters. Ви нарешті можете налаштувати вивід Jest та інтегрувати його з іншими інструментами, генеруючи звіти в різних форматах, як-то XML. Перегляньте документацію.
  • Здорова база коду: Розробка Jest швидко рухається лише тому, що ми витратили значну кількість часу на збереження здорової кодової бази. Ми одними з перших додали prettier, помітно збільшили покриття процесів, відгалузили Jasmine для поліпшення нашої бібліотеки виконавця тестів і наново переписали та переробили значну частину самого Jest для того, щоб забезпечити успіх Jest в майбутньому.
  • Виправлення помилок: Як завжди, ми зробили багато виправлень в Jest. Повний журнал змін можна знайти в репозиторії Jest.

Дискусії щодо Jest

Останнім часом основна команда Jest та інші розробники почали більше розповідати про Jest та досвід роботи на конференціях:

Як завжди, цей реліз не відбувся б, якби не спільнота JavaScript. Ми безмежно вдячні за можливість покращувати тестування JavaScript разом з вами. Якщо ви хотіли б зробити свій внесок у Jest, будь ласка, звертайтесь до нас на GitHub або Discord.