Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Запуск сценариев в одном браузере (cucumber features)

cucumber
ruby
Теги: #<Tag:0x00007f7b63550df8> #<Tag:0x00007f7b63550cb8>

(Max T) #1

Привет,
Нужна помощь сообщества так как ruby and cucmber только начал курить.
Есть feature типа

Feature: Checking all buttons on main page
Scenario Outline: The message "Don't push the button" displays if user clicks the button
Given: I login as a "user"
And Can see the "page"
When I click "<button>"
Then I can see "Don't push the button"
Examples: Buttons
|button|
|button#1|
|button#2|
|button#3|

Если запустить код, то он для каждой кнопки запустит браузер кликнет и закроет браузер. Очень бы хотелось не запускать браузер каждый раз, а запустив его один раз прокликать все кнопочки.
Вопрос - как этот сделать? Полагаю, что можно создать функцию “клик” и скормить ей array с названиями кнопок, Но как вытащить все названия из feature за один раз и вставить в array пока не понимаю. Плиз подскажите как правильно написать эту фичу и код (ЗЫ на руби полторы недели и до сих пор в ужасе :slight_smile: так что не пинайте сильно)


(Daniel Castillo) #2

Hi,

U should use Cucumber Data Tables.

https://pragprog.com/book/hwcuc/the-cucumber-book

Chapter 5:Data Tables

Regards


(rmerkushin) #3

Вы не правильно используете examples. Examples это для data-driven тестов, каждая строка из таблицы будет использоваться как аргумент к вашему тесту. Соответсвенно в вашем случае сценарий выполнится 3 раза. Вам нужно переделать логику теста, ну или как минимум сделать инициализацию драйвера и его закрытие в hook’ах.

Подскажу один момент, в одном тесте должна быть одна проверка, либо проверяться связанные сущности, например: после нажатия на кнопку появляется сообщение и в бд создается запись. Очевидно что проверять отдельно сообщение и запись в бд нет смысла, т.к. это одна сущность.

Если вкратце, то тест должен выглядеть как-то так:

пердусловие функции (feature setup)
сценарий:
    предусловие сценария (scenario setup) (не обязательный элемент)
    действие (step)
    проверка результата (step) (может быть несколько)
    постусловие сценария (scenario teardown) (не обязательный элемент)
постусловие функции (feature teardown)

(Max T) #4

Да, я согласен с вами полностью. Правильнее написать сценарий для каждой “кнопки” - нажал кнопку и проверил результат. Но засада в том, что мне нужно избежать перезапуска браузера для каждого сценария. Т.е. есть feature файл с 10 сценариями, которые могут исполниться в одну сессию - но я не понимаю пока как это сделать. При этом в другом файле лежат сценарии которые должны быть запущены в разные сессии. Т.е у меня технический вопрос - как сказать руби - запусти все в одну сессию для конкретного feature файла
Спасибо


(Max T) #5

Thanks! Yes I understand my faults. Could you help me how to extract this data-table into array or hash? I google it but can not find the solution.
Thanks!


(Max T) #6

I found it: http://www.thinkcode.se/blog/2014/06/30/cucumber-data-tables but it for java ;-(


(rmerkushin) #7

Вам нужны хуки https://github.com/cucumber/cucumber/wiki/Hooks в хуке для фичи создаете вебдрайвер и передаете его через контекст. Как делать в руби я не подскажу, пишу на Python, но по ссылке я думаю можно много чего найти полезного.


(Bolatbek) #8

Я пишу на Cucumber JS, но суть одна.
В общем, у вас браузер инициализируется в World, а он инициализируется на каждый сценарий.
Как написали выше - тут помогут хуки: BeforeFeatures (как на руби - не знаю, поищете) - тут вы должны стартовать инстанс браузера вне world и передавать его в world, а в AfterFeatures - его убить.

Второй вариант - when I click и then I can see - объединяете в один step, туда передаете data-table и внутри степа сразу пробегаетесь по функионалу кнопки. Не самый лучший вариант, но иногда вполне подходит.