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

Jest 24: 💅 Оновлений, Відшліфований, Сумісний з TypeScript

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

Сьогодні ми з радістю повідомляємо про наступний великий реліз Jest - версія 24! Минуло 4 місяці з моменту останнього мінорного релізу та 8 місяців після виходу Jest 23, так що це велике оновлення буде корисне для кожного! Основні моменти містять в собі вбудовану підтримку TypeScript шляхом оновлення внутрішньої начинки Jest до Babel 7, виправлення деяких давніх проблем із відсутнім виводом консолі та проблемами продуктивності при обчисленні великих відмінностей, а також новісінький сайт. ✨

Для повного списку змін дивіться журнал змін.

Новий вебсайт

@orta надав чудовий редизайн вебсайту Jest, який був реалізований членами спільноти @monreverek і @brainkim.

Метою редизайну було виділити більше чудових моментів Jest та розвіяти міт, ніби Jest є насамперед інструментом для тестування додатків React - ви можете використовувати Jest на різних проєктах і ми хочемо, аби це було для всіх очевидним. Більше про ідеї зміни дизайну ви можете прочитати в цій нотатці.

Підтримка TypeScript

З Jest 24, ми внутрішньо оновилися до Babel 7, що надало підтримку проєктів TypeScript. Це означає, що Jest може самостійно підтримувати TypeScript, доки ви налаштовуєте Babel за допомогою @babel/preset-typescript. Єдина незручність підтримки TypeScript за замовчуванням, аналогічна Flow, це те, що Babel вилучить лише анотації типів, щоб зробити ваш код дійсним JavaScript. Без перевірки вашого коду на типи.

У той час як Jest підтримував Babel 7 з версії 22, випущеної в грудні 2017, це вимагало використання перехідного модуля, щоб співпрацювати з Jest підтримкою Babel 6. В Jest 24 ми повністю перейшли на Babel 7, за допомогою члену спільноти @milesj. Це означає, що налаштування тепер простіші та ми можемо скористатися іншими функціями Babel 7, наприклад, завантаженням налаштувань та автоматичною транспіляцією модулів. Переконайтесь, що видалили babel-core@^7.0.0-bridge.0, оскільки це більше не потрібно.

Якщо ви хочете запустити typechecks під час тестування, вам слід використовувати ts-jest. Вам потрібно буде налаштувати перетворювач, бо Jest за замовчуванням застосовує Babel для файлів .ts.tsx). Крім того, ви можете запустити tsc або навіть застосувати виконавець Jest для одночасного перенесення вашого TypeScript під час запуску ваших тестів! Перегляньте jest-runner-tsc для отримання додаткової інформації.

Перегляньте документацію для отримання додаткової інформації.

порада

Якщо ви з якихось причин не можете оновитися до Babel 7, ви все ще можете використовувати Jest 24 з babel@6, доки ви маєте babel-jest версії 23.

test.todo

В Jest 23 змінив пропуск тестів без реалізації на кидання throw. Ця зміна була зроблена через зворотний зв'язок; було зазначено, що випадково пропущені тести важко було знайти та відстежувати. Однак ця зміна зламала робочий процес для багатьох розробників, які використовували функцію для приблизної оцінки, які тести потрібно писати.

У Jest 24, ми розв'язуємо цю проблему, додавши явний test.todo (натхненне AVA), який виводиться окремо в результатах тестів. Це дозволяє швидко визначити, які тести ви хочете написати, а в майбутньому правило ESLint може навіть попереджати вас, що ви забули написати деякі тести.

test.todo('invalid input should throw');

test.todo('missing options should be normalized');

test.todo

Покращені повідомлення тверджень

Коли тести провалюються, вам потрібно приймати впевнено та правильно вирішити, які зміни є очікуваним прогресом, а які несподіваним кроком назад. Особливо важливо не пропустити кілька проблем, захованих серед великого прогресу. Jest 24 робить звіти провальних тверджень яснішими та лаконічними для випадку декількох матчерів. Ініціатива буде продовжена у Jest 25, тож ви можете помітити деякі тимчасові невідповідності. Якщо ваші тести ніколи не провалюються, то ви не зможете їх побачити; для інших буде простіше знайти, чому щось не працює належним чином. Дякуємо за важку роботу @ittordepam та іншим розробникам спільноти.

Ці зміни можна побачити в наступних запитах на злиття: 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.

Приклади:

Провальні твердження

failing assertion

Невідповідність типів

different types

Функція-імітація не викликається

mock functions

Чинимо давні проблеми

В цьому релізі, ми виправили пару дійсно старих проблем.

Першою була зникнення виводу console.log. Jest перехоплює та збирає всі логи для того, щоб надати вам трасування стеку, а також віддати генераторам звітів, щоб ви змогли використовувати їх як заманеться. Однак, це призвело до проблеми їх відсутності в певних крайніх випадках. На щастя, @spion вирішили взяти це до уваги та розв'язати проблему. Щиро дякуємо!

Друга - це проблема дефіциту пам'яті Jest, якщо різниця в серіалізації очікуваного та отриманого значень має величезну кількість внесених змін (неочікувано через помилку в тесті або дефекті серіалізатора, або ж очікувана через тимчасові провали під час розробки через тестування). @ittordepam замінили попередній алгоритм порівняння пакетом diff-sequences, який має виправити цю проблему, бо він використовує теоретичний мінімальний об'єм пам'яті. Це в майбутньому уможливлює порівняння послівно, подібно до git. Будь ласка, перегляньте цей запит на зміни та не баріться зв'язатись з нами, якщо ви хочете зробити це можливим!

Інші зміни

  • У нас є деякі вдосконалення globalSetup та globalTeardown - трансформація коду буде застосована до них подібно до setupFiles і вони тепер підтримуються як частина проєктів.
  • Ви можете налаштувати розташування знімків Jest, корисно при створенні інструментів з використанням Jest всередині великих процесів.
  • Особливість Jest CLI була в тому, що, навіть якщо деякі прапорці та параметри мали верблюдячий регістр (наприклад, runInBand), інші ні (наприклад, no-cache). У Jest 24, обидва розпізнаються, що означає, що ви можете писати аргументи командного рядка будь-яким чином.
  • Ми перейменували setupTestFrameworkScriptFile на setupFilesAfterEnv і перетворили його в масив. Сподіваємося, стане більш зрозумілим, для чого необхідні опції. Ми маємо плани надалі знову переглянути конфігурацію, дивіться абзац у розділі нижче.
  • Щоб зменшити кількість магії в Jest, що “просто працює™”, в цьому релізі ми вирішили викинути автоматичне введення regenerator-runtime, що іноді використовується у скомпільованому асинхронному коді. Включати regenerator-runtime не завжди необхідно, тож ми вважаємо, що у цьому випадку відповідальність має перекладатись на користувача. Якщо ви використовуєте @babel/preset-env з targets, встановленими на сучасну версію Node (наприклад, Node 6+), включати його не потрібно. Перегляньте нашу Using Babel документацію для додаткової інформації.
  • Node.js 10 опублікували з експериментальним модулем під назвою worker_threads, який схожий на потоки Worker у браузері. jest-worker, частина платформи Jest, зможе використовувати доступні worker_threads замість child_process, що значно пришвидшить процес! Benchmarks показують покращення на 50%. Через свою експериментальну природу, функцію вимкнено при використанні Jest як виконавця тестів, але ви вже можете використовувати її у своїх проєктах! Ми плануємо включити його за замовчуванням, коли його підвищать з експериментального статусу в Node.js.

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

Усі критичні зміни описані в журналі змін, однак деякі з них варті особливої уваги:

  • Ми оновились до Micromatch 3. Хоча це може не вплинути на кожного користувача, він більш жорсткий при парсингу пошуку по масці, ніж у версії 2, яка використовується в Jest 23. Будь ласка, прочитайте це та проблеми з посиланнями, аби побачити приклади неприпустимих пошуків в разі виникнення проблем.
  • Ми видалили залишки коду, необхідні для Node 4. Раніше можна було запустити Jest 23 на Node 4, що стало неможливим без полінаповнювання та транспіляції.
  • Деякі зміни для серіалізації функцій-імітацій в знімках - не забудьте перевірити знімки після оновлення. PR на цю тему.
  • Jest більше не вставляє автоматично regenerator-runtime - якщо ви отримуєте помилки, що стосуються цього, перевірте налаштування Babel для належної транспіляції функції async, наприклад, використовуючи @babel/preset-env. PR на цю тему.

Майбутнє

Ми неймовірно раді результатам State Of JS 2018, де Jest виграв нагороду "Highest Satisfaction". Ще однією великою подією, що вперше відбулася у жовтні 2018 році, стало досягнення Jest 2 мільйонів завантажень за тиждень. Дякуємо.

Ми дуже вдячні за довіру спільноти та сподіваємося підтверджувати її в майбутньому. Ми продовжимо будувати Jest 24 та майбутні релізи на цій неймовірній основі, і надалі бути невіднятною частиною інструментів JavaScript розробників.

Це був перший реліз, в якому ми досліджували ідею використання нашого фонду Open Collective для створення винагороди за знайдені помилки. Це чудово допомагало залучати сторонніх розробників до участі в реалізації нової основної сторінки, тож ми оптимістично налаштовані щодо виправлення тривалої помилки, де глобальні значення Jest не відповідають значенням Node. Ми хотіли б зробити більше, тож якщо у вас є невелика помилка, що в теорії є гарним кандидатом для нашої програми, повідомте нас про це. Тим часом ви можете знайти всі проблеми з винагородою через відповідну мітку.

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

Ви також могли чути, що ми плануємо перенести кодову базу з Flow на TypeScript. Ми сподіваємось, що ця міграція дозволить ще більшій кількості учасників долучитись та допомогти зробити тестування JavaScript у 2019 році ще кращим. 🚀 План полягає в тому, щоб втілити це в мінорному релізі в найближчий час. Відгук щодо цього варіанту можна додати до RFC.

Нарешті, якщо ви коли-небудь задумувалися про те, як створюється Jest, @cpojer записав відео з архітектурним оглядом внутрішніх процесів побудови Jest. Якщо у вас є будь-які інші запитання з цього приводу, сміливо задавайте їх нам. Відео доступно на нашому сайті.

Happy Jesting! 🃏