Для уточнения ответа Алистера (с чем я согласен)
Да, это очень полезно, оно дает вам одно место (ну, по одному на страницу), чтобы определить, как идентифицировать и выполнять общие взаимодействия с объектами, присутствующими на этой странице. Таким образом, если что-то изменится, вам нужно изменить свои сценарии только в одном месте. Вы не помещаете свои тесты в объект страницы, а скорее определяете элементы страницы и общие методы, которые вы можете использовать на этой странице. Затем ваши тесты ссылаются на эти вещи через объект страницы.
Когда речь идет о динамическом контенте, я бы в основном оставил его для деталей шага, а не пытался вставить его в объект страницы. Вместо этого используйте объект страницы для определения таких вещей, как внешние контейнеры для динамического содержимого, на которое будут ссылаться из нескольких шагов в ваших сценариях.
Хорошим примером этого может быть ваша страница управления пользователями. Предположим на мгновение страницу, где пользователи перечислены в таблице с постоянным идентификатором, а внутри этой таблицы есть строки с информацией о пользователе, один элемент из которых - это связанное имя пользователя, по которому вы хотите щелкнуть. Несмотря на то, что идентификатор таблицы является постоянным, содержимое таблицы не может быть предсказано, мы не знаем, сколько пользователей может быть там одновременно, и не можем предсказать, в какой строке будет указан данный пользователь.
В этом случае я хотел бы использовать объект страницы для создания быстрой ссылки на этот элемент страницы. Тогда, если вы кодируете шаг, такой как « Учитывая, что я просматриваю детали для пользователя: имя пользователя со страницы« Управление пользователями »», вы можете получить код, который выглядел примерно так (при использовании watir или watir-webdriver)
Given /^I view details for user: (.*) from the Manage Users page$/ do |user|
manageUsersPage.userlist.link(:text, user).click
end
username, таким образом, передается в шаг как параметр 'user', поэтому я могу вызывать этот шаг несколько раз из разных мест в моих сценариях, где любой пользователь вместо имени пользователя может использовать любой шаг.
У меня может быть много других шагов, которые ссылаются на ту же таблицу и выполняют там операции или проверки содержимого. Если разработчики меняют идентификатор таблицы или изменяют страницу каким-либо образом, что нарушает работу, мне нужно только обновить объект страницы и изменить способ определения элемента userlist, а также все этапы, которые зависят от него, должны продолжать функционировать.
Теперь давайте скажем, что позже произойдет изменение структуры таблицы, возможно, будет отменена привязка имени пользователя и вместо этого добавлены некоторые другие стандартные значки для таких функций, как детали, редактирование, удаление. Так что теперь старый шаг сломан, и чтобы исправить его, мы могли бы изменить что-то вроде этого
Given /^I view details for user: (.*) from the Manage Users page$/ do |user|
manageUsersPage.userlist.cell(:text, username).parent.link(:class, 'view_user_details').click
end
Обратите внимание, что поскольку мой шаг описывал то, что я хотел выполнить, а не детали того, как, мне не нужно переписывать шаг, чтобы он продолжал иметь смысл в моих сценариях. Вместо этого я просто изменяю код за шагом, чтобы отразить новый способ выполнить эту задачу. Любые сценарии, которые зависели от этого шага как часть других тестов, могут продолжать использовать этот шаг как есть.
Теперь, если бы у вас была единственная часть сценариев, в которой подробно описывалось, как вы просматриваете пользовательские данные, ее нужно было бы удалить и обновить, чтобы отразить новое поведение ... хорошо, хорошо, мы ожидаем, что, поскольку этот конкретный аспект вещей изменилось, поэтому оно должно быть обновлено. Но ключевой момент здесь заключается в том, чтобы экономно использовать только очень подробные шаги там, где они необходимы для описания подробного функционирования функции. В остальных тестах используйте шаг более высокого уровня, который просто описывает, что вы делаете, а не КАК вы это делаете.
Извините, возможно, вырыли немного слишком глубоко в "как сделать bdd", но я хочу выразить, что вы не делаете всю свою абстракцию только через объекты страницы. Это очень важная часть вещей, но ИМХО не полное решение для эффективной структуры.