Запуск отдельных наборов с fdescribe

Jasmine — это мощный фреймворк для модульного тестирования JavaScript, позволяющий создавать хорошо структурированные и читаемые тесты. Одной из ключевых возможностей Jasmine является возможность фокусироваться на отдельных наборах тестов, игнорируя остальные, с помощью функции fdescribe.


Основы fdescribe

В обычной практике для группировки тестов используется функция describe:

describe('Массив чисел', () => {
  it('должен содержать 3 элемента', () => {
    expect([1, 2, 3].length).toBe(3);
  });

  it('должен содержать число 2', () => {
    expect([1, 2, 3]).toContain(2);
  });
});

Когда проект содержит десятки или сотни тестов, иногда требуется сосредоточиться только на одной группе тестов, игнорируя остальные. Для этого Jasmine предоставляет fdescribe (focused describe):

fdescribe('Массив чисел', () => {
  it('должен содержать 3 элемента', () => {
    expect([1, 2, 3].length).toBe(3);
  });

  it('должен содержать число 2', () => {
    expect([1, 2, 3]).toContain(2);
  });
});

При использовании fdescribe только тесты внутри этой группы будут выполняться, а все остальные describe будут проигнорированы.


Разница между describe и fdescribe

Характеристика describe fdescribe
Выполнение тестов Все тесты внутри всех describe Только тесты внутри fdescribe
Поддержка вложенных наборов Да Да
Влияние на другие тесты Нет Игнорирует все describe, кроме текущего fdescribe

fdescribe удобен для локальной отладки конкретного набора тестов без необходимости запускать весь тестовый набор.


Вложенные fdescribe и комбинации

Можно комбинировать обычные describe и fdescribe. В случае вложенных структур приоритет будет у fdescribe:

describe('Функции массива', () => {
  it('map работает правильно', () => {
    expect([1, 2].map(x => x * 2)).toEqual([2, 4]);
  });

  fdescribe('Методы фильтрации', () => {
    it('filter возвращает только положительные числа', () => {
      expect([-1, 0, 1, 2].filter(x => x > 0)).toEqual([1, 2]);
    });
  });
});

В этом примере выполнится только группа Методы фильтрации, а тест map работает правильно будет проигнорирован. Если несколько fdescribe присутствуют одновременно, Jasmine выполнит все фокусированные группы, игнорируя обычные describe.


Использование с fit и xdescribe

  • fit — аналог it, позволяющий фокусироваться на конкретном тесте внутри группы:
describe('Массив чисел', () => {
  fit('должен содержать число 2', () => {
    expect([1, 2, 3]).toContain(2);
  });

  it('должен содержать 3 элемента', () => {
    expect([1, 2, 3].length).toBe(3);
  });
});

В этом случае выполнится только тест должен содержать число 2.

  • xdescribe — полностью отключает набор тестов:
xdescribe('Старые тесты', () => {
  it('не будет выполняться', () => {
    expect(true).toBe(false);
  });
});

fdescribe и fit можно использовать совместно, но важно помнить, что их не следует оставлять в коде перед коммитом, иначе другие тесты будут игнорироваться.


Практические рекомендации

  1. Отладка и разработка: использовать fdescribe для быстрого запуска конкретного набора тестов.
  2. Очистка перед публикацией: убедиться, что fdescribe заменен на describe, чтобы весь набор тестов выполнялся.
  3. Комбинации с beforeEach и afterEach: все хуки в пределах fdescribe выполняются так же, как в обычном describe.
fdescribe('Работа с объектами', () => {
  let obj;

  beforeEach(() => {
    obj = { a: 1, b: 2 };
  });

  it('должен иметь свойство a', () => {
    expect(obj.a).toBe(1);
  });

  it('должен иметь свойство b', () => {
    expect(obj.b).toBe(2);
  });
});

В этом примере beforeEach выполняется перед каждым тестом внутри fdescribe, обеспечивая корректную изоляцию тестов.


Ограничения и нюансы

  • Наличие fdescribe игнорирует все обычные describe, даже если они находятся в других файлах.
  • При наличии нескольких fdescribe Jasmine выполняет все фокусированные наборы, что может иногда создавать впечатление «неожиданного» поведения.
  • fdescribe не должен использоваться в CI/CD процессах, так как может случайно пропустить важные тесты.

Итоговая структура использования

fdescribe('Основные функции', () => {
  beforeAll(() => console.log('Инициализация перед тестами'));

  beforeEach(() => console.log('Перед каждым тестом'));

  it('проверка функции 1', () => {
    expect(1 + 1).toBe(2);
  });

  it('проверка функции 2', () => {
    expect('abc'.toUpperCase()).toBe('ABC');
  });

  afterEach(() => console.log('После каждого теста'));

  afterAll(() => console.log('Завершение набора тестов'));
});

Эта структура демонстрирует полное использование fdescribe с хуками Jasmine, обеспечивая изоляцию тестов, контроль над их порядком и полную управляемость при отладке.