Автоматизация тестирования с применением Ruby и WATIR

в 8:23, , рубрики: ruby, watir, автоматизация тестирования, Блог компании Luxoft, Тестирование IT-систем

image
Уважаемые посетители ресурса habrahabr.ru! Мы хотим познакомить Вас со статьей Джереми Суареса (Jeremy Suarez), инженера по автоматизации тестирования. Если Вы планируете организовать автоматизированное тестирование на своем проекте с применением языка Ruby и WATIR – эта статья придется Вам как нельзя кстати. Джереми описывает все простым языком, на элементарных примерах. После прочтения статьи у Вас сформируется четкое понимание процесса – от его начальных шагов, до завершающего этапа.

Прежде чем мы перейдем непосредственно к материалу, хотелось бы несколько слов посвятить автору. Джереми имеет богатый опыт работы в сфере тестирования. На своих многочисленных проектах он занимал различные роли – от разработчика, до тестировщика и менеджера проекта. В настоящий момент он работает в компании ThoughtWorks.

Итак, приступим!

Целевая аудитория
Этот материал будет полезен прежде всего инженерам-тестировщика, которые планируют создавать автоматизированные тестовые сценарии, либо для тех, кто собирается поддерживать готовый фреймворк. Предполагается, что читатель владеет базовыми знаниями синтаксиса Ruby и знаком с основными принципами разработки web-приложений (такие термины как «ссылка», «форма», «JavaScript» не приводят к панической атаке).

Ruby – сравнительно простой в освоении язык. Если у Вас уже имеется некоторый опыт написания кода на Python, C++, Java или C, Вы достаточно быстро освоите его.

Предусловия и ограничения
Здесь описаны некоторые необходимые условия использования WATIR для тестирования web-приложений. Пожалуй, основным из них, является то, что модуль работает только с IE 5.5 и ниже. К сожалению, он не предназначен для работы с Netscape, Opera, Firefox или любым другим браузером. Это означает, что кросс-браузерное тестирование с использованием WATIR невозможно. Вторая важная деталь – у WATIR нет собственного рекордера. По большому счету, WATIR это библиотека методов и объектов IE, которые можно использовать при написании скриптов вручную. И наконец, третье – у WATIR нет средств для идентификации объектов, расположенных на странице, а также их типов и доступных методов. Он предоставляет методы для сбора всех ссылок, изображений, форм и т.д. Поэтому процесс разработки скрипта зачастую проходит по методу проб и ошибок, что кстати, необязательно плохо.

Подготовка
Любому процесс написания автоматизированных тестовых скриптов обязательно предшествует процесс подготовки. Самым важным моментом в этом случае, пожалуй, является то, что все авто-тесты, по сути, логически вытекают из, уже готовых, ручных сценариев тестирования. Большая часть усилий на разработку тестового фреймворка тратится впустую по причине некорректно написанных ручных тестов. Важно понимать – это основной момент, в дальнейшей поддержке и ручного и автоматизированного тестирования. Необходимо видеть полную картину взаимодействия бизнес-процессов, реализуемых с помощью приложения и подходить к их описанию охватывая весь скоуп (scope) задач.

Понимание специфики тестируемого приложения
Сбор функциональных требований (если таковые имеются)
Перед тем, как переходить непосредственно к дизайну ручных или авто- тестов, необходимо понять, что из себя представляет Ваше приложение. Самый простой способ – ознакомиться с требованиями к разработке. В наше время, документирование требований распространено практически повсеместно. А если есть четко сформулированные, полные и непротиворечивые требования — это уж– хорошая стартовая точка.

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

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

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

Определение кейсов, подходящих для автоматизации
Как гласит известный рекламный слоган: «Не все йогурты одинаково полезны». Тоже самое относится и к тест-кейсам. Не все из них следует автоматизировать. Только самые простые и часто повторяющиеся являются хорошими кандидатами. Начните с кейсов, работающих с UI, затем обратите внимание на те, в ходе которых приходится часто создавать и удалять данные. В конце концов, попробуйте создать набор сценариев, покрывающих наиболее важные функциональные сегменты (наиболее часто используемые функции).

Создание фреймворка автоматизированных сценариев
Как только у вас появится четкое видение, что конкретно нужно тестировать, после того, как Вы задокументируете требуемые функции как пошаговые кейсы – вот тогда можно смело начинать разработку самих скриптов авто-тестов. Скопируйте свой ручной тест-кейс в пустой файл Ruby-скрипта. Закомментируйте шаги сценария и разделите их на отдельные участки. При разделении можно также следовать принципу – создание данных в одном месте, использование – в другом. Если в процессе работы скрипта были сгенерированы некоторые данные, но сам кейс по какой-то причине не дошел до конца – разумнее будет удалить эти данные и попробовать восстановить скрипт.

Реализация
В общем случае, реализация процесса автоматизации сценария тестирования при использовании Ruby и WATIR сводится к нескольким простым шагам:
• Тест-кейс выбран и может быть запрограммирован с помощью набора функций
• Инициализация объекта IE или соединение с существующим окном браузера
• Переход по начальной ссылке приложения
• Сбор всех ссылок, изображений, форм необходимых для дальнейших действий
• Из собранной информации получается имя ссылки, информация о форме, имя картинки и т.д.
• Выполнение действий над ссылкой, формой, изображением
• Повтор шагов 3-6 до тех пор, пока это необходимо. В конце каждого шага должна быть проверка, что произведенное действие закончилось успешно.

Для достижения максимальной эффективности, крайне важно сопровождать каждый шаг проверкой. Если такая проверка не выполняется — можно — можно снимать скриншот, копировать логи, ну или по крайней мере, выдавать вразумительное сообщение об ошибке. Иначе вы рискуете получить что-то наподобие «Ссылка не найдена» или «Форма ххх недоступна».

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

Технические аспекты реализации
Инициализация объекта IE
Начните с создания нового объекта IE браузера или соединитесь с уже существующим.

$ie = IE.new()

Или

$ie = IE.attach ( :title, “…”)

Переход по стартовой ссылке

Начинайте тестирование приложения переходом по заданной ссылке. Все кейсы начинаются именно с этого. А иногда бывает необходимо переходить по ссылкам в процессе выполнения самого сценария.

$ie.goto (“http://....”)

Верификация контента

Самый легкий путь проверки контента – с помощью команды assert. Проверьте что форма существует, какая-либо кнопка доступна, страница содержит некоторый текст и так далее… В Ruby нет цикла TRY, по этой причине мы используем ключевое слово rescue.

begin
assert ($ie.pageContainsText(“Logged out Successfully”) )
assert ($ie.form(:name, “Login”).exists )
$log.info (“Test step 5 passed!”)
rescue
$log.error (“Test step 5 failed”)
$log.info (“Error text was: “, ie.text() )
end

Сбор необходимых ссылок, изображений, форм

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

$log.info (), $log.error (), $log.warning () all output to the log4j log file.

Показать все ссылки:

puts $ie.show_links()

Показать все формы:

puts $ie.show_forms()

Показать все изображения:

puts $ie.show_images()

Показать все объекты:

puts $ie.show_all_objects()

Показать всю страницу целиком со всеми фреймами:

puts $ie.html()

Клик по ссылке

Активация ссылки может быть произведена через ее имя или непосредственный URL. При работе с JavaScript ссылку можно активировать только по URL, или если это ссылка-картинка, по тегу ее изображения (src, image tag). Метод click – один из стандартных методов WATIR для активации ссылки.

$ie.link (:text, “Portfolio”).click

Если текст ссылки может со временем измениться, а ее местоположение – нет, тогда надежнее будет использовать индекс ссылки (используйте $ie.show_links() для поиска индексов различных ссылок):
$ie.link (:index, 20).click

В случае использования JavaScript, может быть использован URL (или тег href):
$ie.link (:url, /javascript:deleteClient(d, .*/).click

Заметьте – URL следует закодировать (пробелы выражаются как %20 и т.д.). Можно прибегать к помощи регулярных выражений, как в примере выше.

Клик по изображению
Клик по изображению мало чем отличается от клика по ссылке, за исключением наличия дополнительных тегов scr и alt.
$ie.image (:name, “login.gif”).click

Отправка формы
Заполнение и отправка формы, вероятно, наиболее трудный шаг выполняемый на этапе навигации по сайту. Для этого вам необходимо знать наименования всех текстовых полей, списков выбора или любых других элементов, присутствующих на форме. Используйте ie.show_all_objects() для этих целей.
$ie.textField(:name, “username”).set(“testuser”)
$ie.textField(:name, “password”).set(“testpass”)

Отправка производится «кликом» по соответствующему объекту:
$ie.button(:value, “Login”).click

Небольшой экскурс по общим объектам
Работа с всплывающими окнами

Действия
new, back, forward, send_keys, goto, close, refresh, minimize, maximize, restore

$ie.back()
$ie.forwards()
$ie.send_keys(“{TAB}{TAB}{ENTER}”)
$ie.close
$ie.goto(“http://www.google.com”)
$ie = IE.new()

Функции отображения
showFrames, show_frames, showForms, show_forms, showImages, show_images, showActive, show_active, showLinks, show_links, showAllObjects, show_all_objects, show_tables, buttons, show_spans, show_labels

$ie.show_tables
$ie.buttons.each {|m| puts m}

Наследуемые объекты
frame, textField, span, row, selectBox, radio, select_list, text_field,
checkBox, button, checkbox, link, cell, form, table

$ie.frame(:index, 1)
$ie.textField(:name, “q”).set(“Test”)
$ie.button(:value, “OK”).click
$ie.link(:text, “Happy link”).click
$ie.select_list(:name, “Day”).select_value(“today”)

Списки объектов
checkboxes, labels, images, spans, radios, select_lists, text_fields, buttons, tables, links

$ie.checkboxes.each {|m| puts m}
$ie.radios.each {|m| puts m}
$ie.links.each {|m| puts m}

Проверки
getText, text, getStatus, status, getHTML, html, pageContainsText, contains_text, title

if ($ie.text.match(“Hallo”) != nil)
puts ‘Passed!’
else
puts “Failed!’
$ie.contains_text(“Google”)
Returns: True

Другие функции
getImage, getIE, enable_spinner, set_fast_speed, enable_spinner=, wait, popup, down_load_time, getLink, set_slow_speed, getTablePart, focus, url

Текстовые поля
Описание
text name=question id= value= alt= src=

Объекты
textField, text_field

Методы распознавания
$ie.show_all_objects
$ie.show_active
$ie.textfields.each { |textfield| puts textfield}

Другие методы
value, value=, clear, click, send, set, enabled?, flash, html, append, getContents, focus, verify_contains

Наиболее используемые методы
value, set, append, verify_contains.

Примеры
$ie.textField(:name, “q”).value=”Sam”
$ie.textField(:name, “q”).append(“I am”)
$ie.textField(:name, “q”).value
Returns: “Sam I am”
$ie.textField(:name, “q”).getContents
Returns: “Sam I am”
$ie.textField(:name, “q”).set(“Happy”)
$ie.textField(:name, “q”).verify_contains(“app”)
Returns: true

Кнопки
Описание
submit name=btnG id= value=Google Search alt= src=

Объекты
Button

Способы распознавания
$ie.show_all_objects
$ie.show_active
$ie.buttons.each { |button| puts button }

Другие методы
value, display, click, send, enabled?, flash, html, disabled, freeze, focus

Наиболее используемые методы
Click

Примеры
$ie.button(:name, “btnG”).click
$ie.button(:name, “btnG”).value
Returns: “Google Search”

Ссылки
Описание
" name= id= innerText=Business Solutions href=http://www.google.com/services/"

Объекты
Link

Методы распознавания
$ie.show_links
$ie.show_active
$ie.links.each { |link| puts link }

Другие методы
value, title, click, link_has_image, enabled?, flash, html, href, src, text, focus, name, innerText, equal?

Наиболее используемые методы
Click

Примеры
$ie.link(:text, “Business Solutions”).click
$ie.link(:text, “Business Solutions”).enabled?
Returns: true
$ie.link(:text, “Business Solutions”).link_has_image
Returns: false

Заметки: ссылка возвращается без типа, если применяются методы show_active или show_all_objects.

Списки выбора
Описание
select-one name=logonForm:_idJsp15:0:Question id=logonForm:_idJsp15:0:Question value=What is your cat's name?

Объекты
select_list

Методы распознавания
$ie.show_all_objects
$ie.show_active

Другие методы
option, select, value, getSelectedItems, click, enabled?, flash, select_item_in_select_list, html, getAllContents, select_value, clearSelection

Наиболее используемые методы
select, getSelectedItems, getAllContents, select_value, clearSelection

Примеры
$ie.select_list(:name, /Question/).value
Returns: “What is your cat’s name?”
$ie.select_list(:name, /Question/).getAllContents
Returns array: [«What is your favorite color?», «What is your cat's name?»]
$ie.select_list(:name, /Question/).select_value (“What is your cat’s name?”)

Чекбоксы
Описание
checkbox name=option1 id= value=Milk alt= src=

Объекты
checkbox
checkBox

Методы распознавания
$ie.show_all_objects
$ie.show_active
$ie.checkboxes.each {|checkbox| puts checkbox}

Другие методы
value, clear, click, set, enabled?, checked?, flash, html, isSet?, getState

Наиболее используемые методы
click, set, clear, checked?

Примеры
$ie.checkbox(:name, “Milk”).set
$ie.checkbox(:name, “Milk”).isSet?
Returns: true
$ie.checkbox(:name, “Milk”).click
$ie.checkbox(:name, “Milk”).isSet?
Returns: false
$ie.checkbox(:name, “Milk”).clear
$ie.checkbox(:name, “Milk”).isSet?
Returns: false

Радио-баттоны
Описание
radio name=group1 id= value=Butter alt= src=

Объекты
Radio

Методы распознавания
$ie.show_all_objects
$ie.show_active
$ie.radios.each { |radio| puts radio }

Другие методы
value, clear, click, set, enabled?, checked?, html, isSet?, getState

Наиболее используемые методы
set, checked? (clear, carefully)

Примеры
$ie.radio(:value, “Butter”). Set
$ie.radio(:value, “Butter”).isSet?
Returns: true

Примечание: метод Clear для радио-кнопок лучше не использовать. Сбросить радио-кнопку лучше нажав другую
$ie.radio(:value, “Butter”). Clear

Фреймы (они же слои)
Описание
HTML Document name=message id= src=frameshop-intro.html

Объекты
Frame

Методы распознавания
$ie.show_all_objects
$ie.show_frames

Другие методы
Примечание: фрейм ведет себя как обычное IE окно. К нему можно обращаться по имени (можно по фамилии), а также по индексу и обычно для обращения к нему создают отдельную переменную. Также часто фреймы бывают вложены в другие фреймы

Наиболее используемые методы
Примеры
$f1 = $ie.frame(:name, “message”)
$f2 = $ie.frame(:index, 1)
$f1.show_all_objects
Последняя строка вернет все объекты фрейма, как обычный ie объект.

Технические приемы
Обработка всплывающего окна
Благодаря распространенной схеме проверок на стороне клиента силами JavaScript и других технологий, всплывающие окна встречаются достаточно часто в тестировании web-приложений.

Они делятся на два типа: генерируемые браузером IE и генерируемые самим приложением.

IE обычно генерит всплывающие окна, которые появляются лишь единожды. Взять хотя бы предупреждающее окно Windows, появляющееся при попытке передать незашифрованные данные, отправке формы или вопрос о запоминании пароля. Рекомендуется блокировать показ таких окон в настройках IE и не обрабатывать их в скрипте. JavaScript и ActiveX формируют свои окна, требующие от пользователя подтвердить то или иное действие, отображающие некорректные данные и т.д. IE не воспринимает страницу полностью загруженной, до тех пор пока javascript диалог не будет закрыт, поэтому и скрипт на Ruby не завершит свою работу пока диалог не будет закрыт.

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

Для предотвращения подобной ситуации рекомендуется любые действия, которые могут спровоцировать появление javascript всплывающего окна, выполнять в отдельном потоке. Это позволит основному скрипту продолжить работу, пока другой поток ожидает закрытия окна.
Thread

Клик по кнопке подтверждения для закрытия диалога:
Clicker=WinClicker.new
Clicker.clickJavaScriptDialog (“OK”)

Скрытые фреймы
Иногда, хотя функция show_frames и возвращает 0, многие или даже все фреймы на странице могут быть частью скрытого фрейма. Если вы столкнулись с такой ситуацией, при которой страница визуально содержит объекты, но возвращает пустой список, проверьте, не лежат ли они в скрытом фрейме. Используйте следующую команду:
$ie.frame (:index, 1)…
Это позволит обратиться к фреймам по индексу. Главный фрейм имеет индекс 0, второй по счету, соответственно 1.

Интерактивная разработка скриптов
После того как вы привыкните к процессу написания скриптов на Ruby и WATIR, вы, вероятно, найдете его весьма изнуряющим и время-затратным из-за отсутствия собственного рекордера. Одним из способов разогнать унылую тоску – время от времени применять встроенный ruby интерпретатор.

Интерпретатор любезно предоставляет вам возможность отладки скрипта в режиме строку за строкой в открытом браузере. Вы можете применять обсуждаемые выше методы, такие как show_links, show_all_objects для распознавания объектов на отображаемой странице, вместо того чтобы каждый раз запускать скрипт с начала.

Альтернативой может служить интерактивная функция show_active_method. Она применяется для распознавания объекта, находящегося в фокусе в данный момент.
puts $ie.show_active()

Советы и хитрости
Встроенная подстановка
Присвойте переменной todaysDate значение текущей даты в формате месяцденьгод (04212006)
$todaysDate = Time.now.strftime("%m%d%Y")
Замените дату в строке на значение текущей даты
pimsSQL «delete from blotter_funds where name ='#_1' and prime_broker ='Bobby Brown'»
Либо то же самое, только используя конкатенацию строк
pimsSQL «delete from blotter_funds where name ='» + $todaysDate + "_1' and prime_broker ='Bobby Brown'"

Ссылка на оригинал статьи:
www.thoughtworks.com/insights/blog/creating-automated-test-scripts-ruby-and-watir

Автор: Evgenia_s5

Источник

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


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