Принципы DRY

DRY (Don’t Repeat Yourself) минимизирует дублирование кода и знаний в тестовом проекте. В контексте Protractor это снижает стоимость сопровождения, уменьшает вероятность расхождений тестовой логики и помогает соблюсти единообразие при работе с асинхронными операциями и локаторами.

Структурирование проектных сущностей

Page Object Pattern служит базой для соблюдения DRY. Локаторы, методы взаимодействия и тестовые операции располагаются в отдельных объектах страниц, что исключает повторное объявление селекторов:

  • Избежание копирования CSS/XPath локаторов.
  • Централизованное изменение элементов интерфейса.
  • Унификация именования и семантики действий.

При использовании Protractor важно учитывать специфику element и by, а также работу ExpectedConditions для явных ожиданий. Правильное размещение ожиданий в Page Objects упрощает управление синхронизацией.

Повторяемые шаги и тестовые сценарии

Одни и те же шаги встречаются во множестве утилитарных сценариев: авторизация, переход между страницами, заполнение форм, ожидания обновления DOM. Вынесение этих шагов в helper-модули устраняет расхождение в реализации логики переходов и проверок, особенно при сложной навигации или условных шагах.

Для Protractor характерна работа с промисами и цепочками действий. Унифицированные хелперы обеспечивают единое поведение при обработке исключений, логировании и повторных попытках.

Унификация локаторов и ожиданий

Выделение локаторных фабрик позволяет хранить правила поиска элементов в одном месте: динамические селекторы, параметризованные атрибуты, комбинации by.css и by.xpath. Это особенно полезно при тестировании крупных SPA-приложений, где интерфейс часто изменяется.

Аналогичная практика применима к ожиданиям (waits). Вынесенные функции ожиданий гарантируют корректное использование browser.wait и ExpectedConditions и ограничивают применение слишком агрессивных таймаутов или запрещают неявные sleep.

Конфигурация и тестовые данные

DRY распространяется не только на код тестов, но и на конфигурацию и данные:

  • Конфигурационные параметры Protractor (baseUrl, capabilities, framework, suites) вынесены в общий config.
  • Тестовые данные и учетные записи сгруппированы в отдельные модули или хранилища, исключая их дублирование в спецификациях.
  • Параметризация окружений реализуется через флаги запуска и внешние файлы, что предотвращает расхождения между стендами.

Утилиты для работы со временем и асинхронностью

Повторяющиеся операции, завязанные на время (timeouts, ожидания, ретраи), переносятся в time utilities. В Protractor подобные операции особенно критичны, поскольку неправильные задержки приводят к нестабильным тестам. Единый модуль управляет:

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

Повторяемые проверки и утверждения

DRY проявляется в утверждениях: часто проверяются одинаковые шаблоны состояний, например наличие уведомлений, состояние модальных окон или валидность формы. Создание assertion-модулей снижает риск расхождения в тексте сообщений или типах сравнения и обеспечивает консистентность тестовой отчетности.

Логирование и обработка ошибок

Логирование браузерных событий, ошибок, коллстеков и скриншотов оформляется в единый logging layer. Это исключает дублирование кода по снятию скриншотов, записи логов и вложению артефактов в отчетность. Для Protractor также актуально единое управление browser.manage().logs() и сетевыми логами при интеграции с отчетчиками.

Интеграция с отчетностью и CI

Использование DRY в отчётности проявляется в создании общих модулей для:

  • генерации HTML-отчетов,
  • передачи артефактов в CI,
  • агрегации результатов после завершения тестовой сессии.

Это устраняет дублирование скриптов и конфигураций для разных пайплайнов и веток.

Эффект компоновки

Соблюдение DRY приводит к компоновочному эффекту: тесты сводятся к декларативной записи сценариев, а логика взаимодействия, проверок и ожиданий переносится в единые уровни абстракций. В Protractor это особенно заметно при работе с Angular-приложениями, где синхронизация и маршрутизация требуют аккуратной обработки.

Минимизация дублирования знаний

DRY касается не только кода, но и знаний: проект содержит одно место для определения классов ошибок, правил ожидания, настроек локаторов, тестовых данных и общих флоу. Добавление или изменение знания производится единожды и распространяется по всей системе, что уменьшает стоимость сопровождения и снижает когнитивную нагрузку при развитии автоматизации.