describe() блоки

В Protractor, как и в Jasmine, основным инструментом для структурирования тестов являются блоки describe(). Они позволяют логически объединять тестовые сценарии, облегчая организацию, чтение и поддержку тестового кода.

Основная структура describe()

Синтаксис блока выглядит следующим образом:

describe('Описание тестового набора', function() {
    it('Описание конкретного теста', function() {
        // Тестовые действия и проверки
    });
});
  • Первый аргумент — строка с описанием набора тестов. Эта строка используется для логирования и отчетности.
  • Второй аргумент — функция, внутри которой определяются отдельные тесты (it) или вложенные describe.

Вложенные describe()

describe блоки могут быть вложенными, что позволяет создавать многоуровневую иерархию тестов.

describe('Страница логина', function() {
    describe('Форма авторизации', function() {
        it('Должна успешно авторизовывать пользователя', function() {
            // тест
        });

        it('Должна показывать ошибку при неверном пароле', function() {
            // тест
        });
    });

    describe('Ссылки на регистрацию', function() {
        it('Переход к форме регистрации работает корректно', function() {
            // тест
        });
    });
});

Преимущества вложенности:

  • Логическая группировка тестов по функционалу.
  • Возможность переиспользования beforeEach и afterEach внутри конкретного блока.
  • Читаемость отчетов, где структура тестов отражает реальную структуру приложения.

Использование beforeAll, beforeEach, afterEach, afterAll

Внутри describe блоков можно использовать хуки для подготовки и очистки окружения.

describe('Главная страница', function() {
    beforeAll(function() {
        browser.get('https://example.com');
    });

    beforeEach(function() {
        browser.manage().deleteAllCookies();
    });

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

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

    it('Проверка заголовка страницы', function() {
        expect(browser.getTitle()).toEqual('Example Domain');
    });
});

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

  • beforeAll и afterAll выполняются один раз для всего describe блока.
  • beforeEach и afterEach выполняются перед каждым тестом и после него соответственно.
  • Хуки работают также для вложенных describe, при этом их область действия ограничена блоком, в котором они объявлены.

Логирование и отчеты

describe блоки формируют структуру тестового отчета. Например, при использовании Protractor + Jasmine вывод в консоль будет иметь вид:

Главная страница
  Проверка заголовка страницы
Форма логина
  Должна успешно авторизовывать пользователя
  Должна показывать ошибку при неверном пароле

Вложенные блоки автоматически создают иерархию в отчетах, что облегчает анализ результатов тестирования.

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

  1. Группировка по страницам или компонентам: каждый блок describe должен описывать отдельный функциональный модуль.
  2. Ограничение глубины вложенности: избегать более 3–4 уровней вложенности для поддерживаемости кода.
  3. Использование хуков внутри нужного уровня: не помещать глобальные настройки в слишком узкие describe, чтобы они выполнялись для всех тестов.
  4. Четкие и информативные описания: строки в describe и it должны точно отражать тестируемое поведение.

Взаимодействие с асинхронными операциями

В Protractor часто используются промисы и async/await. В блоках describe можно определять тесты с асинхронным поведением:

describe('Асинхронная форма', function() {
    it('Должна корректно отправлять данные', async function() {
        await element(by.id('input')).sendKeys('test');
        await element(by.id('submit')).click();
        const message = await element(by.id('success')).getText();
        expect(message).toEqual('Данные отправлены');
    });
});

Асинхронные тесты корректно интегрируются в структуру describe, сохраняя последовательность выполнения и логирование.

Итоговая структура

Эффективное использование describe блоков превращает тесты в читаемую, поддерживаемую и логически структурированную документацию по функционалу приложения. Каждый блок становится мини-сценарием, а вложенные блоки позволяют детализировать проверки до уровня отдельных компонентов или пользовательских сценариев.