Использование других assertion библиотек

В стандартной конфигурации Protractor тесно интегрирован с Jasmine, которая обеспечивает базовый набор возможностей для написания тестов и проверки результатов. Однако в профессиональной практике часто возникает необходимость использовать более гибкие или функционально насыщенные библиотеки для assertions, такие как Chai, Expect.js или Should.js. Это позволяет создавать более читаемые тесты, использовать расширенные методы проверки и интегрироваться с другими инструментами.

Интеграция Protractor с Chai

Chai предоставляет три основных интерфейса: should, expect и assert. В контексте Protractor чаще используется expect из-за его декларативного синтаксиса и читаемости тестов.

const chai = require('chai');
const expect = chai.expect;

describe('Пример использования Chai с Protractor', () => {
  it('Проверка заголовка страницы', async () => {
    await browser.get('https://example.com');
    const title = await browser.getTitle();
    expect(title).to.equal('Example Domain');
  });
});

Ключевые моменты:

  • Методы expect().to.equal(), expect().to.include() и expect().to.be.true делают тесты более выразительными.
  • Для работы с асинхронными операциями необходимо использовать async/await, так как Protractor взаимодействует с элементами страницы через Promises.

Использование Chai-as-Promised

Для работы с асинхронными результатами Chai предлагает расширение chai-as-promised, которое позволяет проверять промисы напрямую, без явного await.

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
const expect = chai.expect;

it('Проверка текста элемента', () => {
  const elementText = element(by.css('h1')).getText();
  return expect(elementText).to.eventually.equal('Welcome');
});

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

  • Метод eventually ожидает разрешения промиса и автоматически проверяет его результат.
  • Позволяет писать компактные и декларативные тесты для асинхронного взаимодействия с DOM.

Использование библиотеки Should.js

Should.js применяет расширение прототипа объекта и предоставляет цепочные методы проверки. В Protractor она используется вместе с асинхронными функциями:

const should = require('should');

it('Элемент должен быть видимым', async () => {
  const myElement = element(by.id('my-element'));
  const isDisplayed = await myElement.isDisplayed();
  isDisplayed.should.be.true();
});

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

  • Цепочный синтаксис делает проверки максимально читаемыми.
  • Подходит для случаев, когда требуется проверка сложных условий или нескольких характеристик элемента.

Настройка Protractor для использования других assertion библиотек

Чтобы использовать сторонние библиотеки assertions, необходимо изменить конфигурационный файл protractor.conf.js:

exports.config = {
  framework: 'mocha',
  mochaOpts: {
    reporter: 'spec',
    timeout: 30000
  },
  onPrepare: () => {
    const chai = require('chai');
    const chaiAsPromised = require('chai-as-promised');
    chai.use(chaiAsPromised);
    global.expect = chai.expect;
  }
};

Примечания:

  • Переход на Mocha вместо Jasmine часто облегчает интеграцию с Chai.
  • Подключение chai-as-promised в onPrepare позволяет использовать expect().to.eventually во всех тестах без повторного импорта.

Особенности использования assertion библиотек с Protractor

  1. Асинхронность: Любая проверка элемента страницы должна учитывать, что методы Protractor возвращают промисы. Использование async/await или chai-as-promised — обязательное условие корректной работы.
  2. Цепочные проверки: Библиотеки вроде Chai и Should.js позволяют создавать длинные цепочки проверок, что делает тесты более декларативными и уменьшает дублирование кода.
  3. Совместимость с отчетами: Использование Mocha и Chai часто сочетается с расширенными репортерами (mochawesome, allure), что упрощает анализ результатов тестирования.
  4. Гибкость: Сторонние библиотеки assertions позволяют проверять не только значения, но и структуры объектов, массивов, наличие свойств, типы данных и соответствие регулярным выражениям.

Рекомендации по выбору

  • Для простых тестов достаточно Jasmine и встроенного expect.
  • Для сложных сценариев с большим количеством асинхронных проверок лучше использовать Chai с chai-as-promised.
  • Для читабельности и декларативного стиля подойдет Should.js.
  • При использовании сторонних библиотек следует избегать смешивания нескольких фреймворков assertions в одном проекте, чтобы не усложнять поддержку тестов.

Использование альтернативных assertion библиотек расширяет возможности Protractor, делая тесты более гибкими, выразительными и адаптированными под современные требования автоматизированного тестирования.