Структура теста: describe, it и шаблон AAA

Урок учит структурировать тесты: группировать их describe и писать тело по шаблону AAA.

AAA (Arrange-Act-Assert) — шаблон тела теста: сначала подготовь данные, затем выполни действие, затем проверь результат.

Группировка: describe

Когда тестов много, их объединяют в блоки describe — обычно по тестируемой функции или фиче. Это даёт структуру в отчёте и читаемые заголовки.

const { sum } = require('./math');

describe('sum()', () => {
  it('складывает положительные числа', () => {
    expect(sum(2, 3)).toBe(5);
  });

  it('работает с отрицательными', () => {
    expect(sum(-2, -3)).toBe(-5);
  });
});

В отчёте это выглядит как дерево: sum() > складывает положительные числа.

Шаблон AAA

Хорошо читаемый тест разбивается на три фазы:

  1. Arrange — подготовка: создаём входные данные, объекты, состояние.
  2. Act — действие: вызываем то, что тестируем.
  3. Assert — проверка: сравниваем результат с ожиданием.
it('применяет скидку 10%', () => {
  // Arrange
  const price = 200;
  const discount = 0.1;

  // Act
  const result = applyDiscount(price, discount);

  // Assert
  expect(result).toBe(180);
});

Разделение фаз делает тест понятным с первого взгляда: видно, что подаём на вход и что ожидаем на выходе.

Один тест — одна мысль

Старайтесь проверять в одном it одно поведение. Если тест называется «складывает и вычитает», его стоит разбить: тогда при провале сразу понятно, что именно сломалось.

AAA на чистом JavaScript

Покажем структуру AAA живым примером — с крошечным assert и чистой функцией:

function applyDiscount(price, rate) {
  return price - price * rate;
}

function assert(actual, expected, name) {
  const ok = actual === expected;
  console.log((ok ? "\u2713 passed: " : "\u2717 FAILED: ") + name +
    " (получили " + actual + ")");
}

// Arrange
const price = 200;
const rate = 0.1;
// Act
const result = applyDiscount(price, rate);
// Assert
assert(result, 180, "скидка 10% от 200");
assert(applyDiscount(100, 0.25), 75, "скидка 25% от 100");

Вывод:

✓ passed: скидка 10% от 200 (получили 180)
✓ passed: скидка 25% от 100 (получили 75)

Именование

Описание теста должно читаться как утверждение о поведении: «возвращает 0 для пустого массива», «бросает ошибку при отрицательной цене». Плохие имена — «тест 1», «работает».

Итог

  • describe группирует связанные тесты и даёт структуру отчёту.
  • AAA = Arrange (подготовка) → Act (действие) → Assert (проверка).
  • Один тест — одно проверяемое поведение.
  • Имя теста описывает ожидаемое поведение, а не «тест №1».
Проверьте себя
1. Что означают три буквы в шаблоне AAA?
AAsync-Await-Assert
BArrange-Act-Assert (подготовка, действие, проверка)
CAdd-Apply-Approve
DAssert-Assert-Assert
2. Для чего нужен блок describe?
AЧтобы запускать тесты быстрее
BЧтобы группировать связанные тесты и структурировать отчёт
CЧтобы заменить expect
DЧтобы отключать тесты
3. Почему лучше проверять в одном it одно поведение?
AТак тесты занимают меньше места
BПри провале сразу ясно, какое именно поведение сломалось
CJest запрещает несколько expect
DЭто требование eslint
Поддержать проект