В чем разница между хуками `Before All` и `Before Each` в фреймворках для тестирования?

«В чем разница между хуками `Before All` и `Before Each` в фреймворках для тестирования?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Before All (или beforeAll, setUpClass) и Before Each (или beforeEach, setUp) — это хуки для настройки состояния перед выполнением тестов. Их ключевое отличие — в времени и частоте выполнения.

  • Before All выполняется один раз перед всеми тестами в тестовом наборе (suite).
  • Before Each выполняется перед каждым отдельным тестом (test case) в наборе.

Пример на JavaScript (Jest):

delete global.databaseConnection; // Начальное состояние

beforeAll(async () => {
  // Выполнится 1 РАЗ для всего файла
  console.log('Устанавливаю соединение с тестовой БД');
  global.databaseConnection = await connectToTestDB();
});

beforeEach(() => {
  // Выполнится перед КАЖДЫМ тестом (test() / it())
  console.log('Очищаю таблицу пользователей');
  global.databaseConnection.clearTable('users');
});

test('Добавление пользователя', () => {
  // Здесь БД уже подключена и таблица очищена
  global.databaseConnection.insertUser({name: 'Alice'});
});

test('Поиск пользователя', () => {
  // Здесь БД все еще подключена, но таблица снова очищена
  const users = global.databaseConnection.findUsers();
  expect(users).toEqual([]);
});

Когда что использовать в QA-автоматизации:

  • Before All: Для дорогостоящих и медленных операций, результат которых не меняется между тестами (подключение к БД, запуск Selenium Grid, развертывание тестового стенда).
  • Before Each: Для сброса состояния к известной точке, чтобы тесты были изолированными и независимыми (очистка БД, сброс кэша, создание нового экземпляра Page Object).