Тестирование с использованием фреймворка Jest позволяет не только писать отдельные тесты для различных частей кода, но и организовывать их в группы для улучшения структуры и читаемости тестов. Jest предлагает несколько механизмов для организации тестов, что помогает контролировать их выполнение, а также упрощает отладку и расширение тестовых наборов. В этом разделе рассмотрены основные способы группировки тестов в Jest.
describeОсновной инструмент для группировки тестов в Jest — это функция
describe. Она позволяет объединять тесты, которые проверяют
схожие или связанные функциональности, в логические блоки. Каждая группа
тестов определяется с помощью вызова функции describe, в
которой передаются два параметра: описание группы тестов и колбэк с
тестами внутри.
describe('Математические операции', () => {
test('Сложение', () => {
expect(1 + 1).toBe(2);
});
test('Вычитание', () => {
expect(3 - 1).toBe(2);
});
});
Каждый вызов describe позволяет сгруппировать тесты,
добавив более ясное описание тестируемой функциональности. Такие группы
можно вложить друг в друга для более сложной структуры.
Можно создавать вложенные группы тестов для более детальной классификации. Это полезно, когда нужно разделить набор тестов на несколько подкатегорий, например, когда один тест может касаться общей функциональности, а другие — частных случаев.
describe('Математические операции', () => {
describe('Сложение', () => {
test('Положительные числа', () => {
expect(2 + 2).toBe(4);
});
test('Отрицательные числа', () => {
expect(-1 + -1).toBe(-2);
});
});
describe('Вычитание', () => {
test('Положительные числа', () => {
expect(3 - 1).toBe(2);
});
test('Отрицательные числа', () => {
expect(-2 - 1).toBe(-3);
});
});
});
Такая структура позволяет организовать тесты по категориям и улучшить восприятие результатов.
beforeAll, beforeEach, afterAll,
afterEachДля подготовки тестов или выполнения очистки после них в Jest
предусмотрены специальные хуки: beforeAll,
beforeEach, afterAll и afterEach.
Эти функции можно использовать внутри блоков describe для
выполнения каких-либо действий до или после выполнения тестов.
beforeAll — выполняется перед запуском всех тестов в
группе.beforeEach — выполняется перед каждым тестом в
группе.afterAll — выполняется после выполнения всех тестов в
группе.afterEach — выполняется после каждого теста в
группе.Пример:
describe('Группировка тестов с хуками', () => {
let sum;
beforeAll(() => {
sum = 0;
});
beforeEach(() => {
sum += 2;
});
afterEach(() => {
sum -= 1;
});
afterAll(() => {
sum = null;
});
test('Первый тест', () => {
expect(sum).toBe(2);
});
test('Второй тест', () => {
expect(sum).toBe(4);
});
});
Здесь переменная sum инициализируется один раз перед
всеми тестами, затем увеличивается перед каждым тестом и уменьшается
после каждого теста.
Jest также поддерживает фильтрацию тестов, что позволяет запускать только определённые тесты или группы тестов. Это полезно, когда тестов слишком много, и необходимо сосредоточиться на определённой части кода.
Для этого используется .only и .skip:
.only — позволяет запускать только конкретный тест или
группу тестов..skip — пропускает выполнение теста или группы
тестов.Пример:
describe('Тесты с фильтрацией', () => {
test('Сложение', () => {
expect(2 + 2).toBe(4);
});
test.only('Вычитание', () => {
expect(3 - 1).toBe(2);
});
test('Умножение', () => {
expect(2 * 2).toBe(4);
});
});
В этом примере будет выполнен только тест “Вычитание”, остальные тесты будут проигнорированы. Это полезно при отладке или в случае, когда нужно провести тестирование только одной части приложения.
it
вместо testВ Jest есть два способа написания тестов: через test и
через it. Оба метода делают одно и то же, и разница
заключается только в синтаксисе. По умолчанию рекомендуется использовать
test, но в некоторых случаях более естественно использовать
it, чтобы сделать описание тестов более похожим на обычный
язык.
describe('Математические операции', () => {
it('Сложение', () => {
expect(1 + 1).toBe(2);
});
it('Вычитание', () => {
expect(3 - 1).toBe(2);
});
});
Этот код идентичен коду с использованием test, и выбор
между ними зависит от предпочтений разработчика.
Если необходимо создать множество тестов с различными параметрами,
можно использовать динамическую генерацию тестов. Для этого используется
метод forEach или любой другой цикл, который создаёт тесты
в зависимости от входных данных.
describe('Проверка чисел', () => {
const cases = [
[1, 1, 2],
[2, 3, 5],
[3, 4, 7],
];
cases.forEach(([a, b, result]) => {
test(`Сложение ${a} + ${b}`, () => {
expect(a + b).toBe(result);
});
});
});
В этом примере создаётся несколько тестов, каждый из которых проверяет сложение двух чисел.
Для тестирования асинхронного кода в Jest необходимо использовать
async/await или методы, возвращающие промисы.
describe и test также поддерживают асинхронные
тесты, что позволяет удобно работать с асинхронным кодом.
Пример асинхронного теста:
describe('Асинхронные операции', () => {
test('Проверка загрузки данных', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
});
Здесь используется асинхронная функция для загрузки данных, и
await гарантирует, что тест будет выполнен только после
завершения операции.
Jest автоматически выполняет тесты параллельно для повышения
производительности. Однако иногда необходимо обеспечить последовательное
выполнение некоторых групп тестов, например, когда тесты зависят друг от
друга. В таких случаях можно использовать --runInBand,
чтобы запускать тесты последовательно.
jest --runInBand
Этот параметр позволяет выполнить тесты поочередно, что может быть полезно в некоторых сценариях, но при этом замедлит общий процесс тестирования.
Группировка тестов в Jest помогает организовать тесты, делает код
более структурированным и легко масштабируемым. Используя функции
describe, beforeAll, afterEach, а
также возможности фильтрации и динамического создания тестов, можно
создавать гибкие и удобные тестовые наборы. Это позволяет эффективно
работать как с простыми, так и с более сложными проектами, обеспечивая
высокое качество тестирования на всех этапах разработки.