Изоляция, 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нельзя коммитить.