суббота, 11 октября 2008 г.

Тестирование web-приложений с помощью Ruby

Введение

Тестирование web-приложений является неотъемлемой частью процесса их разработки. Существуют различные уровни тестирования, вот некоторые из них:
  • модульное тестирование;
  • интеграционное тестирование;
  • системное тестирование;
  • приемочное тестирование.
В рамках модульного тестирования проверяются минимально возможные компоненты, например, отдельные классы или функции. Интеграционное тестирование предназначено для проверки связи между компонентами. Задачей системного тестирования является проверка как функциональных, так и не функциональных требований к системе в целом. Приемочное тестирование проверяет поведение системы на предмет удовлетворения требований заказчика.

В этой статье рассказывается о высокоуровневой методике тестирования web-приложений которую можно использовать как для приемочного так и для системного тестирования. Ключевую роль при этом играет Ruby-библиотека Watir (Web Application Testing In Ruby). Библиотека Watir позволяет запрограммировать действия браузера Internet Explorer на языке Ruby. Таким образом можно автоматизировать значительную часть ручной работы тестеров по заполнению форм, переходу по ссылкам, проверке User-Stories т.д.

Библиотека Watir

Для управления браузером библиотека Watir использует протокол OLE. Это накладывает определенные ограничения как на выбор платформы, так и на выбор браузера. Так, на момент написания этих строк Watir работает только под Windows и только с Internet Explorer. Не отчаивайтесь раньше времени если у вас другая система или вы пользуетесь другим браузером! Существуют версии Watir для Firefox и для Safari:
  • FireWatir - работает с Firefox под Linux, Windows и Mac;
  • SafariWatir - работает с Safari под Mac.
В перспективе разработчики планируют объединить все три версии в один проект. Отмечу, что аналоги Watir есть и для других языков программирования:
  • Watij - версия Watir для Java;
  • WatiN - версия Watir для .Net;
  • BrowserUnit - еще одна версия Watir для .Net.
Очень подробный каталог инструментов, аналогичных Watir можно найти тут. Почти наверняка вы найдете подходящее решение для вашей платформы и языка программирования. В этой же статье речь пойдет только об оригинальной версии Watir.

Установка

Если вы подключены к интернету напрямую, то для установки Watir достаточно всего одной команды:
gem install watir

Bulk updating Gem source index for: http://gems.rubyforge.org
Install required dependency win32-process? [Yn] Y
Install required dependency windows-pr? [Yn] Y
Install required dependency windows-api? [Yn] Y
Install required dependency win32-api? [Yn] Y
Select which gem to install for your platform (i386-mswin32)
1. win32-api 1.2.0 (ruby)
2. win32-api 1.2.0 (x86-mswin32-60)
3. win32-api 1.1.0 (x86-mswin32-60)
4. win32-api 1.1.0 (ruby)
5. Skip this gem
6. Cancel installation
> 2
Install required dependency win32-api? [Yn] Y
Select which gem to install for your platform (i386-mswin32)
1. win32-api 1.2.0 (x86-mswin32-60)
2. win32-api 1.2.0 (ruby)
3. Skip this gem
4. Cancel installation
> 1
Install required dependency activesupport? [Yn] Y
Successfully installed watir-1.5.6
Successfully installed win32-process-0.5.9
Successfully installed windows-pr-0.9.4
Successfully installed windows-api-0.2.4
Successfully installed win32-api-1.2.0-x86-mswin32-60
Successfully installed win32-api-1.2.0-x86-mswin32-60
Successfully installed activesupport-2.1.1
Installing ri documentation for watir-1.5.6...
Installing ri documentation for win32-process-0.5.9...
Installing ri documentation for windows-pr-0.9.4...
Installing ri documentation for windows-api-0.2.4...
Installing ri documentation for win32-api-1.2.0-x86-mswin32-60...
Installing ri documentation for win32-api-1.2.0-x86-mswin32-60...
Installing ri documentation for activesupport-2.1.1...
Installing RDoc documentation for watir-1.5.6...
Installing RDoc documentation for win32-process-0.5.9...
Installing RDoc documentation for windows-pr-0.9.4...
Installing RDoc documentation for windows-api-0.2.4...
Installing RDoc documentation for win32-api-1.2.0-x86-mswin32-60...
Installing RDoc documentation for win32-api-1.2.0-x86-mswin32-60...
Installing RDoc documentation for activesupport-2.1.1...
Если вы подключены через прокси, то перед инсталляцией потребуется задать переменную окружения http_proxy в следующем виде:
http://user:password@host:port
Для установки переменной окружения выберите "Мой компьютер" -> "Свойства" -> "Дополнительно" -> "Переменные среды"-> "Создать".

После установки запустите интерактивную консоль Ruby irb и наберите:
irb(main):001:0> require 'watir'

=> true

irb(main):002:0>
Если при загрузке модуля watir не возникло ошибок, значит установка прошла успешно.

Пример

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
# simple_example.rb
#
# Александр Симаков, <xdr (тчк) box на Google Mail>
# http://alexander-simakov.blogspot.com/
#

# Подключаем библиотеку Watir
require 'watir'

# Открываем новое окно IE
ie = Watir::IE.new

# Переходим на страницу Google
ie.goto "http://www.google.ru/"

# Заполняем поисковый запрос
ie.text_field(:name, "q").set "Watir home page"

# Нажимаем на кнопку "Мне повезет!"
ie.button(:name, "btnI").click

# Проверяем, есть ли на странице указанный текст
if ie.text.include? "Web App Testing in Ruby"
puts "Yes!"
end

Итак, давайте разберемся как работает эта программа. В начале мы открываем новое окно Internet Explorer. Отмечу, что Watir также позволяет подключаться и к уже открытым окнам. Нужное окно при этом можно найти либо по ссылке, которая указана в адресной строке, либо по заголовку окна.

Далее мы переходим на сайт Google. На главной странице имеется поле для ввода запроса и две кнопки. Watir позволяет искать элементы расположенные на странице по многим параметрам: по атрибутам id, name, class, по заголовку, по ссылке, по порядковому номеру, по выражению xpath и т.д. В зависимости от типа элемента к которому вы хотите обратиться этот список может несколько отличаться. Так в строке 18 листинга мы обращаемся к текстовому полю у которого атрибут name имеет значение q. Если такой элемент существует, то Watir вернет объект класса TextField. В этом классе определен метод set, который заполняет текстовое поле: мы хотим найти домашнюю страницу Watir.

Теперь нажмем на кнопку "Мне повезет!". В отличие от обычного поиска мы автоматически перейдем по самой релевантной ссылке. Поскольку наш запрос достаточно точен мы с очень высокой долей вероятности попадем на домашнюю страницу проекта Watir.

Отмечу, что библиотека Watir позволяет не только находить объекты по различным критериям и манипулировать ими, но и анализировать результат. Так в строке 24 листинга мы проверяем содержит ли страница на которую мы перешли строку "Web App Testing in Ruby". Эту возможность можно использовать для написания модульных тестов.

IE Developer Toolbar

Неоценимую помощь в написании тестовых сценариев оказывает IE Developer Toolbar - специальная отладочная панель для Internet Explorer. С ее помощью можно без труда просмотреть атрибуты любого элемента на странице:


Скачать IE Developer Toolbar можно отсюда (~ 700 Kb). В качестве альтернативы можно также попробовать другую панель - DebugBar.

Интерактивная консоль Ruby

Если при написании тестового сценария вы зашли в тупик, например, не можете найти элемент, генерируемый автоматически при помощи JavaScript, попробуйте irb - интерактивную консоль Ruby. Это незаменимый и универсальный инструмент Ruby-разработчика на все случаи жизни. Продемонстрируем методику использования irb на простом примере:
irb(main):001:0> require 'watir'

=> true

irb(main):002:0> ie = Watir::IE.new

=> #<Watir::IE:0x340db40 @ole_object=nil, @typingspeed=0.08 ...

irb(main):003:0> ie.goto "http://www.google.ru/"

=> 1.015

irb(main):004:0> ie.show_all_objects

-----------Objects in page -------------
...
hidden name=hl id= value=ru alt= src=
text name=q id= value= alt= src=
submit name=btnG id= value=Поиск в Google alt= src=
submit name=btnI id= value=Мне повезёт! alt= src=
radio name=lr id=all value= alt= src=
radio name=lr id=il value=lang_ru alt= src=
hidden name=aq id= value=f alt= src=
hidden name=oq id= value= alt= src=
...
=> nil

irb(main):005:0> ie.button(:name, "btnG").flash

=> nil

irb(main):006:0>

В этом примере мы загрузили библиотеку Watir, открыли новое окно, перешли на сайт Google и попросили вывести все доступные на данной странице объекты. В этом списке имеются две кнопки: btnG и btnI. Последняя команда заставляет кнопку "Поиск в Google" мерцать желтым цветом некоторое время. Этот прием удобно использовать для поиска элементов.

Что дальше

В этой статье мы познакомились с библиотекой Watir. Это очень мощный и гибкий инструмент с помощью которого можно автоматизировать тестирование любого web-приложения. За время существования проекта вокруг него сформировалось внушительное сообщество пользователей. На WiKi-портале сообщества можно найти статьи, обзоры, учебники, FAQ, спецификации и другую полезную информацию по Watir. Заходите и учитесь!

Статья опубликована на портале CITForum