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

Jest 20: 💖 Delightful Testing & 🏃🏽 Multi-Project-Runner

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

A few months ago we announced Jest 19 which came with major new features and was the biggest Jest release until today. Jest 20 має подвійну кількість змін у порівнянні з попередньою версією та містить повністю перероблений виконавець тестів, додається новий тестовий API. Новий реліз надає новий рівень персоналізації та конфігурації проєктів, при цьому оновлення не забере багато часу. Beyond Painless JavaScript Testing, we believe Jest is now delivering a Delightful JavaScript Testing experience. Розглянемо глибше найкращі нові функції та зміни:

Multi-Project-Runner & Configuration Overhaul

До сьогодні, Jest міг працювати лише в одному проєкті за раз. Це може перевантажувати процес, якщо ви працюєте над багатьма малими проєктами, кожен з яких має власні налаштування та конфігурацію. В Jest 20, ми повністю переписали виконавець тестів для одночасного запуску багато проєктів в одному екземплярі Jest; наприклад, якщо ви працюєте з фронтом React frontend і беком node.js. Here is a video of Jest running tests for React, Relay, Yarn and Jest all at the same time:

multi-runner

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

Також, ми повністю змінили спосіб роботи конфігураційної системи всередині Jest. Тепер ви можете передати будь-який параметр конфігурації через консоль для перезапису тих, що зазначені у вашому файлі конфігурації. Along with that, we changed Jest to look for a jest.config.js file by default which means you are now able to define a Jest configuration using JavaScript as well as being able to configure it through package.json like before. Після додавання всіх цих нових функцій, ви тепер можете поєднувати 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; діє запуск неперевірених файлів у робочих процесах, що значно прискорює цю функцію.

New & Improved Testing APIs

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

  • Better async testing: Added new async/Promise support through resolves/rejects modifiers on expect: expect(Promise(…)).resolves.toEqual(…). See documentation.
  • Expect n assertions: Along with the existing expect.assertions(n), the new expect.hasAssertions() can be used to ensure a test has at least one assertion.
  • Lint Plugin: A valid-expect rule was added to eslint-plugin-jest to ensure that an assertion is called after invoking expect. This will prevent mistakes like a stray expect(banana); with a missing assertion call.
  • Pretty-Format Plugins: A number of new pretty-format plugins were added to Jest. We now pretty-print Immutable.js data structures and HtmlElements in assertion failures and snapshots.
  • Custom Environment: It is now possible to add a @jest-environment node|jsdom annotation to the doc-block comment of a test file to use a test environment different from the default for individual tests.

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

/**
* @jest-environment node
*/

test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.

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

expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});

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

testing-apis

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

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

  • Fork of Jasmine 2.5: We finally decided to fork Jasmine itself and take ownership over Jest's own test runner. Це дозволить нам поліпшити усі аспекти досвіду модульного тестування у майбутньому, але зараз ми зосереджені на поступовому переписі та зменшенні API. If you see a test breaking as a result of a Jasmine API that is now missing, there should be an equivalent feature on the jest or expect objects. Ми видалили багато функцій, які зазвичай не використовуються в більшості баз коду.
  • New Snapshots on CI: Snapshots must always be committed along with the test and the modules they are testing. We changed Jest to not save new snapshots automatically in Continuous Integration (CI) environments or when the --ci flag is specified. To overwrite this behavior, which is generally not recommended, the --updateSnapshot flag can be used.
  • Babel-Polyfill: Jest used to load babel-polyfill automatically when using babel-jest which resulted in memory leaks inside of Jest. In most versions of node, it is not necessary to load babel-polyfill so we removed this auto-inclusion and instead changed Jest to only include regenerator-runtime by default, which is commonly used to support async/await in older versions of Node.js. If you need babel-polyfill, you can manually require it in your setup files.

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

  • Documentation: Documentation is critical to share best practices and teach everyone how to write effective tests which will lead to better software. За останні кілька тижнів ми також розширили документацію Jest розділом Часті запитання щодо тестування знімками, керівництвом з інформацією про використання Jest з поширеними JavaScript бібліотеками, а також задокументованими новими функціями, описаними вище.
  • Translations: We are now asking for your help to translate the Jest documentation to make it easier for people to learn how to use Jest.
  • Custom Reporters: Jest now supports custom test reporters through the reporters configuration option. Ви нарешті можете налаштувати вивід Jest та інтегрувати його з іншими інструментами, генеруючи звіти в різних форматах, як-то XML. See documentation.
  • Codebase Health: It was only possible iterate so quickly in Jest because we spent a significant amount of time on the health of the codebase. We were one of the early adopters of prettier, we notably increased flow coverage, forked Jasmine to improve our test runner library and we rewrote and refactored significant portions of Jest itself to set up Jest for success in the future.
  • Bugfixes: As always, we made plenty of bugfixes in Jest. The full changelog can be found in the Jest repository.

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

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

As always, this release couldn't have been possible without you, the JavaScript community. Ми безмежно вдячні за можливість покращувати тестування JavaScript разом з вами. If you'd like to contribute to Jest, please don't hesitate to reach out to us on GitHub or on Discord.