beforeAll() и afterAll()

В Protractor beforeAll() и afterAll() являются встроенными хуками тестового фреймворка Jasmine, который используется для организации тестов. Эти функции позволяют выполнять определённый код один раз перед всеми тестами в блоке describe и один раз после всех тестов, что особенно полезно для настройки и очистки состояния тестовой среды.


beforeAll()

beforeAll() запускается один раз перед всеми it() в текущем блоке describe. Основное назначение — подготовка окружения, выполнение действий, которые повторно использоваться в нескольких тестах.

Синтаксис:

beforeAll(function() {
    // код, который выполняется перед всеми тестами
});

Пример использования:

describe('Авторизация пользователя', function() {

    beforeAll(async function() {
        await browser.get('https://example.com/login');
        await element(by.id('username')).sendKeys('testuser');
        await element(by.id('password')).sendKeys('password123');
        await element(by.id('loginButton')).click();
    });

    it('должен отображать имя пользователя в шапке', async function() {
        const username = await element(by.id('userHeader')).getText();
        expect(username).toBe('testuser');
    });

    it('должен позволять перейти на страницу профиля', async function() {
        await element(by.id('profileLink')).click();
        const url = await browser.getCurrentUrl();
        expect(url).toContain('/profile');
    });

});

В этом примере beforeAll() выполняет логин один раз, а не перед каждым тестом. Это экономит время и делает тесты более быстрыми и стабильными.

Особенности:

  • Если beforeAll() содержит асинхронные операции, обязательно использовать async/await или возвращать промис.
  • Ошибка внутри beforeAll() остановит выполнение всех тестов в блоке describe.

afterAll()

afterAll() запускается один раз после завершения всех тестов в блоке describe. Используется для очистки состояния, выхода из системы, закрытия соединений, удаления временных данных.

Синтаксис:

afterAll(function() {
    // код, который выполняется после всех тестов
});

Пример использования:

describe('Работа с корзиной покупок', function() {

    beforeAll(async function() {
        await browser.get('https://example.com/shop');
        await element(by.id('addItemButton')).click();
    });

    it('должен отображать один товар в корзине', async function() {
        const items = await element.all(by.css('.cart-item'));
        expect(items.length).toBe(1);
    });

    afterAll(async function() {
        await element(by.id('clearCartButton')).click();
    });

});

В данном примере afterAll() очищает корзину один раз после выполнения всех тестов, что предотвращает накопление данных и обеспечивает стабильность последующих проверок.

Особенности:

  • Если afterAll() не выполнится корректно, это может повлиять на состояние приложения для последующих тестов.
  • Асинхронные операции требуют async/await или возврата промиса, иначе очистка может не завершиться до следующего теста.

Различия с beforeEach() и afterEach()

Хук Выполняется Пример использования
beforeAll() один раз перед всеми тестами блока describe Логин пользователя один раз для всех тестов
afterAll() один раз после всех тестов блока describe Очистка корзины, выход из системы
beforeEach() перед каждым тестом it() Переход на начальную страницу перед каждым тестом
afterEach() после каждого теста it() Сброс данных после каждого теста

Использование beforeAll() и afterAll() снижает количество повторяющихся действий и делает тесты более быстрыми, но требует внимательного подхода к состоянию приложения, чтобы тесты оставались изолированными.


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

  1. Минимизировать код в beforeAll() и afterAll() — использовать только те операции, которые действительно нужны один раз.
  2. Всегда обрабатывать асинхронность через async/await или промисы.
  3. Изолировать тесты: если тесты могут влиять друг на друга, лучше использовать beforeEach()/afterEach() для отдельных операций.
  4. Обрабатывать ошибки внутри хуков, чтобы один сбой не ломал весь набор тестов.

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