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

Jest 25: 🚀 Вибудовуємо основу майбутнього

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

Jest 25 закладає основу для багатьох великих змін у майбутньому. Для цього, ми мінімізували критичні зміни, але зміни внутрішньої архітектури вимагають уваги під час оновлення. Основними змінами є оновлення JSDOM з версії 11 до 15, пришвидшення тестів на 10-15%, новий вигляд різниці для застарілих знімків і припинення підтримки Node 6.

З релізу Jest 24.9 додалось більш ніж 200 комітів понад 80 різних співавторів, тож, як завжди, перегляньте журнал змін задля повного переліку.

Бувай, Node 6

Node 6 завершив існування 30 квітня 2019, тож Jest 25 залишає його позаду. Видалення Node 6 означає, що ми можемо оновити залежності, найголовніше - JSDOM, що було оновлено до версії 15. Оновлення також означає, що нам більше не потрібно переносити синтаксис async-await, що призводить до швидшого виконання коду та меншого споживання пам'яті. Додатково, перекладений код Jest повинен бути простішим в налагоджені, якщо комусь доведеться в тому розбиратись.

Навіть якщо Node 8 також став EOL, Jest 25 підтримуватиме його, щоб зробити оновлення якомога простішим для тих з нас, хто досі підтримує Node 8. Але там є свої нюанси, як-то відсутність підтримки Node 8 для JSDOM v16, через що потрібно використовувати jest-environment-jsdom-sixteen для доступу до останньої версії.

Покращення продуктивності

За останні декілька релізів, ми отримали повідомлення про вповільнення Jest. Jest 25 містить оновлений Micromatch, яке дає величезну перевагу під час запуску, та деякі виправлення помилок і налаштування продуктивності, які повертають Jest швидкість версії 23. Як було зазначено на початку цього допису, для Jest це означає 10-15% зменшення часу виконання тестів. Ми завжди прагнемо вдосконалити цей момент, тож, будь ласка, перевірте, як він порівнюється з більш ранніми версіями та створіть проблеми, якщо ми маємо щось покращити!

Покриття коду V8

Інструментарій покриття поточного коду в Jest надається babel-plugin-istanbul через додавання коду покриття тестів перед створенням звітів. Однак це доволі повільний процес, що використовує багато пам'яті, особливо для великих файлів та баз коду. На щастя, V8 має вбудоване покриття коду, яке все більше використовується в Node завдяки невпинній праці Benjamin Coe та інших учасників команд V8 і Node.js. Jest 25 містить експериментальну підтримку цієї функції з використанням нового прапору --coverage-provider. Будь ласка, перегляньте застереження та спосіб застосування в документації.

Думаємо швидко та повільно щодо провальних тестів

Зайві зусилля для розуміння звітів провальних тестів заважають:

  • “думати швидко”, розпізнаючи шаблони вашого минулого досвіду
  • “думати повільно”, аналізуючи зміни та вирішуючи, чи є вони очікуваним прогресом або несподіваним регресом

Jest 25 завершує другу половину процесу, розпочатого в Jest 24, щодо покращення усіх матчерів:

  • правильна лінія опису, у тому числі модифікатори .rejects, .resolvesі .not
  • лаконічні мітки та послідовність щодо очікуваних та отриманих значень
  • інвертоване підсвічування підрядків розбіжностей, коли очікуються та отримуються рядки
  • кількість рядків змін, для розуміння типу зміни (лише видалення/додавання)

Окрема подяка розробнику підтримки Jest Mark Pedrotti за ведення цієї ініціативи та його постійну роботу задля покращення помилок очікування.

Кольори відмінностей при провалі тестування знімками

Найбільш очевидною зміною для боротьби з плутаниною стали кольори рядків відмінностей у випадках, коли тести знімків провалюються:

  • - Snapshot змінився з зеленого на пурпуровий
  • + Received змінився з червоного на блакитний передній план з темно-блакитним/лазурним фоном

Приклади звітів тестів знімками (до ліворуч, після праворуч)

  1. Кількість змінених ліній підтверджує ваше перше враження щодо зміни знімків (тобто видалених або вставлених рядків)

snapshot-insert-lines

  1. Колір фону спрощує візуальне порівняння змінених рядків

snapshot-change-lines

  1. Фонові кольори також допомагають вам побачити, які toThrow тести потребують прийняття рішень щодо оновлення знімків

snapshot-change-substrings

Наведемо кілька причин, чому ми обрали унікальні кольори:

  • 95% людей, які повноцінно бачать кольори, можуть швидко визначити, які звіти стосуються тестів зі знімками, а не інших матчерів.
  • Це вирішує прямий конфлікт між значенням зеленого/червоного кольорів у тестах Jest, порівнюючи з перевіркою коду.
  • На відміну від червоного/зеленого кольорів, через які можна припустити, що оновлення є рішенням за замовчуванням, нинішня візуалізація показує, що відмінності вимагають більш ретельного розгляду на предмет можливої регресії в локальних помилках тестування знімками, а не перевірці коду (коли проблеми вже виправлені).

Різниця у тональності від пурпуру 300° до відтінків блакитного 180° дає кращу видимість кольорів, а світлий відтінок фону для змінених ліній забезпечує постійний контраст у світлих і темних темах.

Якщо ви підтримуєте інструмент командного рядка, ви можете допомогти покращити його доступність в #9132.

Підтримка модулів ECMAScript

Node 13 прибрав позначку підтримки ESM, тож ми почали потроху працювати над вбудованою підтримкою в Jest. Jest 25 включає підтримку файлів конфігурації jest.config.cjs і jest.config.mjs, але самі тести ще не можуть писатись з використання ESM без чогось на зразок Babel або TypeScript, що перетворює їх в CJS.

API, які використовуватиме Jest, все ще позначені як експериментальні, тому наразі не очікуйте підтримки. Ці API замінюють те, над чим команда Node.js Modules активно працює, і ми спостерігатимемо за процесом та експериментуватимемо з ними задля зворотного зв'язку. Ви можете слідкувати за цією проблемою для отримання оновлень щодо статусу реалізації.

Інші вдосконалення та оновлення

  • Jest пройшов відмітку в 1000 унікальних учасників. Це неймовірне досягнення! Дякуємо всім, хто допомагає нам робити тестування якомога приємнішим.
  • Завдяки члену спільноти Josh Rosenstein, Jest тепер підтримує BigInt в більшості матчерів, таких як toBeGreaterThan. Jest також приймає bigint літерали з коробки.
  • Опція Jest --detect-leaks була зламана в Node 12+ - пофіксили в Jest 25.
  • Як було оголошено в дописі блогу про Jest 24, базу коду Jest було переписано на TypeScript. Ця робота була завершена в Jest 24.3. Якщо ви використовуєте будь-яку з окремих частин Jest, ви маєте отримати відмінну інтеграцію IDE. Надалі ми дійсно хочемо покращити взаємодію Jest імітацій з системами типів; допомога спільноти в цьому не завадить. Очікуємо тут ваші ідеї та запити на злиття! Також ми будемо досліджувати переміщення типів для використання виконавця тестів Jest з DefinitelyTyped в самий Jest.
  • Пакет jest-diff тепер експортує функції, які мають параметри конфігурації, такі як diffLinesUnified і diffStringsUnified, щоб інші програми могли форматувати відмінності власним чином. Більше інформації та прикладів коду шукайте в новому файлі README.md в репозиторії Jest або самих пакетів.
  • Завдяки члену спільноти Wei An Yen, Jest більше не підсвічуватиме правильні асиметричні матчери як помилкові. Це була давня проблема асиметричних матчерів і ми дуже раді, що вона нарешті вирішилась.
  • Другий рік поспіль, Jest виграв нагороду Highest Satisfaction від State of JS. Ми неймовірно вдячні за підтримку спільноти та сподіваємося, що зможемо продовжити такий рівень активності та покращитись за 2020 рік!

Плани на майбутнє

  • Конфігурація Jest масивна та дещо нерозбірлива - часто знаходиться хоча б два шляхи розв'язання однієї проблеми, іноді більше. В Jest 26 ми сподіваємось зменшити конфігурацію та зробити її більш передбачуваною. Деталі наявні в цій проблемі.
  • We also hope to be able to provide a proper programmatic API for running Jest, to make integration into IDEs and other tooling easier. Please see this tracking issue.
  • There’s been an open PR for adding Lolex as an implementation of Jest’s fake timers since December 2017. While we’re not adding it to any public APIs in Jest 25, support for it is technically included and you we're looking into how to expose this so people can test and experiment with it. Using it means you can mock out Date and other timer function Jest currently doesn’t touch. Зверніть увагу, що це слід вважати експериментальним, і відповідна підтримка API буде в більш пізньому релізі. Follow this PR for the latest updates on the status.

Happy Jesting! 🃏