вторник, 24 марта 2009 г.

Selenium

(описание безопасного прохождения мимо грабель, на которые уже наступали)

Selenium IDE



  1. Скачать и установить дополнение к FF http://release.seleniumhq.org/selenium-ide/1.0-beta-2/selenium-ide-1.0-beta-2.xpi [в меню "Инструменты" FF появится пункт "Selenium IDE"]
  2. Запуск Selenium IDE осуществляется выбором вышеозначенного пункта меню. В результате получаем окно:
  3. Это у нас GUI интерфейс для записи "каркаса" тестов. (Посмотрел? Теперь можно закрыть- он нам пригодится позже.)

Далее:

Java


  • устанавливаем Java (http://java.com/ru/download/manual.jsp)

PHP (+PHPunit и пр...)

  • устанавливаем php (http://ru.php.net/distributions/php-5.2.9-1-win32-installer.msi)
  • Заходим в папку с установленным php и ищем файл go-pear.bat (php\go-pear.bat)
  • Запускаем go-pear.bat
  • Последовательно выполняем в этой папке (предварительно открыв командный интерпретатор) команды:
  • pear channel-discover pear.phpunit.de
  • pear install channel://pear.phpunit.de/PHPUnit
  • pear install channel://pear.php.net/Testing_Selenium-0.4.3

Selenium RC server

  • Скачиваем Selenium RC server (http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/selenium-remote-control-1.0-beta-2-dist.zip)
  • Распаковываем архив
  • Заходим в папку selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2
  • Создаем в этой папке bat файл с следующим текстом :
java -jar C:\POLIGON\Selenium\RC\selenium-remote-control-1.0-beta-2\selenium-server-1.0-beta-2\selenium-server.jar -interactive
(путь к файлу указывать естественно свой)
прим. Этот шаг для тех кто не любит лишний раз вбивать команды ручками... Мазохистам- можно пропустить.
  • Сохраняем батник (к примеру как rcs-start.bat).

Подготовка завершена!

==================================================================================================

Ключ на старт!



Запускаем сервер (rcs-start.bat)
Видим окно cmd:

"Что бы это значило?" о_О ...
Для нас важны строки 8 и 10
8- сервер слушает порт 4444 на локальной машине (0.0.0.0)
10- сервер стартовал в интерактивном режиме ("Entering interactive mode...")


Для остановки сервера достаточно передать ему команду "exit"- в таком случае он сам остановит все сервисы, почистит временные файлы и аккуратно прикроет за собой окно.

===============================================================================================================

Проверка всех систем...


Теперь проверим работоспособность связки.

Для этого:
========
1) создадим простенький тест с помощью Selenium IDE состоящий из шести шагов:
    • открыть адрес http://baza-winner.ru
    • проверить корректность заголовка (Главная - База WinNER)
    • кликнуть на ссылку "Новичкам"
    • проверить соответствие заголовка (Новичкам - База WinNER)
    • проверить адрес страницы (http://baza-winner.ru/novice.sitedoc.html)
    • вернуться туда, откуда пришли (http://baza-winner.ru/)
  • Для создания этого теста
    • запускаем Selenium IDE
    • выбираем в меню File> New TestCase
    • первой строкой прописываем команду
      • command - open
      • target - http://baza-winner.ru
    • перходим в FF на нужный адрес http://baza-winner.ru
    • включаем запись в IDE
    • делаем активным окно браузера с тестируемым ресурсом
    • кликаем по странице ПКМ
    • Из меню ПКМ выбираем "VerifyTitle=..."
    • кликаем ЛКМ по ссылке "Новичкам"
    • На странице "Новичкам" из меню ПКМ выбираем "VerifyTitle=..."
    • Возвращаемся в IDE и останавливаем запись
    • Теперь вместо команд "click" прописываем "clickAndWait" (это "опционально"- на случай, если страница грузится медленно)
    • Далее последними командами прописываем:
        1. verifyLocation - http://baza-winner.ru/novice.sitedoc.html
        2. goBack
        3. verifyLocation - http://baza-winner.ru/
  • Далее выбираем в меню IDE пункт File>Export TestCase As> PHP Selenium RC
  • В диалоге сохранения файла указываем путь и имя с расширением (к примеру bw.php)

Вуаля! Пробный тест в php готов.
=======

А теперь попробуем на этой GUI-не взлететь...


2) выполним тест:
  • открыть окно командного интерпретатора (cmd)
  • перейти в директорию с нашим тестом
  • выполнить команду "phpunit bw.php"
должны запуститься два окна браузера: одно с Selenium RC, второе с тестируемым ресурсом:


А в это время в окне RC server-a и в окне теста отображается следующее:


На скриншоте видно сообщение о результате выполнения теста

"C:\POLIGON\Selenium\tests\bw\Ready>phpunit bw.php
PHPUnit 3.3.15 by Sebastian Bergmann.

.

Time: 33 seconds <время выполнения>

OK (1 test, 4 assertions) <1>"


В случае ошибки при выполнении теста сообщение будет подобно нижеследующему (для получения этого сообщения я немного подправил тест - указал заведомо некорректный адрес проверки verifyLocation):

"C:\POLIGON\Selenium\tests\bw\Ready>phpunit bw.php
PHPUnit 3.3.15 by Sebastian Bergmann.

F

Time: 25 seconds

There was 1 failure:

1) testMainPage
(bazaWinnerTest)
Failed asserting that is equal to .

FAILURES!
Tests: 1, Assertions: 4, Failures: 1.< тест- 1, проверки- 4, провалено проверок- 1>








Но в нашем случае все прошло удачно!
Вуаля! Тест выполнен, а значит связка - работает!

Можно приступать к созданию, корректировке и отладке тестов...
=======================================================================================================

"А что у него унутре?"


Вкратце разберем файл нашего теста (я, опять же, его слегка изменил для наглядности):

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
/*Это файл в котором содержатся необходимые нам функции*/

class bazaWinnerTest extends PHPUnit_Extensions_SeleniumTestCase

/*ну а это наш класс- обзываем как хотим (но- без фанатизма!)*/
{
function setUp()
/*эта функция для настройки тестирования. Выполняться в качестве теста она не будет*/
{
$this->setBrowser("*chrome");

/*тут указывается браузер, в котором мы будем тестировать наш ресурс. Возможные значения "*iexplore","*firefox","*opera","*chrome","*safari","*custom" и пр. (в документации на сайте разработчика должно быть...)*/

$this->setBrowserUrl("http://baza-winner.ru/");

/*тут указывается базовый URL тестируемого ресурса*/
}

function testMainPage()
/*все функции начинающиеся на "test..." будут выполняться в качестве тестов, причём для каждой будут запущены (и по завершении- закрыты) два окна браузера: одно с Selenium RC, второе с тестируемым ресурсом. Что увеличивает время тестирования, но упрощает чтение логов*/

{
$this->open("http://baza-winner.ru");
/*команда открытия начального URL */

try {
$this->assertEquals("Главная - База WinNER", $this->getTitle());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*команда проверки соответствия заголовка (Title) заключена в конструкцию "try... cath..." чтобы не вызывать прерывания выполнения теста в случае ошибки времени исполнения.
В селениуме это команда "Verify". В отличии от "Assert", которая в php выглядит как "$this->assertEquals("Главная - База WinNER", $this->getTitle());" и в случае ошибки - прерывает выполнение всего теста */

$this->click("link=Новичкам");

/*клик по ссылке*/

$this->waitForPageToLoad("30000");

/*ожидаем загрузки страницы 30 секунд (время задержки- в миллисекундах)*/

try {
$this->assertEquals("Новичкам - База WinNER", $this->getTitle());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Теперь проверяем соответствие заголовка открывшейся страницы*/

try {
$this->assertEquals("http://baza-winner.ru/novice.sitedoc.html", $this->getLocation());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Теперь проверяем URL открывшейся страницы*/

$this->goBack();

/*Возвращаемся на страницу, с которой сюда пришли*/

try {
$this->assertEquals("http://baza-winner.ru/", $this->getLocation());
} catch (PHPUnit_Framework_AssertionFailedError $e) {
array_push($this->verificationErrors, $e->toString());
}
/*Снова проверяем URL- туда ли мы вернулись?*/
}
function testNovicePage()
{
/*Тут мы можем написать ещё одну функцию проверки (к примеру- проверка следующей страницы, либо просто - другой тест)
и она будет выполнена с перезапуском браузера*/
}
}
?>

Итого - пожелания:

1) использовать Assert только в том случае, если при отсутствии проверяемого элемента дальнейшее прохождение теста невозможно либо бессмысленно!
2) при переходах по ссылкам между страницами стоит ставить clickAndWait вместо click иначе есть шанс получить Failure при долгой загрузке страницы.
3) ориентироваться на элементы лучше по XPath локаторам (постараюсь описать чуть позже, но самая полная информация тут http://www.w3.org/TR/1999/PR-xpath-19991008.html ).
4) Не лепить тестирование всего веб-ресурса в одну функцию, а разбивать на логически связанные "паттерны".
5) Ну и "PHP- наше всё!" (
http://www.spravkaweb.ru/php/
http://www.php.net/manual/ru/
http://phpstudy.ru )

to be continued...
==========================================================================================================
:::::::::::::::::::::::::::::::::::::::::::::::::::::http://x-actly.blogspot.com/2009/03/selenium.html:::::::::::::::::::::::::::::::::::::::::::
==========================================================================================================
Все идеи/находки/результаты исследований - постить сюда (то бишь- ниже этого текста)! Потом по необходимости перенесем в основной текст.

Галиматья из под коня

1) Залить на Гдрайв утилитку и dll ку 2) Наполнить блог материалами 3) Почистить/пересоздать аккаунты Утилита Dll Про wiki сайт