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

Jest 22: Правки & Користувацькі виконавці

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

Сьогодні ми анонсуємо нову версію Jest, в якій вдосконалено майже всі частини Jest з метою забезпечення міцнішої бази для тестування. Разом зі спільнотою, ми внесли широкий ряд змін, які допоможуть вам отримати більше від Jest. Ми також завершили випробувальний термін для функції користувацьких виконавців та додали новий пакет jest-work для розпаралелення роботи численних процесів. Внизу ми зібрали список основних моментів, але (як завжди) огляньте журнал усіх змін.

Прощавай, Node 4 & Ласкаво просимо, JSDOM 11

Цього релізу ми припиняємо підтримку Node 4, головним чином тому, що завершує їх підтримку одна з наших головних залежностей JSDOM. Тепер Jest за замовчуванням містить JSDOM 11, який надає кращу підтримку для SVG, requestAnimationFrame, вбудовані URL і URLSearchParams, та інше.

Користувацькі Виконавці + Легка паралелізація з jest-worker

В Jest 21 ми представили концепцію користувацьких виконавців Jest. Відтоді, Rogelio, один з основних дописувачів Jest, створив ряд корисних виконавців: якщо у вас вже є багато тестів, написаних за допомогою іншого фреймворку, але вам наразі потрібні корисні функції Jest, спробуйте jest-runner-mocha. Якщо у вас є велика кодова база, що потребує перевірки, ви можете значно пришвидшитись, якщо запустите eslint в Jest з допомогою jest-runner-eslint.

Щоб отримати глибинний контроль над важкими завданнями паралелізації (наприклад, перетворення файлів або спостереження за файловою системою), ми розробили нову відповідну бібліотеку. Ми розробили сучасний, оснований на промісах модуль jest-worker з доступним API, що дозволяє делегувати підконтрольним процесам інтенсивні функції. Як і будь-який інший пакет Jest, jest-worker є частиною платформи Jest, тож ви можете використовувати його навіть без самого Jest. Більше ви знайдете в документації.

Щоб краще зрозуміти користувацькі виконавці та Jest як платформу, не забудьте переглянути виступ Rogelio на Reactive Conf 2017: Jest як платформа.

Код фрейму в тестових помилках

Щоб легше визначити, яке твердження є провальним для вашого тесту, ми додали код фрейму, який показує твердження, що має допомогти сфокусуватися на вашому коді. Приклад тесту:

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

В Jest 21, ми виводили наступну помилку:

failure in Jest 21

В Jest 22, ми додали код фрейму, який дає більше контексту провальному твердженню. Ми також очистили стекові сліди, частково прибравши безлад.

failure in Jest 22

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

Тепер ви можете використовувати toThrow і toThrowErrorMatchingSnapshot для відмов промісів так само, як і для синхронних помилок.

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

Асинхронні тестові середовища

Коли в серпні команда Google Chrome оголосила вихід Puppeteer, способу програмної взаємодії з реальним браузером Chromium, багато хто хотів використовувати Jest для написання своїх тестів в Chrome. Спільнота допомогла нам зробити це можливим завдяки асинхронному тестовому середовищу. Ми все ще працюємо над тим, щоб цей досвід став можливим, але від сьогодні вже доступний посібник з використання Puppeter з Jest.

Експериментальна діагностика витоку

Ми додали в Jest експериментальний параметр --detectLeaks, який після виконання тестів надає інформацію, чи є витоки у внутрішньому середовищі. Також буде попередження, коли ваш набір тестів вимагає файл після завершення тесту; це означає, що ви не дочекались всіх асинхронних операцій або залишили щось, що не було належним чином очищено. При цьому, витік безпосередньо у коді користувача виявлено не буде, лише у тестах; додатково вам може допомогти технологія, на якій ми базувались (див. jest-leak-detector). Якщо ви повідомляєте про помилку про використання пам'яті Jest, вкажіть параметри, за яких --detectLeaks валить тест. Ми почали будувати кращий механізм пісочниці для Jest, але він ще не готовий до включення за замовчуванням. Якщо ви хотіли б допомогти, будь ласка, зв'яжіться з нами через discord!

Покращення режиму спостереження

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

Підтримка Babel 7

Jest використовує Babel, щоб робити покриття коду та покращені функції імітації. Jest 22 також підтримує майбутній Babel 7. Більше ви знайдете в документації.

Вдосконалення функцій-імітацій

Jest 22 вносить декілька змін в функції-імітації, що робить їх ще простішими. По-перше, ми додали властивість mockName, що дозволяє вам називати імітації, що корисно в невдалих твердженнях. Також ми зробили Jest функції-імітації готовими до серіалізації в pretty-format; це означає, що ви можете використовувати імітації знімків тестів. В Jest 21, expect(jest.fn()).toMatchSnapshot() буде серіалізуватися в [Function], з Jest 22, ви можете отримати щось на зразок цього:

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Серіалізується в:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Деталі Jest 21

Jest 21 був випущений у вересні, і ми, на жаль, не випустили відповідний допис. Тож тримайте короткий огляд основних змін версії 21:

  1. Використання expect і jest-mock в браузері: Michael Jackson надав свій відмінний пакет expect для проєкту Jest. Під час переходу, основна команда Jest, з допомогою Kenneth Skovhus, зробила jest-matchers (перейменовано на expect) та jest-mock придатними для роботи в браузері. Це означає, що, хоча ви не можете використовувати сам Jest в браузерах (поки що), ви можете використовувати його твердження та імітації для екземплярів, замінивши Chai та Sinon в тестах Mocha. Якщо ви мігруєте з ранішніх expect на новий expect від Jest, ви можете використовувати jest-codemods для автоматизації міграції.
  2. Ліцензія MIT: Ми змінили ліцензію Jest на MIT. Чудово!
  3. Провальні набори тестів на помилках async: Jest мав помилку, яка призводила до проблем при виявленні помилок у деяких частинах асинхронного коду. Це було виправлено розробниками спільноти.
  4. Швидший старт: З Jest 21, ми зробили запуск Jest на 50% швидшим. Для малих тестів завжди були проблемою великі витрати часу Jest, але тепер це не має стримувати вас від використання Jest.

Jest Community

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

  • jest-image-snapshot - користувацький матчер для порівняння зображень зі знімками від розробників American Express
  • ts-jest - все, що вам потрібно, аби успішно запустити Jest в проєкті TypeScript від @kulshekhar
  • jest-codemods - легке перенесення ваших тестів з інших фреймворків у Jest
  • jest-plugins - новий проєкт спільноти, орієнтований на спрощення налаштування тестового середовища для конкретних інструментів, таких як React, або надання корисних утиліт

Ми також хотіли б повідомити, що нещодавно запустився новий простір для високоякісних доповнень до Jest - jest-community. Це нова організація GitHub, яка вже містить наші улюблені проєкти, наприклад, vscode-jest, jest-extended, супроводжена Jest розробниками та співробітниками. Ми навіть розмістили наш eslint-plugin-jest і вже бачили деякі вагомі внески, які незалежно публікуються набагато швидше.

Jest Community

Спільні проєкти єдиної організації є чудовим способом експериментувати в таких речах, як автоматизований реліз, який ми б хотіли розглянути в контексті Jest. Вони також дають нам змогу вносити в них однакові речі, як то формат README (дякуємо спільноті webpack за ідею), спрощуючи їх вивчення та використання.

Якщо у вас є щось круте щоб поділитися, ви можете зв'язатися з нами! Ми були б раді розділити з вами ваш проєкт.