Статья рассчитана на знакомоство с автотестированием и разверткой среды в Windows 10 и предназначена для тех, кто хоть чуть — чуть знает о Cucumber + Capybara + Selenium-webdriver. Идея для статьи появилась из-за различий в разворачивании окружения на Windows 10 и Linux.


Пару слов о gem-ах (библиотеках) Cucumber + Capybara + Selenium-webdriver, которые нужны для запуска и наполнения проверками UI тесты.

Cucumber


Сucumber — гем, позволяющий писать тесты на человеческом языке. Для этого используется нотация Gherkin, которая определяет структуру и правила написания сценариев. Подробно почитать можно тут


Capybara


Capybara — гем, позволяющий искать/кликать/… по элементам браузера. Т.е. представляет собой связующее звено между Cucumber шагами (steps) теста, и webdriver-ом (экземпляр вызываемого браузера). Здесь можно глянуть методы этого гема.

Selenium-webdriver


Selenium-webdriver — это инструмент для автоматизации действий веб-браузера. По сути это есть экзмеплял (инстанс) браузера.

Предварительные действия


Описание предварительных действий
Для удобства демонстрации будем использовать RubyMine. Можно скачать пробную версию на 30 дней.

Скачиваем Firefox и Хром для запуска тестов.

Скачиваем и устанавливаем Git (система управления версиями или аналоичная VCS, оффициальный сайт). Но Git нужен когда у Вас уже есть проект или вы хотите хранить свой код в Git системе.

Итак, начнем


У нас уже есть установленный RubyMine.

  1. Нужно установить сам язык Ruby. Для этого идем сюда и ставим RubyInstaller. Я выбрал самый последний релиз (RubyInstaller 2.5.1-2) c пакетом DevKit. Через этот настроечный пакет можно запускать тесты из консольки, как в Linux, а также гибко управлять гемами.
  2. Пакет RubyInstaller установлен и мы переходим к настройке.
    В случае если мы хотим создать проект новый, то открываем RubyMine и создаем пустой проект, указав установленный Ruby.

  3. Далее нам нужно создать вот такую структуру папок и файлов согласно аннотации


    Подробно описано здесь
  4. Gemfile — содержит список гемов, которые используются в проекте

    Вот содержимое нашего гемфайла, с самыми основными гемами для UI тестов
    source 'https://rubygems.org'
    
    gem 'cucumber'
    gem 'capybara'
    gem 'selenium-webdriver'
    gem 'chromedriver-helper' 


    Эти 4 гема необходмо указать в Gemfile.
    gem 'chromedriver-helper' — хромдрайвер, позволяющий запускать тестики на Chrome
    С помощью данного Gemfile нужно установить наши избранные гемы. Устанавливать на Windows проще всего из интерфейса RubyMine: Меню Tools -> Bundler -> Install. Bundler — это тоже гем, но служит для управления гемами. Но также это можно сделать и из командной строки, которая находится в меню программ под именем Start Command Prompt…
    Кстати, при помощи этой командной строки можно и запускать тесты минуя RubyMine.
  5. Файл env.rb — ключевой rb файл для запуска UI тестов. При инициализации переменных и файлов теста именно env.rb будет самым первым. В нем происходит регистрация браузера, на котором будут выполняться тестики. Готовый пример env.rb, где происходит регистрация Chrome, Firefox или даем понять что нам браузер и не нужен вовсе для выполнения тестов.
    Случаи когда не нужен бразуер — проверяем рест запросы, интеграционное тестирование, хотя и считается, что Cucumber тесты для этого не совсем подходят.

    Пишем env.rb
    require 'capybara/cucumber'
    require 'selenium-webdriver'
    
    Capybara.register_driver :driver do |app|
      case ENV['DRIVER']
        when 'chrome'
          Capybara::Selenium::Driver.new(app, :browser => :chrome)
        when 'without_browser'
          Capybara.default_driver = :mechanize
        else
          client  = Selenium::WebDriver::Remote::Http::Default.new
          Capybara::Selenium::Driver.new(app, :browser => :firefox, port: 10000 + Random.rand(1000), http_client: client)
        end
    end
    
    Capybara.default_driver   = :driver
    Capybara.default_selector = :xpath 


    Также, здесь нужно упомянуть вопрос версионности Firefox.
    Если у Вас установлен Firefox версии 46 или ниже, то для корректного запуска тестов нужен gem 'capybara' версии '2.53.4' или ниже.

    Если Firefox версии выше 46 — то он работает по другим принципам на основе «geckodriver» и поэтому для корректного запуска тестиков нужно установить geckodriver.

    Экскурс в причины за чем нужен geckodriver
    До версии 47 версии драйвер автоматизации Firefox был всего лишь расширением, которое включалось в каждый клиент. Но это расширение было удалено из-за изменения политики, требющей теперь, чтобы все расширения подписывались Mozilla.

    Marionette — это новый драйвер, который поставляется вместе с Firefox. У этого драйвера есть собственный протокол, который несовместим с протоколом Selenium/WebDriver.

    Geckodriver — это сервер приложений, реализующий протокол Selenium/WebDriver. Он переводит команды Selenium и перенаправляет их в драйвер Marionette.

    Важный ньюанс, после установки «geckodriver» нужно обязательно прописать системные пути, для того чтобы наш «geckodriver» нашелся при выполнении env.rb.

    системные пути


  6. Далее всего лишь осталось написать тестовый тест и запустить на Chrome, Firefox и без браузера :). Например, напишем несколько шагов для входа в почту mail.ru

    Описание шагов
    # encoding: UTF-8
    # language: ru
    
    Given(/^Переходим на страницу "(.*?)"$/) do |page|
      visit page
    end
    
    Given(/^Вводим текст "(.*?)" в поле c id "(.*?)"$/) do |text, field_id|
      find("//input[@id='#{field_id}']").set(text)
    end
    
    Given(/^Выбираем текст "(.*?)" в выпадающем списке с id "(.*?)"$/) do |text, select_id|
      find("//select[@id='#{select_id}']/option[text()='#{text}']").click
    end
    
    Given(/^Нажимаем кнопку с текстом "(.*?)"$/) do |text|
      find("//input[@value='#{text}']").click
    end
    
    Given(/^Ожидаем (\d+) секунд(?:|ы)$/) do |sec|
      sleep sec.to_i
    end 


  7. А также сам cucumber тест

    test.feature
    # encoding: UTF-8
    # language: ru
    
    Функция: Открываем почту
    
      Сценарий: Открываем почту
    
        Дано Переходим на страницу "https://mail.ru/"
        И Вводим текст "dorian.grey.2019" в поле c id "mailbox:login"
        И Вводим текст "********" в поле c id "mailbox:password"
    
        Когда Выбираем текст "@inbox.ru" в выпадающем списке с id "mailbox:domain"
        Тогда Нажимаем кнопку с текстом "Войти"
    
        И Ожидаем 5 секунд


  8. Осталось лишь проверить все наши усилия и наслаждаться успешной работой UI тестов (в примере 1 теста) :). Осталась последняя настройка — настройка запуска тестов. Идем в меню RubyMine -> Edit Configurations -> Runner Options — Здесь как раз и производим выбор драйвера :)
    ENV['DRIVER'] из env.rb это и есть настройка запуска. И нам всего лишь нужно указать в Runner Options «DRIVER=firefox» или «DRIVER=chrome».

Запускаем,



Вот и все, успешных Вам Cucumber тестов!

Комментарии (8)


  1. denaspireone
    13.09.2018 09:46

    а если не руби?


  1. qa_tester Автор
    13.09.2018 10:12

    Естесственно, можно развернуть и на других языках. C#, Java..., аналогичным образом


  1. PerlPower
    13.09.2018 12:26

    Можете описать размер команды и весь воркфлоу, от спецификации функционала до теста. И кто за что отвечает?


    1. qa_tester Автор
      13.09.2018 14:55

      Коммерческая тайна:)


  1. savkk
    13.09.2018 13:46

    может код нужно было вынести в конструкцию <source>?
    Есть даже подсветка геркина — <source lang="gherkin">


    1. qa_tester Автор
      13.09.2018 14:51
      -1

      Здесь уже как угодно, возможностей масса у Cucumber, и написание кода, возможно, будет выделена следующая статья)


      1. savkk
        13.09.2018 15:06

        в статье сделайте подсветку синтаксиса, при чем тут возможности Cucumber?


        1. qa_tester Автор
          13.09.2018 16:28

          Да, прошу прощения, исправил) Спасибо