Всем привет!
Предлагаю немного поговорить об архитектуре фреймворков, которыми вы пользуетесь/разрабатываете. Чтобы не говорить обо всем сразу, предлагаю сузить круг до фреймворков, использующих WebDriver, а вопрос - до слоев фреймворка.
Напишите какие слои выделены в вашем фреймворке и почему, с кратким обоснованием?
Начну с себя. Фреймворк, который я разрабатываю, разделен как вертикально - по нескольким проектам, так и горизонтально - по слоям.
Цели разбиения на слои две:
- разделение ответственности
- максимальное переиспользование кода
Выделены следующие слои:
- тесты. Это непосредственно сами тесты, которые используют API, предоставляемый нижележащим сервисным (как я его называю) слоем
- сервисы. Это очень важный слой. Он представляет собой классы, которые предоставляют тестам методы взаимодействия с тестируемым приложением в терминах бизнес-функций. Например, CientService предоставляет методы createClient(), findClientInList() и т.п. То есть тесты не работают (обычно) с отдельными страницами, а используют методы сервисного слоя, который скрывает от теста навигацию между страницами и взаимодействие со страницами. Это позволяет упростить код теста, сделать его keyword-driven, так что тест читается в виде удобном для человека
- страницы. Классы этого слоя - это Page Objects. Каждый класс этого слоя предоставляет средства взаимодействия с элементами страницы. Методы доступны вышележащим слоям: сервисному и тестам. Но тесты без необходимости напрямую со страницами не работают
- элементы страницы. Классы этого слоя предоставляют методы работы с отдельными элементами страниц. Лично у меня не для каждого тестируемого приложения получается сделать этот слой полезным. Если верстка одинаковых элементов интерфейса различна на разных страницах, то пользы от этого слоя не будет.
Использование слоев:
- упрощает разработку тестов за счет переиспользования т.н. бизнес-функций, которые повторяются практически в каждом тесте
- упрощает поддержку тестов. Если меняется верстка страницы или навигация, то изменения достаточно внести в несколько классов сервисного и страничного слоя, а десятки и сотни тестов остаются без изменений и продолжают успешно работать.
Но есть и сложности. Я вот, например, ещё не решил окончательно как быть с failure-тестами, то есть тестами, которые проверяю реакцию системы на невалидные действия. На те же незаполненные обязательные поля. Например, при создании клиента. Я вижу два варианта решения:
- Тест продолжает использовать метод ClientService.createClient(). Тогда из страничного слоя, со страницы создания клиента, при попытке засабмитить форму с незаполненным обязательным полем, должен выбрасываться Exception, который тест должен перехватить и проанализировать на предмет ожидаемой реакции
- Тест использует из сервисного слоя только навигацию до страницы создания клиента. А дальше работает непосредственно со страницей
Интересны такие вопросы:
- Используете ли вы сервисный слой?
- Возможно используете другие принципы разбиения на слои?
- Возможно не используете разбиение на слои вовсе?
- Если используете слои, то как решаете задачу с failure-тестами (как убеждаетесь в правильности реакции системы на тест)