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

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

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

Ми провели минулий рік, роблячи Jest швидшим, простим в налаштуванні, додали купу функцій та додали тестування за допомогою знімків. Однак було дві сфери, в яких ми замало інвестували: вивід командного рядка та користувацький досвід. В Jest 15 ми радикально змінюємо фреймворк, щоб полегшити використання початківцями та досвідченими користувачами. Ми задоволені результатами наших інвестицій у Jest: ми можемо дуже швидко рухатись та покращувати фреймворк для Facebook і спільноти відкритого вихідного коду. Мета Jest - максимальне налаштування за замовчуванням, аби вимагати якомога менше необхідної конфігурації. Нещодавно у нас з'явилася можливість пояснити нашу філософію щодо проблеми create-react-app.

Найважливіша зміна - це набір нових значень за замовчуванням. Якщо ви вже користуєтесь Jest, то, швидше за все, вам знадобиться оновити вашу конфігурацію для Jest 15. У більшості випадків налаштування спроститься та Jest надасть корисні повідомлення про помилки під час оновлення. Всі нові значення за замовчуванням можуть бути відключені відповідно до ваших потреб, але ми все ще вважаємо відключені функції критичними для Jest в певних ситуаціях, тож надалі довгостроково використовуватимемо та підтримуватимемо їх для Facebook. Наша документація API також була повністю переписана відповідно до цих змін. Цей запит для React зазначає деякі зміни, необхідні для наявних проєктів.

Нові повідомлення про помилки та підсумок CLI

В процесі поступового видалення Jasmine з Jest, майже завершено заміну всі матчерів Jasmine. Багато часу було витрачено на налаштування кожного повідомлення про помилку, аби кожен матчер якнайкраще сигналізував падіння тестів - момент, коли Jest є найбільш важливим. Окрім виводу очікуваних і отриманих значень, виводиться різниця між матчерами toBe та toEqual для спрощення пошуку помилок. Додано більше кольорів, відповідні файли зі стеку більш виділяються.

Порівняння раніше і після у світлій темі терміналу: failure1 Також працює з темнішими кольорами: failure2

Нова команда watch

Ми повністю переписали jest --watch для більшої інтерактивності. Тепер вона можна перемикатися між запуском всіх тестів або лише тестовими файлами, які стосуються змінених файлів, натисканням а або o. Натискання p дозволить вказати тестовий шаблон для фокусування на певному наборі файлів. Тести з використанням знімків оновлюються натисканням u.

watch

Вдосконалення jest-react-native

Додано імітації для ListView, TextInput, ActivityIndicator, ScrollView та інших. Наявні імітації були оновлені для використання реальних реалізацій, тож наявні знімки, ймовірно, повинні бути оновлені при оновленні до Jest 15. До jest-react-native додана функція mockComponent, яку можна використовувати для імітації глобальних компонентів:

jest.mock('MyNativeComponent', () => {
const jestReactNative = require('jest-react-native');
return jestReactNative.mockComponent('MyNativeComponent');
});

Також додалось багато покращень імітацій зображень, модулю fetch та інших вбудованих API.

Буферизовані повідомлення консолі

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

Порівняйте вивід попередньої версії Jest і Jest 15: console

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

Наразі у Jest автоматичну імітацію вимкнено за замовчуванням. Ця функція найбільше плутає нових користувачів і в більшості не має сенсу для малих проєктів. Ми ввели автоімітацію у Facebook і для нас вона чудово працювала, коли впроваджувалось модульне тестування великої існуючої бази коду з небагатьма існуючими тестами, але з часом стало здаватись, нібито люди витрачали більше часу на проблеми імітованиї/неімітованих модулів, ніж витратилось би на звичайне написання тесту. Також ми помітили, що автори бібліотек часто вимагають великої кількості основних модулів, які завжди мають бути вручну виставлені як неімітовані. Навіть щодо самого Jest ми усвідомили, що більшість тестів відключають автоімітацію вручну. Ми все ще вважаємо, що явна автоімітація може бути надзвичайно корисною. Ця зміна просто замінює неявні імітації на явні за допомогою викликів jest.mock(moduleName).

Якщо ви все ще хочете використовувати автоімітації за замовчуванням, увімкніть параметр automock у налаштуваннях або вручну викличте jest. nableAutomock() у вашому тесті чи файлі налаштувань.

Шаблони тестових файлів

Не всі слідують правилу використання каталогу __tests__ для зберігання тестів. Jest 15 також шукає файли, які закінчуються на .spec.js або .test.js, два популярні стандарти спільноти. Jest 15 також видаляє параметри конфігурації testDirectoryName та testFileExtensions і просить користувачів перейти на testRegex при використанні старих параметрів конфігурації.

Постійність реєстру модулів

Раніше Jest неявно скидав всі модулі перед кожним тестом, тому ми рекомендували підтягувати необхідні модулі в beforeEach або всередині тестів. Це корисно, якщо модулі мають локальний стан, який не повинен поширюватися між тестами. Однак відбулися дві великі зміни: ES модулі з синтаксисом найвищого рівня import, а також поновлений інтерес до написання функціональних модулів без збереження внутрішнього стану.

Це призвело до численних несумісностей. Ми також помітили, що в Facebook неявне очищення навіть не використовується. Замість цього ми покладалися на явні виклики jest.resetModules(), які дають розробникам контроль над очищенням всього стану.

До прикладу:

const React1 = require('react');
jest.resetModules();
const React2 = require('react');

React1 !== React2; // Дві окремі копії React.

Виклик resetModules видаляє кеш require. Другий виклик того самого модулю призведе до створення нових екземплярів модуля та всіх його залежностей. Ця функція особливо корисна під час роботи з модулями, які мають побічні ефекти, як-то jest-haste-map.

Ми вважаємо, що краще передати контроль користувачам, тож ми вимкнули неявне очищення. Модулі можна скинути за допомогою jest. esetModules() всередині коду або ввімкненою опцією resetModules в конфігурації, що поверне попередню поведінку.

Справжні або імітовані таймери

За замовчуванням Jest імітував всі функції таймерів, такі як setTimeout або process.nextTick і надавав jest.runAllTimers() API для програмного розширення функціоналу. Це корисно, коли частина коду встановлює довгий тайм-аут, на який ми не хочемо чекати в тесті.

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

Ви все ще можете перевизначити це, вказавши "timers": "fake" в конфігурації або викликом jest.useRealTimers() і jest.useFakeTimers().

setupEnvScriptFile vs setupFiles

Параметр конфігурації setupEnvScriptFile давно є застарілим. Jest 15 повністю видаляє його та замінює на setupFiles. Цей параметр очікує масив шляхів файлів, завантажених перед виконанням тестового файлу.

Підтримка покриття переписаного коду

Покриття коду в Jest може використовуватись за допомогою jest --coverage і не вимагає додаткових пакетів або конфігурації. Підтримка покриття коду була повністю переписана, додана нова опція collectCoverageFrom для збору інформації про покриття коду для цілих проєктів, включно з нетестованими файлами. Зверніть увагу, що ця опція використовує шаблони пошуку файлів, бо в майбутньому ми сподіваємося ще більше спростити параметри конфігурації та надати простішу альтернативу регулярним виразам. Як приклад, розгляньте Jest package.json.

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

Також зроблено велику кількість інших покращень:

  • Покращено продуктивність виконання невеликих тестів.
  • Jest почав використовувати детальний режим при виконанні єдиного тестового файлу.
  • Додано параметр --env для перевизначення налаштованого тестового середовища.
  • moduleNameMapper тепер використовує алгоритм роздільної здатності.
  • Jest тепер працює зі шляхами, в яких наявні спеціальні символи; наприклад, дужки.
  • Додано global.global в тестове середовище.
  • Виправлено помилку babel-plugin-jest-hoist, при якій випадкова користувацька функція називалась імітацією.
  • Виправлено роздільну здатність testEnvironment; перевага віддається jest-environment-{name} замість {name}. Це запобігає колапсу модулю при використанні jsdom як тестового середовища.
  • Покращено власні тести Jest шляхом об'єднання інтеграційних і модульних тестів. Покриття коду тепер збирається для Jest.

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

Наступне: Миттєвий генератор звітів.