Jest 24: 💅 Оновлений, Відшліфований, Сумісний з TypeScript
Сьогодні ми з радістю повідомляємо про наступний великий реліз Jest - версія 24! Минуло 4 місяці з моменту останнього мінорного релізу та 8 місяців після виходу Jest 23, так що це велике оновлення буде корисне для кожного! Основні моменти містять в собі вбудовану підтримку TypeScript шляхом оновлення внутрішньої начинки Jest до Babel 7, виправлення деяких давніх проблем із відсутнім виводом консолі та проблемами продуктивності при обчисленні великих відмінностей, а також новісінький сайт. ✨
For a full list of all changes see the changelog.
Новий вебсайт
@orta has provided a beautiful redesign of Jest's website, which has been implemented by community members @montogeek and @brainkim.
Метою редизайну було виділити більше чудових моментів Jest та розвіяти міт, ніби Jest є насамперед інструментом для тестування додатків React - ви можете використовувати Jest на різних проєктах і ми хочемо, аби це було для всіх очевидним. You can read more about the ideas behind the redesign in this issue.
Підтримка TypeScript
З Jest 24, ми внутрішньо оновилися до Babel 7, що надало підтримку проєктів TypeScript. That means Jest can support transpiling TypeScript out of the box, as long as you configure Babel to use it with @babel/preset-typescript. Єдина незручність підтримки TypeScript за замовчуванням, аналогічна Flow, це те, що Babel вилучить лише анотації типів, щоб зробити ваш код дійсним JavaScript. It will not typecheck your code.
У той час як Jest підтримував Babel 7 з версії 22, випущеної в грудні 2017, це вимагало використання перехідного модуля, щоб співпрацювати з Jest підтримкою Babel 6. In Jest 24 we have migrated entirely over to Babel 7, with great help from community member @milesj. This means that setup is now easier and we can take advantage of other Babel 7 features, such as config loading and automatic modules transpilation. Make sure to remove the babel-core@^7.0.0-bridge.0 as it's not needed now.
If you want to run typechecks while you test, you should use ts-jest. You will need to configure the transformer, as Jest by default applies Babel to .ts (and .tsx) files. Alternatively, you can run tsc or even use a Jest runner to simultaneously transpile your TypeScript whilst running your tests! See jest-runner-tsc for more information.
See the docs for more details.
If you for whatever reason cannot upgrade to Babel 7, you can still use Jest 24 with babel@6 as long as you keep babel-jest at version 23.
test.todo
В Jest 23 змінив пропуск тестів без реалізації на кидання throw. Ця зміна була зроблена через зворотний зв'язок; було зазначено, що випадково пропущені тести важко було знайти та відстежувати. Однак ця зміна зламала робочий процес для багатьох розробників, які використовували функцію для приблизної оцінки, які тести потрібно писати.
In Jest 24, we are addressing this issue by adding an explicit test.todo (inspired by the excellent AVA), which will be printed separately in the test summary. It allows you to quickly sketch out which tests you want to write and in the future, an ESLint rule might even be able to warn you that you have forgotten to write out some tests.
test.todo('invalid input should throw');
test.todo('missing options should be normalized');

Покращені повідомлення тверджень
Коли тести провалюються, вам потрібно приймати впевнено та правильно вирішити, які зміни є очікуваним прогресом, а які несподіваним кроком назад. Особливо важливо не пропустити кілька проблем, захованих серед великого прогресу. Jest 24 робить звіти провальних тверджень яснішими та лаконічними для випадку декількох матчерів. Ініціатива буде продовжена у Jest 25, тож ви можете помітити деякі тимчасові невідповідності. Якщо ваші тести ніколи не провалюються, то ви не зможете їх побачити; для інших буде простіше знайти, чому щось не працює належним чином. Thanks for the hard work by @ittordepam and other contributors from the community.
You can see these changes across all these PRs: 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.
Приклади:
Провальні твердження

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

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

Чинимо давні проблеми
В цьому релізі, ми виправили пару дійсно старих проблем.
The first one we'd like to highlight is console.log statements going missing. Jest перехоплює та збирає всі логи для того, щоб надати вам трасування стеку, а також віддати генераторам звітів, щоб ви змогли використовувати їх як заманеться. Однак, це призвело до проблеми їх відсутності в певних крайніх випадках. Luckily for Jest 24, @spion has stepped up and fixed this issue. Щиро дякуємо!
Друга - це проблема дефіциту пам'яті Jest, якщо різниця в серіалізації очікуваного та отриманого значень має величезну кількість внесених змін (неочікувано через помилку в тесті або дефекті серіалізатора, або ж очікувана через тимчасові провали під час розробки через тестування). @ittordepam has replaced the previous diffing algorithm with diff-sequences package, which should fix this issue because it uses the theoretical minimum amount of memory. It opens up possibility for word-diffs in the future, similar to what git provides. Please see this PR and don't hesitate to reach out if you want to help make that happen!
Інші зміни
- We have some improvements for
globalSetupandglobalTeardownas well - code transformation will be applied to them similar tosetupFilesand they are now supported as part ofprojects. - You can configure Jest's snapshot location, this is mainly useful if you are building tools which use Jest in a larger build process.
- A quirk of Jest's CLI has been that while some flags and options have been camel cased (such as
runInBand), others have not been (such asno-cache). У Jest 24, обидва розпізнаються, що означає, що ви можете писати аргументи командного рядка будь-яким чи ном. - We've renamed
setupTestFrameworkScriptFiletosetupFilesAfterEnv, and made it into an array. Сподіваємося, стане більш зрозумілим, для чого необхідні опції. Ми маємо плани надалі знову переглянути конфігурацію, дивіться абзац у розділі нижче. - To reduce the amount of magic Jest performs to “just work™”, in this release we decided to drop automatic injection of
regenerator-runtime, which is sometimes used in compiled async code. Includingregenerator-runtimeis not always necessary and we believe it's the user's responsibility to include it if it's needed. If you use@babel/preset-envwithtargetsset to a modern Node version (e.g. Node 6+) you will not need to include it. Please see our Using Babel docs for more information. - Node.js 10 came with an experimental module called
worker_threads, which is similar to Worker threads in the browser.jest-worker, part of the Jest platform, will be able to useworker_threadsif available instead ofchild_process, which makes it even faster! Benchmarks show a 50% improvement. Через свою експериментальну природу, функцію вимкнено при використанні Jest як виконавця тестів, але ви вже можете використовувати її у своїх проєктах! Ми плануємо включити його за замовчуванням, коли його підвищать з експериментального статусу в Node.js.
Важливі Зміни
While all breaking changes are listed in the changelog, there's a few of them that are worth highlighting:
- Ми оновились до Micromatch 3. Хоча це може не вплинути на кожного користувача, він більш жорсткий при парсингу пошуку по масці, ніж у версії 2, яка використовується в Jest 23. Please read through this and linked issues for examples of invalid globs in case you have problems.
- Ми видалили залишки коду, необхідні для Node 4. Раніше можна було запустити Jest 23 на Node 4, що стало неможливим без полінаповнювання та транспіляції.
- Деякі зміни для серіалізації функцій-імітацій в знімках - не забудьте перевірити знімки після оновлення. Related PR.
- Jest no longer automatically injects
regenerator-runtime- if you get errors concerning it, make sure to configure Babel to properly transpileasyncfunctions, using e.g.@babel/preset-env. Related PR.
Майбутнє
We are incredibly humbled by the results in State Of JS 2018, where Jest won the “Highest Satisfaction” award. Ще однією великою подією, що вперше відбулася у жовтні 2018 році, стало досягнення Jest 2 мільйонів завантажень за тиждень. Дякуємо.
Ми дуже вдячні за довіру спільноти та сподіваємося підтверджувати її в майбутньому. Ми продовжимо будувати Jest 24 та майбутні релізи на цій неймовірній основі, і надалі бути невіднятною частиною інструментів JavaScript розробників.
Це був перший реліз, в якому ми досліджували ідею використання нашого фонду Open Collective для створення винагороди за знайдені помилки. This worked well in getting non-core developers involved in the implementation of the new landing page, and we're optimistic for a long running bug where Jest globals are mismatched from Node globals. Ми хотіли б зробити більше, тож якщо у вас є невелика помилка, що в теорії є гарним кандидатом для нашої програми, повідомте нас про це. In the meantime, you can find all the tickets with a bounty via the issue label.
Ми вже почали розробляти плани для наступного релізу Jest 25; найбільшою запланованою функцією стала капітальна зміна нашої конфігурації, яку здійснити складно, в основному через перетин опцій, змішані пошуки та регулярні вирази. Feedback on how you want Jest's configuration to look is very much welcome, and can be submitted in this issue.
Ви також могли чути, що ми плануємо перенести кодову базу з Flow на TypeScript. Ми сподіваємось, що ця міграція дозволить ще більшій кількості учасників долучитись та допомогти зробити тестування JavaScript у 2019 році ще кращим. 🚀 План полягає в тому, щоб втілити це в мінорному релізі в найближчий час. Feedback on this choice can be added to the RFC.
Lastly, if you've ever wondered about how Jest is built, @cpojer has recorded a video with an architectural overview of how Jest is put together under the hood. Якщо у вас є будь-які інші запитання з цього приводу, сміливо задавайте їх нам. The video is available on our website.
Happy Jesting! 🃏
