Ошибка совпадения определений нескольких шагов в Cucumber

Я недавно начал с Cucumber. Я пытаюсь реализовать Cucumber+Protractor+TypeScript, используя эту ссылку в качестве базовый уровень.

Я пытаюсь следовать этой структуре, C:. | ├───.circleci | ├───.vscode | ├───e2e │ ├───features | | |--sample.feature | | |--sample2.feature | | │ └───steps | | |--pageobject1_step.ts | | |--pageobject2_step.ts | | |--common_step.ts у меня есть простая функция в файлах функций sample и sample2. Однако, когда я пытаюсь запустить тесты, я получаю

 `Given I am on the angular.io site
   Multiple step definitions match:
     /I am on the angular.io site$/ - Yadav\Documents\angular-protractor-cucumber\node_modules\cucumber\src\support_code_library_builder\define_helpers.js:90
     I am on the angular.io site`

Я прочитал эту ссылку, в которой говорится, что это заставляет меня поверить, что это не рекомендуется. Если это так, как я могу использовать возможности Page Objects и, что более важно, решить проблему определения нескольких шагов?

Воспроизводимый пример находится здесь, в этом GIT.


person demouser123    schedule 10.10.2017    source источник
comment
Вы можете сделать step_definitons независимым от объекта страницы. Просто создайте шаг, который имеет логику загрузки определенного веб-сайта и объекта страницы в переменную this.currentPage, чтобы вы могли использовать любой объект страницы на любом этапе, не дублируя его. Посмотрите здесь пример фреймворка на основе транспортира. thesoftwarehouse.github.io/Kakunin без typeScript, но, может быть, вы поймете,   -  person Hikaryu    schedule 10.10.2017


Ответы (1)


Неоднозначная ошибка возникает, когда 2 шага используют одно и то же регулярное выражение/строку в своем определении шага, так как бегун должен решить, какой из них использовать.

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

См. мой ответ на вопрос "Как лучше всего организовать файлы функций?", чтобы увидеть, как я организую свои проекты.

В псевдокоде (реализация Ruby) я приведу пример.

Пример

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

urls = Project.urls # Class with url method that returns a map, where pages are the keys and urls are the values

Given 'I navigate to the {string} page' do | page |
    driver.navigate.to(urls[page.downcase])
end

Это будет означать, что в файле функций вы сможете сделать это:

Given I navigate to the "Home" page

Это делает шаг динамичным, легко повторно используемым и поддерживаемым в будущем, без необходимости дублировать определение шага.

Изменить

В комментариях был запрошен рабочий пример для объектной модели страницы с огурцом. Вот рабочий пример на Git.

Написанная на Ruby, это чрезвычайно простая версия фреймворка, обозначающая структуру каталогов и то, как я лично работаю с POM (примечание: есть много «правильных» способов сделать это).

Этот пример намного строже с POM, чем я предложил использовать в приведенном выше примере, вместо этого сохраняя метод «go_to» в файле «urls» в каталоге элементов, но, как было сказано ранее, есть много «правильных» способов идти об использовании POM.

person KyleFairns    schedule 10.10.2017
comment
Я как бы понял идею, и ваша структура каталогов - это то, чего я пытаюсь достичь. Однако я не уверен, как реализовать If there is a shared step between multiple features and scenarios, it's best to separate these into common files.. - person demouser123; 10.10.2017
comment
@ demouser123 Я бы разделил их в «общую» папку в папке определений шагов с новым файлом, обозначающим, что делают шаги внутри. Например, в «steps/common/navigation.ts» я бы поместил шаг, который я описал в своем ответе, и я бы выделил шаги для каждой страницы в каталог «steps/pages», опять же в файлах и папках, обозначающих именно то, что шаги внутри направлены на проверку. - person KyleFairns; 10.10.2017
comment
@demouser123 Я никогда раньше не работал с машинописным текстом, но если вы не возражаете против того, чтобы он был на Ruby или на простом старом JavaScript, чтобы проиллюстрировать это, я был бы рад - person KyleFairns; 10.10.2017
comment
Не должно иметь большого значения. Я могу работать как с Ruby, так и с JS. - person demouser123; 10.10.2017
comment
@demouser123 Посмотрите рабочий пример в моем редактировании, не стесняйтесь задавать любые вопросы, которые у вас возникнут после его просмотра. - person KyleFairns; 10.10.2017