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

Ответ

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).

Ответ 18+ 🔞

Боже, ну вот объясняешь людям элементарные вещи, а они всё равно путаются, как будто в первый раз слышат. Ладно, слушай сюда, сейчас разложу по полочкам, чтобы даже мартышлюшка поняла.

Вот есть у тебя Before All и Before Each. Разница проще некуда, но её постоянно ебут с ногами. Всё упирается в то, когда и сколько раз эта штука выполняется.

  • Before All (он же setUpClass) — это как дорогая и медленная подготовка. Выполняется ОДИН РАЗ НАХЕР перед тем, как запустятся ВСЕ твои тесты в этом наборе. Один раз и всё. Представь, что ты запускаешь сто тестов — этот хук отработает один-единственный раз в самом начале.
  • Before Each (он же setUp) — это уже ежедневная рутина. Он выполняется ПЕРЕД КАЖДЫМ, блядь, ОТДЕЛЬНЫМ ТЕСТОМ. Запускаешь сто тестов — он отработает сто раз, перед каждым. Чистка, сброс, подготовка — его вотчина.

Смотри на примере, тут всё станет ясно. Представь, что мы тестируем что-то с базой данных.

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

beforeAll(async () => {
  // ЭТО ВЫПОЛНИТСЯ 1 РАЗ для всего файла. ОВЕРДОХУИЩА важная операция.
  console.log('Устанавливаю соединение с тестовой БД');
  global.databaseConnection = await connectToTestDB(); // Подключились и всё
});

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

test('Добавление пользователя', () => {
  // Заходим сюда: соединение с БД УЖЕ ЕСТЬ (спасибо beforeAll), таблица УЖЕ ОЧИЩЕНА (спасибо beforeEach).
  global.databaseConnection.insertUser({name: 'Alice'});
});

test('Поиск пользователя', () => {
  // Заходим сюда: соединение ВСЁ ЕЩЁ ЕСТЬ (оно одно на всех), но таблица СНОВА ОЧИЩЕНА (beforeEach отработал заново).
  const users = global.databaseConnection.findUsers();
  expect(users).toEqual([]); // И мы уверены, что тут пусто, а не лежит Alice из прошлого теста
});

Так когда что юзать в автоматизации?

  • Before All: Это для тяжёлой артиллерии. Всё, что делается долго, дорого и не должно меняться между тестами. Например: подключиться к удалённой базе, запустить какой-нибудь Selenium Grid или Docker-контейнер с приложением, развернуть целый тестовый стенд. Сделал один раз в начале — и все тесты этим пользуются. Экономия времени — просто пиздец.
  • Before Each: Это для гигиены и изоляции. Его задача — гарантировать, что каждый тест начинается с чистого листа. Очистить базу от данных прошлого теста, сбросить кэш браузера, создать новый экземпляр драйвера или Page Object. Чтобы тесты были независимыми и не ебали друг другу мозг своими остаточными данными. Если этого не делать — потом будешь охуевать, почему тест то проходит, то нет.

Короче, запомни: Before All — один раз для всех, для глобальной подготовки. Before Each — каждый раз для одного, для локальной чистки. Всё, вопрос закрыт, можно идти пить чай.