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

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

Так что написание тестов может быть полезно для изучения Ruby, а Ruby используется для создания среды Ruby on Rails. Давайте завершим этот полезный круг: учитывая, что фреймворк Ruby on Rails поставляется с множеством готовых функций автоматического тестирования, может быть хорошим упражнением изучить некоторые из этих тестов, чтобы получить некоторую практику в написании Ruby. , исследуйте структуру приложения Rails и подумайте о том, что вы на самом деле создаете.

В Rails тесты разделены на разные категории. Наиболее ощутимой категорией тестов являются системные тесты. Эти типы тестов являются сквозными тестами, что означает, что они выполняются против настоящий браузер, загружая веб-страницу и копаясь в ней, точно так же, как мы пытались бы самостоятельно нажимать на нее и взаимодействовать с ней.

Одна из замечательных особенностей написания системных тестов заключается в том, что они могут тестировать любую страницу в Интернете, а не только страницы в приложении Rails. Так что экспериментировать с автоматическими системными тестами можно даже без создания приложения!

Возможно, спорным преимуществом является использование некоторого кода Ruby, который дает ощутимую обратную связь без необходимости немедленно погружаться во все сложности инфраструктуры Ruby on Rails.

Давайте посмотрим, как настроить это в приложении Ruby on Rails.

Драгоценный камень Capybara и Selenium WebDriver

Мы собираемся использовать инструмент тестирования Capybara вместе с другим программным обеспечением под названием Selenium Webdriver, чтобы загружать и запускать тесты в веб-браузере Firefox. Перед написанием тестового скрипта нам нужно, чтобы все три компонента были доступны - Capybara, WebDriver и Firefox.

Веб-браузер Mozilla Firefox доступен с веб-сайта Mozilla. Также необходимо скачать Selenium WebDriver.

Capybara - это драгоценный камень Ruby, который входит в состав Rails начиная с версии 5.1, поэтому нам не нужно устанавливать для этого ничего нового.

Selenium WebDriver - это отличное программное обеспечение, которое позволяет программам запускать веб-страницу и взаимодействовать с ней в окне Firefox. Он доступен как инструмент командной строки на GitHub. Но нам не нужно его загружать, потому что Rails также включает selenium-webdriver гем Ruby в Gemfile!

selenium-webdriver - это драгоценный камень Ruby, который является оболочкой для программы WebDriver, так что мы можем использовать его в программах Ruby без необходимости устанавливать Selenium WebDriver отдельно! Это отличный пример того, как Rails помогает нам, автоматически предоставляя полезные инструменты в наше приложение. Итак, мы можем приступить к работе с нашим первым тестовым сценарием.

Первый тестовый сценарий

Ниже показан простой тестовый сценарий. Он не взаимодействует с приложением Rails; он открывает duckduckgo.com и выполняет поиск.

require 'application_system_test_case'
Capybara.run_server = false
class CapybaraTest < ApplicationSystemTestCase
  test 'capybara works' do
    visit 'http://www.duckduckgo.com'
    sleep 5.seconds
    fill_in 'q', with: 'Ruby on Rails'
    sleep 5.seconds
    click_on 'search_button_homepage', match: :first
    click_on 'A web-application framework', match: :first
    sleep 5.seconds
    click_on 'Guides'
    sleep 20.seconds
  end
end

Этот скрипт может перейти прямо в приложение Rails. В папке test/system/ вашего приложения Rails создайте файл с именем using_capybara_test.rb и скопируйте весь приведенный выше код в этот файл.

Затем необходимо внести одно небольшое изменение в конфигурацию: открыть файл test/application_system_test_case.rb и изменить символ :chrome на :firefox; По умолчанию Rails использует Chrome, но мы предпочитаем использовать Firefox в школе расширений.

Это все, что нужно для запуска этого первого простого системного теста. Выполните эту команду из корня вашего приложения Rails в терминале: rails test:system.

Если все работает, при запуске команды вы должны увидеть окно Firefox, которое волшебным образом открывается, затем перейдите на duckduckgo.com, найдите Ruby on Rails и начните перемещаться по rubyonrails.org. Не нажимайте ни на что в окне во время его работы; вы просто прервете тестовый сценарий!

Отличная работа! Вы только что выполнили свой первый автоматический тест!

Так что же такое Capybara и Selenium Webdriver более подробно?

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

Selenium Webdriver - это программное обеспечение, которое запускает процесс Firefox, открывает окно браузера, а затем действует как интерфейс между Capybara и окном. Он выполняет команды в сценарии Capybara в реальном окне Firefox.

Capybara и Webdriver - отличная комбинация, которая позволяет нам увидеть, как тестовые скрипты работают волшебным образом!

Управление страницей с помощью Capybara

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

  • sleep ... используется для замедления шагов в тесте, так как он может выполняться так быстро, что вы даже не заметите, какие страницы открываются.
  • visit ... используется для прямого открытия определенного URL.
  • fill_in ... используется для заполнения определенного поля формы на текущей странице.
  • click_on ... используется для нажатия на определенные ссылки или кнопки на текущей странице.

Обратите внимание, что одна из команд click_on включает параметр match: :first. Это связано с тем, что результаты поиска для "Ruby on Rails" возвращают множество ссылок, содержащих термин "Ruby on Rails", поэтому мы должны указать, какое совпадение мы хотим щелкнуть. Capybara выдает ошибку в консоли, если мы не включаем ее и есть несколько совпадений.

В Capybara есть несколько команд в дополнение к трем вышеперечисленным, что упрощает создание некоторых автоматических системных тестов. Документация Capybara исчерпывающая и хорошо написана, если вы хотите узнать больше.

Изменение тестового сценария

Теперь есть возможность внести некоторые изменения в тестовый сценарий. Мы можем изменить тест 'capybara works' для выполнения следующих действий, а затем запустить команду для выполнения измененного сценария.

  1. Ищите "Cinque Terre" вместо "Ruby on Rails".
  2. Затем нажмите на первый результат поиска, соответствующий «Википедии».
  3. Затем нажмите на первое совпадение по запросу "Итальянская Ривьера".

Это всего лишь небольшие изменения, но мы немедленно получаем обратную связь о том, что эти изменения делают, запустив rails test:system.

Тестовые кейсы

Блок кода, который начинается test и заканчивается end, является одним тестовым примером в тестовом сценарии. Второй тестовый пример можно добавить внизу скрипта внутри класса CapybaraTest.

require 'application_system_test_case'
Capybara.run_server = false
class CapybaraTest < ApplicationSystemTestCase
  test 'capybara works' do
    visit 'http://www.duckduckgo.com'
    sleep 5.seconds
    fill_in 'q', with: 'Cinque Terre'
    sleep 5.seconds
    click_on 'search_button_homepage', match: :first
    click_on 'Wikipedia', match: :first
    sleep 5.seconds
    click_on 'Italian Riviera', match: :first
    sleep 20.seconds 
  end
  test 'we can use capybara' do
    # the second test case in our script!
  end
end

Этот второй тестовый пример, 'we can use capybara', можно заполнить следующими шагами тестирования:

  1. Откройте страницу https://en.wikipedia.org/wiki/Internet, затем sleep на пять секунд.
  2. Заполните ввод searchInput текстом 'Ruby programming language', затем sleep на пять секунд.
  3. Щелкните searchButton, затем sleep на пять секунд.
  4. Щелкните первое совпадение 'Examples', затем sleep на пять секунд.
  5. Щелкните первое совпадение 'Hello world', затем sleep на пять секунд.

С этим вторым тестовым набором мы увидим увеличение количества тестов после запуска rails test:system, и у нас будет тестовый сценарий, который может немного научить нас и Ruby.

Как быть напористым!

Итак, это два тестовых примера в нашем первом тестовом сценарии. Эти два тестовых примера были полезны для практики некоторых основных команд, предоставляемых Capybara. Но в обоих тестовых примерах отсутствует важная заключительная часть: утверждения!

Утверждения в автоматических тестах - это шаги, подтверждающие, что что-то такое, каким оно должно быть. В них весь смысл написания тестов. Мы включаем утверждения в наши тестовые сценарии как проверки того, что шаги, которые мы предприняли в тесте, дают ожидаемый результат или конечное состояние.

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

Это модифицированная версия исходного тестового примера в начале сообщения. Теперь он включает утверждение в качестве последнего шага.

test ‘capybara works’ do
    visit ‘http://www.duckduckgo.com'
    sleep 5.seconds
    fill_in ‘q’, with: ‘Ruby on Rails’
    sleep 5.seconds
    click_on ‘search_button_homepage’
    click_on ‘A web-application framework’, match: :first
    # we expect the Ruby on Rails homepage to include the text 'Contribute on GitHub'
    assert page.has_content? ‘Contribute on GitHub’
  end

С добавлением этого утверждения assert page.has_content? 'Contribute on GitHub' у нас есть тест, который проверяет что-то конкретное. Это проверка того, что домашняя страница Ruby on Rails содержит текст, соответствующий «Contribute on GitHub».

Утверждение выполняется методом assert. Есть целый набор вариаций assert, которые предоставляет гем minitest, используемый под Capybara для запуска тестов. Есть исчерпывающий список в документации к минитесту.

Базовый метод assert просто гарантирует, что значение, возвращаемое выражением справа от него, равно true. Если это true, тест выполняет то, что мы ему сказали, и проходит; если это false, тест не проходит, и мы видим, что все не, как мы ожидаем, и можем что-то с этим сделать.

В приведенном выше примере мы используем объект page, который представляет текущую страницу в нашем тестовом сценарии, и один из его методов, has_content?, чтобы узнать, есть ли на открытой странице содержимое 'Contribute on GitHub'. assert проверяет, что это true.

Если String 'Contribute on GitHub' изменить на 'Cookery on GitHub', тогда тест завершится неудачно, потому что на открытой странице нигде нет текста.

Быть более напористым

Мы можем включить больше утверждений в один тестовый сценарий. Это может быть хорошим способом проверить несколько вещей в одном процессе. Например

  test 'search term is displayed' do
    visit('https://wikipedia.org')
    assert page.has_content?('The Free Encyclopedia')
    fill_in('searchInput', with: 'Ruby on Rails').send_keys(:enter)
    assert has_content?('David Heinemeier Hansson')
    assert current_url.include?('Ruby_on_Rails')
  end

Это гораздо более сложный тестовый сценарий, поэтому давайте разберем его шаг за шагом.

Сначала сценарий посещает домашнюю страницу Википедии 'https://wikipedia.org'.

Затем он утверждает, что на главной странице где-то есть фраза «Бесплатная энциклопедия».

Затем он вводит поисковый запрос Ruby on Rails в поле поиска. Скрипт немедленно отправляет эту форму с помощью метода .send_keys(:enter), который имитирует нажатие клавиши enter / return.

Capybara ожидает загрузки следующей страницы, а затем тестовый сценарий утверждает, что на странице есть термин «Дэвид Хайнемайер Ханссон» (создатель Ruby on Rails).

На последнем шаге утверждается, что полный URL-адрес, который мы открыли в браузере, включает имя страницы, на которой мы ожидали оказаться в конечном итоге, которое должно быть Ruby_on_Rails. current_url - удобный метод, который Capybara предоставляет нам на случай, если нам нужно проверить URL-адрес, который в настоящее время открыт в браузере. Он возвращает String, и в этом примере мы просто используем метод include? String, чтобы утверждать, что URL-адрес содержит ожидаемую подстроку.

Одно ограничение с тестами Capybara

К сожалению, есть предостережение относительно запуска системных тестов на внешних веб-сайтах в приложении Rails. Для этого Capybara должен быть сконфигурирован так, чтобы не запускать какие-либо тесты для приложения Rails. В начальном тестовом сценарии есть строка кода, которая говорит Capybara предотвратить это: Capybara.run_server = false

Эта конфигурация отключает возможность тестирования самого приложения Rails. Мы удаляем эту строку кода, чтобы начать писать тесты для приложения. Но когда эта строка будет удалена, больше нельзя будет запускать тесты на внешних веб-сайтах.

Таким образом, мы можем некоторое время попрактиковаться в написании тестов для внешних веб-сайтов, но когда дело доходит до написания реальных тестов для нашего приложения, нам придется удалить run_server параметр и удалить тесты для внешних веб-сайтов.

Один из способов продолжать практиковаться в написании Ruby и тестовых скриптах для внешних веб-сайтов - это сохранить конкретное базовое приложение Rails, которое будет содержать эти тесты. Также можно использовать Capybara вне Rails в меньших сценариях Ruby, если вы научитесь писать код Ruby.

Тестирование, чтобы учиться, учиться тестировать

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

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

Учить больше!

Хотите узнать больше о Ruby и Ruby on Rails? Я преподаю Разработка веб-приложений в EPFL Extension School, сертифицированной онлайн-платформе для обучения цифровым навыкам в области науки о данных, разработки веб-приложений и многого другого. EPFL является одним из ведущих университетов мира и занимает первое место в рейтинге молодых университетов по версии Times Higher Education Ranking.