Изоляция, skip и only

Урок про независимость тестов и инструменты фокусировки: test.only и test.skip.

Хороший набор тестов изолирован: порядок и результат одного теста не зависят от другого.

Почему изоляция критична

Если тесты делят изменяемое состояние (общую переменную, реальную базу, глобальный объект), результат начинает зависеть от порядка запуска. Такой набор хрупкий: добавили тест в середину — посыпались остальные. Jest по умолчанию не гарантирует порядок, поэтому полагаться на него нельзя.

Как добиться изоляции

  • Свежее состояние через beforeEach (см. прошлый урок).
  • Никаких общих изменяемых переменных между тестами.
  • Внешние зависимости (сеть, время, файлы) подменяют моками — об этом следующий раздел.

Пример протечки состояния

Покажем живьём, что общий массив ломает независимость:

// ПЛОХО: общий массив между «тестами»
const shared = [];

function testA() {
  shared.push('A');
  console.log('test A видит:', shared.length, 'элемент(ов)');
}
function testB() {
  shared.push('B');
  console.log('test B видит:', shared.length, 'элемент(ов)');
}

testA();
testB(); // результат зависит от того, что сделал testA

Вывод:

test A видит: 1 элемент(ов)
test B видит: 2 элемент(ов)

testB «видит» след от testA — это и есть протечка. С beforeEach, создающим новый массив, такого бы не случилось.

test.only — сфокусироваться

Во время отладки удобно запустить ровно один тест. Добавьте .only — Jest пропустит остальные в файле:

test.only('только этот тест сейчас важен', () => {
  expect(calc(2, 2)).toBe(4);
});

test('этот будет пропущен из-за only', () => {
  expect(true).toBe(true);
});

test.skip — временно отключить

.skip помечает тест как пропущенный (например, известный баг ещё не починен). Он останется в отчёте как skipped, но не упадёт:

test.skip('сломан до фикса JIRA-123', () => {
  expect(buggy()).toBe(42);
});

Оба работают и с describe: describe.only, describe.skip.

Важно: не коммитьте only

Забытый test.only отключит все остальные тесты в файле в CI — и сломанный код проедет незамеченным. В проектах часто настраивают линтер (правило no-focused-tests), чтобы .only не попал в репозиторий.

Итог

  • Изоляция: тесты не зависят друг от друга и от порядка запуска.
  • Общее изменяемое состояние — главный враг изоляции.
  • test.only — запустить только этот тест (для отладки).
  • test.skip — временно отключить тест; .only нельзя коммитить.
Проверьте себя
1. Что значит, что тесты изолированы?
AОни лежат в отдельной папке
BРезультат и порядок одного теста не влияют на другие
CОни не используют expect
DОни запускаются только в CI
2. Что делает test.only?
AУдаляет остальные тесты
BЗапускает только помеченный тест, пропуская остальные в файле
CПомечает тест как пропущенный
DДелает тест асинхронным
3. Почему опасно закоммитить test.only?
AЭто замедлит установку
BВ CI будет выполнен только этот тест, и сломанный код может пройти незамеченным
CJest откажется запускаться
DТесты станут асинхронными
Поддержать проект