В 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()
снижает количество повторяющихся действий и делает тесты более быстрыми,
но требует внимательного подхода к состоянию приложения, чтобы тесты
оставались изолированными.
beforeAll() и
afterAll() — использовать только те операции,
которые действительно нужны один раз.async/await или промисы.beforeEach()/afterEach() для отдельных
операций.Использование этих хуков позволяет управлять тестовой средой эффективно и создавать крупные, стабильные наборы тестов с минимальным повторением кода.