Глобальные фикстуры

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

Что такое глобальные фикстуры?

Глобальные фикстуры — это функции, которые выполняются один раз перед запуском всех тестов или после их завершения. В отличие от локальных фикстур, которые ограничиваются конкретными тестами или сьютами, глобальные фикстуры применяются ко всему набору тестов. В Mocha для этого используются функции before() и after(), а также их асинхронные аналоги — beforeEach() и afterEach().

  • before() — выполняется один раз перед всеми тестами в файле.
  • after() — выполняется один раз после всех тестов в файле.
  • beforeEach() — выполняется перед каждым тестом.
  • afterEach() — выполняется после каждого теста.

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

Пример использования глобальных фикстур

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

const { expect } = require('chai');
const mongoose = require('mongoose');
const dbURI = 'mongodb://localhost/test_database';

before(function() {
  // Подключение к базе данных перед всеми тестами
  return mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true });
});

after(function() {
  // Отключение от базы данных после всех тестов
  return mongoose.disconnect();
});

describe('Тесты с базой данных', function() {
  it('должен добавлять пользователя в базу данных', async function() {
    const user = new User({ name: 'John Doe', age: 30 });
    await user.save();
    const foundUser = await User.findOne({ name: 'John Doe' });
    expect(foundUser).to.not.be.null;
  });
});

В этом примере фикстуры before() и after() используются для подключения и отключения от базы данных до и после выполнения всех тестов.

Глобальные фикстуры с асинхронным выполнением

Mocha позволяет работать с асинхронными операциями в фикстурах. Для этого используется поддержка промисов или async/await. При асинхронном выполнении Mocha будет ожидать завершения операции, прежде чем переходить к выполнению тестов.

before(async function() {
  await mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true });
});

after(async function() {
  await mongoose.disconnect();
});

В случае асинхронных операций Mocha ожидает, пока промис не будет выполнен, прежде чем продолжить выполнение тестов. Это дает возможность удобно работать с внешними ресурсами, такими как базы данных или API.

Применение глобальных фикстур с несколькими тестовыми сьютами

В случае, когда один тестовый файл включает несколько сьютов (групп тестов), глобальные фикстуры будут выполняться только один раз для всего файла. Если нужно выполнить подготовку и очистку на уровне каждого сьюта, следует использовать локальные фикстуры.

before(function() {
  // Выполняется один раз для всех тестов в файле
  console.log('Подготовка перед всеми тестами');
});

describe('Тесты с пользователями', function() {
  beforeEach(function() {
    // Выполняется перед каждым тестом в этом сьюте
    console.log('Подготовка перед тестом с пользователями');
  });

  it('должен создавать пользователя', function() {
    // тест
  });

  it('должен обновлять пользователя', function() {
    // тест
  });
});

describe('Тесты с заказами', function() {
  beforeEach(function() {
    // Выполняется перед каждым тестом в этом сьюте
    console.log('Подготовка перед тестом с заказами');
  });

  it('должен создавать заказ', function() {
    // тест
  });

  it('должен обновлять заказ', function() {
    // тест
  });
});

В этом примере глобальная фикстура before() выполняется перед всеми тестами, в то время как фикстура beforeEach() выполняется перед каждым тестом в каждом из сьютов.

Управление временем выполнения фикстур

Важно учитывать, что фикстуры могут влиять на общее время выполнения тестов. Если подготовка данных или очистка занимает много времени, это может повлиять на общую производительность тестов. В таких случаях следует внимательно отслеживать, какие фикстуры выполняются и как долго они продолжаются. Mocha предоставляет возможность контролировать тайм-ауты для фикстур, чтобы предотвратить зависание тестов.

before(function(done) {
  this.timeout(5000); // Установить тайм-аут в 5 секунд
  // асинхронная операция
  done();
});

В этом примере устанавливается тайм-аут для фикстуры before(), который позволяет избежать зависания теста в случае долгих операций.

Поддержка фикстур в CI/CD

При запуске тестов в CI/CD системах глобальные фикстуры часто используются для настройки окружений и подключения к удаленным сервисам. Для таких случаев важно удостовериться, что фикстуры работают корректно и не создают лишнюю нагрузку. Например, можно использовать отдельную базу данных для тестов или настроить сервисы для изоляции тестовых данных.

При работе с CI/CD также полезно интегрировать логирование выполнения фикстур, чтобы быстрее находить и устранять проблемы, если тесты не проходят из-за ошибок в подготовке окружения.

Заключение

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