Мне кажется тут все крутится вокруг идеологии того, что UI тестов должно быть мало.
Это позиция разработчика продуктовой компании, в которой процессы, по всей видимости, несколько отличаются от далеко неидеального аутсорса.
Сейчас работаю над проектом, в котором пишутся и unit, и integration tests для бэкэенда, но UI полностью отделен и живет своей жизнью (JS frameworks) + unt тестов там нет. Помимо всего прочего, используются сервисы, написанные ранее другими командами. Ввиду масштабности и сложности продукта, есть множество сценариев, которые чисто технически очень сложно или вовсе невозможно покрыть на компонентном и интеграционном уровнях. К примеру, smart-cards, MFA, кастомные браузерные плагины / расширения, отдельные десктопные части, взаимодействующие с Web internally и т.п. Так вот в такой ситуации UI тесты - это связующее звено между frontend и backend. Потенциальные проблемы могут быть везде, а основные payment workflows зависят от внешних компонентов, к которым девелоперы никак не смогут получить доступ. И что они будут в итоге покрывать юнит тестами? Весь критический для бизнеса флоу останется непокрытым.
Итого, кол-во тестов у нас немалое + незабываем о кроссбраузерности (достаточно болезненный момент ввиду наличия независимого JS фронтэнда, в котором постоянно что-то меняется).
Вся эта лирика о том, что без page objects мой автомейшен проект давно превратился бы в такую кашу, на саппорт которой у меня не хватило бы сил, терпения и желания.
Тут прозвучало много различных определений и назначений page objects. Но давайте рассмотрим вопрос на более высоком уровне. Мы тестируем продукт определенной отрасли. Мы каждый день внутри команды общаемся посредством DSL (domain specific language). Мы создаем backend / UI код, называя методы / компоненты на языке домена… А UI тесты мы пишем на каком уровне? Не unit, не integration, а system (sys integration) / acceptance. Т.е. взаимодействуем с системой мы как? На уровне внешней вэб-оболочки. Внешняя оболочка представлена в виде набора из N страниц, логически объединенных между собой, и отражающих суть нашего бизнеса. Т.е. любая бизнес-операция может быть представлена в виде цепочки действий. Причем, каждое звено этой цепи логически ограничивает нас в путях возможного развития сценария. К примеру, мы не можем отправить платеж, без подтверждения заинтересованными лицами, т.е. функционал сайта не позволит нам осуществить send, минуя approve.
PageObject паттерн прежде всего призывает нас соблюдать бизнес модель нашего приложения: DSL именование, логическое компонентное разделение, строгое ограничение по контексту (невозможность использования логически неверных шагов) и т.п. Тем самым, мы защищаем себя от логических ошибок, посредством тестов общаемся с приложением на языке самого приложения, минимизируем объем рефакторинга в случае изменения бизнес логики / layout’а, соблюдаем UI структуру компонентов, снижаем порог вхождения для новых членов команды и т.п.
В общем, это совсем не призыв бездумного использования сего паттерна всегда и везде. Просто мне кажется, что на данный момент больший процент автоматизации задействован именно в аутсорсе, где идеальных процессов по факту почти нет. Плюс, не стоит забывать о множестве дополнительных факторов, которые так или иначе усложняют нам жизнь. Выбор архитектуры / инструментов / технологий / паттернов - достаточно сложный и кропотливый процесс, который, как говорится, depends on… Используйте то, что действительно обосновано в вашем конкретном случае, но при этом, не забывайте о сути и назначении паттернов. 