Jest 15.0: Нові значення за замовчуванням для Jest
We spent the past year making Jest faster, easier to configure, added tons of features and built snapshot testing. Однак було дві сфери, в яких ми замало інвестували: вивід командного рядка та користувацький досвід. В Jest 15 ми радикально змінюємо фреймворк, щоб полегшити використання початківцями та досвідченими користувачами. Ми задоволені результатами наших інвестицій у Jest: ми можемо дуже швидко рухатись та покращувати фреймворк для Facebook і спільноти відкритого вихідного коду. Мета Jest - максимальне налаштування за замовчуванням, аби вимагати якомога менше необхідної конфігурації. We recently got a chance to explain our philosophy on a create-react-app issue.
The most important change to talk about is a set of new defaults. Якщо ви вже користуєтесь Jest, то, швидше за все, вам знадобиться оновити вашу конфігурацію для Jest 15. У більшості випадків налаштування спроститься та Jest надасть корисні повідомлення про помилки під час оновлення. Всі нові значення за замовчуванням можуть бути відключені відповідно до ваших потреб, але ми все ще вважаємо відключені функції критичними для Jest в певних ситуаціях, тож надалі довгостроково використовуватимемо та підтримуватимемо їх для Facebook. Our API documentation was also completely rewritten to reflect these changes. This pull request for React highlights some of the changes necessary for existing projects.
Нові повідомлення про помилки та підсумок CLI
В процесі поступового видалення Jasmine з Jest, майже заве ршено заміну всі матчерів Jasmine. Багато часу було витрачено на налаштування кожного повідомлення про помилку, аби кожен матчер якнайкраще сигналізував падіння тестів - момент, коли Jest є найбільш важливим. In addition to printing the expected and received values, a diff is printed for the toBe and toEqual matchers to help spot mistakes. Додано більше кольорів, відповідні файли зі стеку більш виділяються.
Here is a comparison of the before and after on a light terminal:
It also works well with darker colors: 
Нова команда watch
We completely rewrote jest --watch to be more interactive. It can now switch between running all tests or only test files related to changed files by pressing a or o. By pressing p a prompt appears that allows to specify a test pattern to focus on a specific set of files. Snapshot tests can be updated by pressing u.

Вдосконалення jest-react-native
Mocks for ListView, TextInput, ActivityIndicator, ScrollView and more were added. Наявні імітації були оновлені для використання реальних реалізацій, тож наявні знімки, ймовірно, повинні бути оновлені при оновленні до Jest 15. A mockComponent function was added to jest-react-native that can be used to mock native components:
jest.mock('MyNativeComponent', () => {
const jestReactNative = require('jest-react-native');
return jestReactNative.mockComponent('MyNativeComponent');
});
Також додалось багато покращень імітацій зображень, модулю fetch та інших вбудованих API.
Буферизовані повідомлення консолі
Jest розпаралелює запуски тестів між робочими процесами, щоб підвищити продуктивність. Раніше Jest пересилав консольні повідомлення з робочих процесів батьківським об'єктам і виводив їх негайно. При виконанні декількох тестів одночасно, часто було важко дізнатись, який тест в якому модулі викликав функцію журналу. У Jest 15, всі повідомлення консолі буферизуються та виводяться разом з результатами окремих тестів. Також виводяться файл та номер рядка виклику журналу, аби код можна було легко перевірити.
Compare the output of the previous version of Jest and Jest 15: 
Автоматична імітація вимкнена
Наразі у Jest автоматичну імітацію вимкнено за замовчуванням. Ця функція найбільше плутає нових користувачів і в більшості не має сенсу для малих проєктів. Ми ввели автоімітацію у Facebook і для нас вона чудово працювала, коли впроваджувалось модульне тестування великої існуючої бази коду з небагатьма існуючими тестами, але з часом стало здаватись, нібито люди витрачали більше часу на проблеми імітованиї/неімітованих модулів, ніж витратилось би на звичайне написання тесту. Також ми помітили, що автори бібліотек часто вимагають великої кількості основних модулів, які завжди мають бути вручну виставлені як неімітовані. Навіть щодо самого Jest ми усвідомили, що більшість тестів відключають автоімітацію вручну. Ми все ще вважаємо, що явна автоімітація може бути надзвичайно корисною. This change simply trades implicit mocks for explicit mocks via calls to jest.mock(moduleName).
If you would still like to use automocking by default, enable the automock setting in your configuration or manually call jest.enableAutomock() in your test or setup file.
Шаблони тестових файлів
Not everyone uses the same convention of using a __tests__ folder to store tests. Jest 15 also looks for files ending in .spec.js or .test.js, two popular community standards. Jest 15 also removes the testDirectoryName and testFileExtensions configuration options and asks users to switch to the testRegex option when the old configuration options are used.
Постійність реєстру модулів
Jest used to implicitly reset all modules before each test and we recommended requiring modules in beforeEach or inside of tests. Це корисно, якщо модулі мають локальний стан, який не повинен поширюватися між тестами. However, two big shifts happened: ES modules with the top-level import syntax and a renewed interest in writing stateless functional modules.
Це призвело до численних несумісностей. Ми та кож помітили, що в Facebook неявне очищення навіть не використовується. Instead we relied on explicit calls to jest.resetModules() which puts engineers in control on when to wipe away all state.
До прикладу:
const React1 = require('react');
jest.resetModules();
const React2 = require('react');
React1 !== React2; // Дві окремі копії React.
The call to resetModules wipes away the require cache. Другий виклик того самого модулю призведе до створення нових екземплярів модуля та всіх його залежностей. This feature is especially useful when dealing with modules that have side effects, like jest-haste-map.
Ми вважаємо, що краще передати контроль користувачам, тож ми вимкнули неявне очищення. Modules can be reset using jest.resetModules() in code and the resetModules option can be enabled in the configuration to bring back the previous behavior.
Справжні або імітовані таймери
By default Jest used to mock all timer functions like setTimeout or process.nextTick and provided an API jest.runAllTimers() to advance timers programmatically. Це корисно, коли частина коду встановлює довгий тайм-аут, на який ми не хочемо чекати в тесті.
Однак ми дізналися, що більшість випадків застосування є доволі ізольованими. Async programming has also become much simpler in our test runner. Наразі Jest використовує реальні таймери за замовчуванням.
You can still override this by specifying "timers": "fake" in the configuration or by calling jest.useRealTimers() and jest.useFakeTimers() global switches.
setupEnvScriptFile vs setupFiles
The setupEnvScriptFile configuration option has been deprecated for a while. Jest 15 removes it completely and replaces it with setupFiles. Цей параметр очікує масив шляхів файлів, завантажених перед виконанням тестового фай лу.
Підтримка покриття переписаного коду
Code coverage in Jest can be used through jest --coverage and requires no additional packages or configuration. Code coverage support was completely rewritten and a new collectCoverageFrom option was added to collect code coverage information from entire projects, including untested files. Зверніть увагу, що ця опція використовує шаблони пошуку файлів, бо в майбутньому ми сподіваємося ще більше спростити параметри конфігурації та надати простішу альтернативу регулярним виразам. See Jest's package.json for an example.
Інші покращення
Також зроблено велику кількість інших покращень:
- Покращено продуктивність виконання невеликих тестів.
- Jest почав використовувати детальний режим при виконанні єдин ого тестового файлу.
- Added an
--envoption to override the configured test environment. moduleNameMappernow uses a resolution algorithm.- Jest тепер працює зі шляхами, в яких наявні спеціальні символи; наприклад, дужки.
- Added
global.globalto the node environment. - Fixed
babel-plugin-jest-hoist's invalid error when a random user function was calledmock. - Fix
testEnvironmentresolution to preferjest-environment-{name}instead of{name}only. This prevents a module collision when usingjsdomas test environment. - Покращено власні тести Jest шляхом об'єднання інтеграційних і модульних тестів. Покриття коду тепер збирається для Jest.
Ми задоволені всіма змінами, які було зроблено разом з допомогою спільноти, а також з нетерпінням очікуємо наступні кілька місяців, аби зробити Jest ще кращим. Please file an issue if something isn't working as expected and send us pull requests.
Next up: Concurrent Reporter.
