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

Jest 15.0: Нові значення за замовчуванням для Jest

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

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: failure1 It also works well with darker colors: failure2

Нова команда 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.

watch

Вдосконалення 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: console

Автоматична імітація вимкнена

Наразі у 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 --env option to override the configured test environment.
  • moduleNameMapper now uses a resolution algorithm.
  • Jest тепер працює зі шляхами, в яких наявні спеціальні символи; наприклад, дужки.
  • Added global.global to the node environment.
  • Fixed babel-plugin-jest-hoist's invalid error when a random user function was called mock.
  • Fix testEnvironment resolution to prefer jest-environment-{name} instead of {name} only. This prevents a module collision when using jsdom as 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.