Моя оконная реализация — отличный полигон для знакомства с различными техниками программирования. В этой статье я хочу рассказать про функциональное тестирование. Оно мне пригодится в свете того, что я собираюсь сделать. Я хочу быть уверенным, что мои изменения не будут вести к регрессии (к появлению ошибок в отлаженных участках кода). О плюсах тестирования вы и сами знаете — с ним лучше, чем без.
Хочу заострить ваше внимание, что буду проводить не модульное (юнит-) тестирование, а функциональное. Согласно википедии, таким образом проверяются функции приложения, а не отдельных его модулей.
Средство для тестирования я выбрал нестандартное — не Selenium, а Watir. Кстати, есть еще Sahi, но с ним разберусь в следующий раз (сравнительная таблица). Я остановился на Watir, потому что он мне нравится :) Во-первых, в качестве скриптового языка используется Ruby (классный язык), во-вторых, с ним проще начать работать, чем с Selenium (не въехал я в него).
Установка Watir. Проследуйте по ссылке с инструкциями. Вам надо поставить Руби (лучше всего версии 1.8), а потом и нужные пакеты через gem install watir.
Теперь давайте проверим Watir в работе на простом примере. Напишем тест, смысл которого открыть поиск гугла и найти статьи этого блога.
require 'rubygems'
require 'watir' # the controller
require 'test/unit'
class TC_test_suite < Test::Unit::TestCase
def test_ask_google_for_codeblogz
puts 'Init browser'
b = Watir::Browser.new
puts 'Go to Google Search'
b.goto("http://www.google.com")
puts 'Put search query'
b.text_field(:name, "q").set "watir site:codeblogz.ru"
puts 'Click button to start searching'
b.button(:name, "btnG").click
puts 'Check whether codeblogz has post about Watir'
assert(b.text.include?("www.codeblogz.ru") )
puts 'End of test'
end
endЗапустите в консоли, и смотрите на "представление" :)
Теперь мне нужно описать тесты, которые будут проверять работоспособность моей оконной реализации. Напомню, какой функционал предоставляет мое решение:
- Перемещение окна
- Изменение размеров
- Сворачивание в низ страницы
regsvr32 C:\ruby\lib\ruby\gems\1.8\gems\watir-1.6.5\watir\AutoItX3.dll. И нам открываются новые возможности :) А именно: можно имитировать перемещение курсора, нажатие и удерживание левой кнопки и др.Но, чтобы таскать окошки, нужно знать их координаты. Координаты можно вычислять через свойства элементов. Без лишней демагогии, привожу код тест-кейса.
require 'rubygems'
require 'watir' # the controller
require 'test/unit'
require 'win32ole'
class TC_test_suite < Test::Unit::TestCase
def test_move_window
puts 'Init browser'
b = Watir::IE.attach(:title , /pss_window functional test/)
b.bring_to_front
b.maximize
puts "Find window with title 'Library capabilities'"
d = b.div(:xpath, "//div[text() = 'Library capabilities']")
top = d.attribute_value("offsetTop")
left = d.attribute_value("offsetLeft")
height = d.attribute_value("clientHeight")
width = d.attribute_value("clientWidth")
y = 110 + top + height / 2
x = 10 + left + width / 2
puts x, y
puts "Start mouse manipulations"
a = WIN32OLE.new("AutoItX3.Control")
a.mousemove(x,y)
a.mousedown
a.mousemove(x+50, y+50)
a.mousemove(x+150, y+50)
a.mousemove(x+150, y+250)
a.mouseup
puts "End"
end
endЭтот тест имеет множество недостатков:
- не работает, если окно браузера закрыто (я пока не разобрался, как заставить IE открывать локальные файлы без подтверждения);
- не определяет реальные координаты элемента (необходимо реализовать цикл);
- да и вообще, проверяет работу только одной функции - перемещения
- слишком простой, и мало чего проверяет — необходимо написать множество тест-кейсов, чтобы можно было перейти к следующему этапу.
Начало положено. Теперь надо подучить Руби и написать более адекватные тесты :) Об этом в следующих статьях.
P.S. Если среди вас есть рубисты, или просто знакомые с Watir — прошу отметиться в комментариях, с какими полезностями вы можете поделиться.

