Загрузка...

вторник, 9 марта 2010 г.

[Javascript, Watir] Функциональное тестирование

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

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

Средство для тестирования я выбрал нестандартное — не 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

Запустите в консоли, и смотрите на "представление" :)

Теперь мне нужно описать тесты, которые будут проверять работоспособность моей оконной реализации. Напомню, какой функционал предоставляет мое решение:
  • Перемещение окна
  • Изменение размеров
  • Сворачивание в низ страницы
Открывать браузер, искать поля ввода — это не сложно. Теперь давайте разберемся, как управлять мышой, как "таскать" и "ресайзить" наши веб-окна. Тут без активного интерактива не обойтись, поэтому надо воспользоваться одной dll-кой, которую нужно зарегистрировать в системе. Для Windows это делается через 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 — прошу отметиться в комментариях, с какими полезностями вы можете поделиться.

blog comments powered by Disqus


 
^

Powered by BloggerCreative Commons License