Автоматизация тестирования / Настройка Cucumber, Capybara & Selenium-WebDriver

в 14:00, , рубрики: capybara, cucumber, selenium, тестирование, метки: , , ,

Все дела сделаны и теперь есть время черкануть пару строк об автоматизации тестирования…

Думаю не стоит рассказывать о том, что такое тестирование или автоматизации тестирования. Я так же не буду вводить в начальный курс Cucumber, Capybara или Selenium-Webdriver, так как некоторую информацию можно найти на просторах интернета.

Вся «работа» будет проходить в режиме реального взаимодействия с web-браузером. Т.е. web-браузер будет запускатсья, эмулировать действия реального пользователя и закрываться по завершению тестов. Запуск реального браузера позволяет автоматизировать ajax запросы и различные JS «фишки». Хотя, если работа с JS не требуется, то можно не запускать web-браузер, a работать из консоли, и тем самым сохранить некоторое время, ускорить работу тестов. Для этих целей вместо Selenium-Webdriver можно использовать Capybara-mechanize драйвер.

Для тех, кто все еще не смог успел познакомиться с Cucumber и Capybara, скажу так: «огурец» будем использовать, как «парсер» текста, Capybara — как прослойку между Cucumber и драйвером, а так же для написания шагов автоматизации. Иными словами… на cucumber мы пишет наши тесты простым языком, а сами шаги реализуем с испльзованием Capybara. А Capybara уже взаимодействует с webdriver'ом, но это уже совсем другая история ;)

Предполагается, что у вас установлен ruby со всеми соответствующими настройками. Рассмотрим на примере с FF браузером. И так… Поехали!
Устанавливаем gem's:

(ubuntu) # sudo gem install cucumber capybara selenium-webdriver capybara-mechanize --pre

Gem файлы которые установлены на моей машине:
cucumber — 1.1.4
capybara — 1.1.2
capybara-mechanize — 0.3.0.rc3
selenium-webdriver — 2.17.0

Допустим у нас уже есть написанныя фича, на Cucumber. Рассмотрим структу папок необходимую для корректной работы.

MyProject
    features
    step_definitions/
        user_steps.rb
    support
        env.rb

Пару слов о самой структуре:
в папке «features» находятся наши «фичи» написанные по правилам Cucumber.
в папке «step_definitions» шаги для реализации задуманного функционала.
в папке «support» какие-нибудь конфигурационные файлы, библиотеки. А так же файл env.rb — к которому обращается Cucmber сразу после запуска; где происходит инициализация драйвера; первоначальная настройка.

Вроде все предельно просто. Перейдем непосредственно к самой настройке нашего env.rb файла.
Открываем env.rb. И подключаем необходимые файлы:

require 'cucumber/formatter/unicode' 
require 'capybara' 
require 'capybara/dsl' 
require 'capybara/session' 
require 'selenium-webdriver' 
require 'capybara/cucumber' 
require 'capybara/mechanize/cucumber'

Заставляем Capybara игнорировать срытые элементы, устанавливаем время ожидания и хост по умолчанию:

Capybara.ignore_hidden_elements = true 
Capybara.default_wait_time = 15 
Capybara.app_host = «http://my_site.com» 

Регистрируем сами драйвера:

Capybara.register_driver :selenium do |app| 
    profile = Selenium::WebDriver::Firefox::Profile.new # только если мы хотим создать ноый профиль для FF. 
    Selenium::WebDriver::Firefox.path = File.expand_path('~/path/to/firefox') # можем не указывать, тогда будет вызван FF по умолчанию. 
    Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile) 
end

# регистрация драйвера для тестирования без участия web-браузера
Capybara.register_driver :mechanize do |app| 
    Capybara::Mechanize::Driver.new(app) 
end

Cucumber перед выполнением того или иного сценария, вызывает секцию Before do … end. А после завершения сценария — After do … end. Если вы помните, то Cucumber поддерживает работу с тегами, т. е. мы можем указать перед сценарием какое-нибудь имя тега и в секции «Before» устанавливать драйвер для Capybara. Так же можно выводить названия не пройденных тестов из раздела «After», или отправлять письма, отчеты и так далее. Ради справедливости хочется заметить, что Capybara поддерживает не которые драйверы, по умолчанию, но я вам советую переопределять их самим. :)

Before do |scenario| 
  if scenario.source_tag_names.include?('@no_browser') and Capybara.default_driver != :mechanize 
      Capybara.default_driver = :mechanize 
  elsif !scenario.source_tag_names.include?('@no_browser') and Capybara.default_driver != :selenium 
      Capybara.default_driver = :selenium 
  end 
end 

After do |scenario| 
    if scenario.failed? 
        puts scenario.name
        puts scenario.exception.message        
    end 
end

В новых версиях Capybara после каждого сценария, gem'ка сбрасывает сессию. Это грозит тем, что, если у вас есть система авторизации, то в каждом новом сценарии надо опять ее проходить. Этого можно избежать, если заблокировать данное действие. Необходимо перейти к gem файлу (ubuntu: …/gems/capybara-VERSION/lib/capybara/cucumber.rb) и поставить коммент перед «Capybara.reset_sessions!» в самой первой секции (секция After do … end). Это не все «новшества» обновлений: так же после каждого сценария, «Capybara» переводит браузер на чистую страницу. От этого так же не сложно «избавиться», если поставить комментарий перед «@browser.navigate.to('about:blank')» в «…/gems/capybara-VERSION/lib/capybara/selenium/driver.rb» файле.

Хочется так же отметить, что на некоторых тестовых окружения есть так называемая basic authority, это можно обойти путем передачи имени и пароля непосредственно в URL'е:

Capybara.visit("http://#{$name}:#{$pass}@#{url}") 

После этого действия FF может выдать еще одно окно, с уточнением (ох уж этот FF… ).
Автоматизация тестирования / Настройка Cucumber, Capybara & Selenium WebDriver

От этого «окна» избавляются путем добавления одного параметра в сам браузер. Вот как это можно сделать:

 
	Открываем about:config страницу в FF.
	Создаем новый целочисленный ключ (правое нажатие мыши → новый → 				целочисленный):
	network.http.phishy-userpass-length со значение 255

Оригинал тут.
Вот и все. Настрой закончена… Теперь достаточно писать шаги и делать тестируемое приложение лучше :)

Можно рассмотреть как создаются шаги (steps), как пишутся сценарии (scenario), или удариться в еще какую-нибудь «область» Cucumber / Capybara / WebDriver. Если будет интересно — пишите!

Спасибо за внимание и всем удачи!

P.S. Несколько ссылок:
cucumber github
capybara github
selenium

Автор: AlexMrKlim

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js