Jasmine интеграция

Для интеграции Jasmine с WebdriverIO необходимо корректно настроить окружение проекта. Основными шагами являются установка необходимых пакетов и конфигурация тестового раннера.

npm install @wdio/cli @wdio/local-runner @wdio/jasmine-framework webdriverio --save-dev

После установки пакетов выполняется генерация конфигурационного файла WebdriverIO:

npx wdio config

В процессе генерации конфигурации следует выбрать:

  • Test framework → Jasmine
  • Reporters → по необходимости (например, spec)
  • Serviceschromedriver или другой используемый драйвер

В результате конфигурационный файл wdio.conf.js содержит ключевые настройки для работы с Jasmine:

exports.config = {
    framework: 'jasmine',
    specs: ['./test/specs/**/*.js'],
    jasmineNodeOpts: {
        defaultTimeoutInterval: 60000
    }
};

jasmineNodeOpts позволяет задавать таймауты, прерывания при ошибках и другие параметры Jasmine.


Структура тестов и синтаксис Jasmine

Jasmine использует ключевые функции describe, it, beforeEach, afterEach для организации тестов:

  • describe — группировка тестов по функциональности.
  • it — отдельный тест-кейс.
  • beforeEach / afterEach — подготовка и очистка состояния перед и после тестов.

Пример базового теста:

describe('Главная страница', () => {
    beforeEach(() => {
        browser.url('https://example.com');
    });

    it('должна отображать заголовок', () => {
        const title = $('h1').getText();
        expect(title).toBe('Example Domain');
    });

    afterEach(() => {
        browser.reloadSession();
    });
});

Важный момент — WebdriverIO использует синхронный режим при Jasmine, что позволяет писать тесты в привычном стиле без явного использования async/await.


Ассерты и проверки

Jasmine предоставляет мощный набор матчеров для проверки значений:

  • toBe — строгая проверка равенства.
  • toEqual — глубокое сравнение объектов.
  • toContain — проверка наличия подстроки или элемента в массиве.
  • toBeDefined, toBeUndefined — проверка существования значения.
  • toBeTruthy, toBeFalsy — логические проверки.

С WebdriverIO часто комбинируют с ожиданиями элементов:

it('кнопка должна быть видимой', () => {
    const button = $('#submit');
    expect(button).toBeDisplayed();
    expect(button.isEnabled()).toBe(true);
});

Методы WebdriverIO, такие как isDisplayed(), getText(), getAttribute(), интегрируются с Jasmine матчерами, что позволяет строить читабельные и мощные проверки.


Организация тестов и хук beforeAll

Для подготовки состояния перед выполнением всех тестов удобно использовать beforeAll:

describe('Авторизация', () => {
    beforeAll(() => {
        browser.url('https://example.com/login');
    });

    it('должен авторизоваться с корректными данными', () => {
        $('#username').setValue('user');
        $('#password').setValue('pass');
        $('#login').click();
        expect($('#welcome').getText()).toContain('Добро пожаловать');
    });
});

Хуки beforeAll и afterAll выполняются один раз для всей группы тестов, что экономит ресурсы при инициализации состояния.


Параметризованные тесты

Jasmine поддерживает динамическое создание тестов с помощью циклов или forEach:

const users = [
    { username: 'user1', password: 'pass1' },
    { username: 'user2', password: 'pass2' }
];

describe('Проверка авторизации разных пользователей', () => {
    users.forEach(({ username, password }) => {
        it(`должен войти как ${username}`, () => {
            browser.url('/login');
            $('#username').setValue(username);
            $('#password').setValue(password);
            $('#login').click();
            expect($('#welcome').getText()).toContain('Добро пожаловать');
        });
    });
});

Это позволяет минимизировать дублирование кода и поддерживать набор тестовых данных централизованно.


Асинхронные операции и ожидания

Хотя WebdriverIO в синхронном режиме скрывает промисы, иногда используются ожидания:

it('элемент должен появиться на странице', () => {
    const alert = $('#alert');
    alert.waitForDisplayed({ timeout: 5000 });
    expect(alert.getText()).toBe('Успешно!');
});

Метод waitForDisplayed гарантирует, что тест не завершится раньше, чем элемент станет видимым. Также доступны waitForEnabled, waitForExist, waitUntil для более сложных условий.


Интеграция с репортерами и CI/CD

Jasmine легко интегрируется с WebdriverIO репортерами, например spec или allure:

reporters: ['spec', ['allure', { outputDir: 'allure-results' }]],

Это позволяет собирать детальные отчеты о выполнении тестов, включая скриншоты и шаги. В CI/CD пайплайнах достаточно запустить:

npx wdio run wdio.conf.js

для автоматического прогонки тестов и генерации отчетов.


Работа с тегами и фильтрацией тестов

Jasmine позволяет добавлять кастомные теги через фильтры или методы fdescribe, fit для фокусировки на отдельных тестах:

fdescribe('Фокус на авторизации', () => {
    it('должен войти с корректными данными', () => {
        browser.url('/login');
        $('#username').setValue('admin');
        $('#password').setValue('admin');
        $('#login').click();
        expect($('#welcome').getText()).toBe('Добро пожаловать, admin');
    });
});

fdescribe запускает только эту группу тестов, что удобно при отладке большого набора проверок.


Настройка таймаутов и стабильность тестов

Jasmine позволяет гибко управлять таймаутами на уровне отдельных тестов:

it('долгий тест', () => {
    browser.url('/slow-page');
    const element = $('#slow');
    element.waitForDisplayed({ timeout: 10000 });
}, 15000);

Параметр после функции задает индивидуальный таймаут. Совмещение с WebdriverIO ожиданиями повышает стабильность тестов на медленных страницах.


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