Разделение на суиты и спеки

Protractor — это инструмент для end-to-end тестирования Angular и AngularJS приложений на JavaScript, построенный поверх WebDriverJS. Одной из ключевых практик организации тестов является правильное разделение на суеты (suites) и спеки (specs), что обеспечивает структурированность, масштабируемость и удобство поддержки кода.


Суиты (Suites)

Суита представляет собой логическую группу тестов, объединённых общей целью или функциональной областью. В Protractor используется структура describe, которая позволяет задавать название суиты и объединять внутри неё несколько спецификаций.

describe('Авторизация пользователя', () => {
    it('Должна открываться страница логина', () => {
        browser.get('/login');
        expect(browser.getTitle()).toEqual('Login Page');
    });

    it('Должен происходить успешный вход', () => {
        element(by.id('username')).sendKeys('admin');
        element(by.id('password')).sendKeys('password');
        element(by.buttonText('Login')).click();
        expect(browser.getCurrentUrl()).toContain('/dashboard');
    });
});

Ключевые моменты о суитах:

  • Суита задаётся функцией describe('Название суиты', function() {...}).
  • Внутри суиты можно создавать произвольное количество спека.
  • Суита может содержать вложенные суиты для дополнительной иерархии.
  • Суиты позволяют запускать тесты частями, что удобно при большом проекте или при необходимости параллельного тестирования.

Спеки (Specs)

Спек — это отдельный тестовый сценарий, проверяющий конкретное поведение приложения. В Protractor спек создаётся через функцию it, которая принимает описание теста и функцию с шагами выполнения.

it('Должна отображаться форма регистрации', () => {
    browser.get('/register');
    expect(element(by.css('form#registerForm')).isPresent()).toBe(true);
});

Особенности спецификаций:

  • Каждый it должен быть самодостаточным: выполнять проверку одной функциональности.
  • Спеки выполняются последовательно внутри суиты, если не указано иное (например, через параллельный запуск с использованием фреймворков, поддерживающих это).
  • Для сложных сценариев рекомендуется разбивать тест на несколько спека вместо создания одного длинного теста.

Вложенные суиты

Protractor поддерживает вложенные суиты, что позволяет строить иерархию тестов:

describe('Панель администратора', () => {
    describe('Управление пользователями', () => {
        it('Должен отображать список пользователей', () => {
            browser.get('/admin/users');
            expect(element.all(by.css('.user-row')).count()).toBeGreaterThan(0);
        });

        it('Должен добавлять нового пользователя', () => {
            element(by.buttonText('Add User')).click();
            element(by.id('username')).sendKeys('newUser');
            element(by.id('submit')).click();
            expect(element.all(by.css('.user-row')).last().getText()).toContain('newUser');
        });
    });

    describe('Настройки системы', () => {
        it('Должны сохраняться изменения конфигурации', () => {
            browser.get('/admin/settings');
            element(by.id('enableFeature')).click();
            element(by.buttonText('Save')).click();
            expect(element(by.id('enableFeature')).isSelected()).toBe(true);
        });
    });
});

Вложенные суиты позволяют:

  • Разделять функциональные области внутри одного модуля.
  • Повторно использовать код и конфигурации beforeEach и afterEach.
  • Логически группировать тесты для генерации понятных отчётов.

Организация файлов

Для больших проектов разделение на файлы также важно:

  • Каждая суита может находиться в отдельном файле *.spec.js.
  • Файлы можно структурировать по функциональным модулям (auth.spec.js, dashboard.spec.js и т. д.).
  • Protractor конфигурация (protractor.conf.js) поддерживает указание суитов через suites:
exports.config = {
    framework: 'jasmine',
    specs: [],
    suites: {
        login: 'specs/login/*.spec.js',
        admin: 'specs/admin/*.spec.js',
        all: 'specs/**/*.spec.js'
    },
    directConnect: true,
    capabilities: {
        browserName: 'chrome'
    }
};

С помощью suites можно запускать отдельные группы тестов командой:

protractor protractor.conf.js --suite login

Использование beforeEach и afterEach для суит

Для подготовки окружения и очистки состояния используется структура хуков Jasmine:

describe('Форма обратной связи', () => {
    beforeEach(() => {
        browser.get('/feedback');
    });

    afterEach(() => {
        browser.manage().deleteAllCookies();
    });

    it('Должна отправлять сообщение', () => {
        element(by.id('message')).sendKeys('Тестовое сообщение');
        element(by.buttonText('Send')).click();
        expect(element(by.css('.success')).isPresent()).toBe(true);
    });
});
  • beforeEach выполняется перед каждым it внутри текущей суиты.
  • afterEach выполняется после каждого it.
  • Вложенные суиты могут наследовать хуки внешних уровней, что упрощает настройку окружения.

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

  1. Малые спеки лучше, чем большие: каждый it должен проверять один сценарий.
  2. Иерархия suita → spec обеспечивает логичную структуру тестов и удобные отчёты.
  3. Конфигурация suites в protractor.conf.js облегчает запуск отдельных модулей и параллельное тестирование.
  4. Повторно используемые действия лучше выносить в функции или Page Objects, чтобы суиты оставались чистыми и понятными.
  5. Вложенные suita помогают разделять функциональные блоки и улучшать читаемость тестов.

Хотите, я могу отдельно составить подробную схему оптимальной структуры больших проектов Protractor с разделением на суиты и спеки, чтобы наглядно показать, как организовать сотни тестов?