Ответ
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 — каждый раз для одного, для локальной чистки. Всё, вопрос закрыт, можно идти пить чай.