21
Автоматизация тестирования сложных Flash-интерфейсов Комлев Александр, Rambler, отдел QA

Client Side Autotesting Flash

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Client Side Autotesting Flash

Автоматизация тестирования сложных

Flash-интерфейсов

Комлев Александр, Rambler, отдел QA

Page 2: Client Side Autotesting Flash

Формулировка исходной задачи

• Что нужно тестировать?Сложные клиентские flash-приложения – многопользовательские (realtime) игры, записывающие аудио/видео проигрыватели.

• Зачем автоматизировать?Чрезвычайно неэффективное использование человеческих ресурсов при ручном тестировании, либо отсутствие гарантий качества продукта.

• Что нам в итоге нужно?Простое, быстрое, хорошо интегрированное решение. Тут ничего нового и оригинального.Ключевой момент: поддержка и написание тестов не должны требовать привлечения высококвалифицированных кадров.

Page 3: Client Side Autotesting Flash

Как можно тестировать?

• Топологический принципПодготовка сценариев на основе взаимного расположения элементов интерфейса относительно друг друга.

Ненадежный и абсолютно не универсальный способ. Эффективность трудозатрат по созданию, поддержке и

отладке автотестов сравнима с исходной.

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

Очевидных проблем нет, надо разбираться что к чему.

Page 4: Client Side Autotesting Flash

Обзор существующих решений

• Признанные «крутые» решения

• Test Complete by AutomatedQAMacromediaFlashPlayerActiveX window class, написанный с использованием Microsoft Active Accessibility (MSAA Open Applications plug-in)

Достоинства- Универсальная, мощная, прекрасно поддерживаемая

система.- Вместе с Flash поддерживается и Flex.

Недостатки- Поддержка только операционных систем линейки Windows.- Поддержка одного типа браузеров – Internet Explorer.- Платное и весьма недешевое решение.

Page 5: Client Side Autotesting Flash

Обзор существующих решений

• Quick Test Professional by MercuryMercury и Macromedia еще в 2005 году договорились о поддержке Flex в QTP.

Кажется, решение найдено?

Достоинства- Универсальная, мощная, прекрасно поддерживаемая система.

- Удобная работа с мощным mx.automation.* package из Flex Framework.

Недостатки- Поддержка только операционных систем линейки Windows.

- Поддержка одного типа браузеров – Internet Explorer.- Платное и весьма недешевое решение.

- Поддержка Flex, а не Flash.

Page 6: Client Side Autotesting Flash

Обзор существующих решений

• «Гиганты» не поддерживающие Flash

• Borland SilkTestСпособен работать с Flash только как с целым нераздельным объектом.

• IBM Rational RobotПросто не поддерживает Flash, при этом полностью поддерживает технологию Java Applets :)

Page 7: Client Side Autotesting Flash

Обзор существующих решений

• SeleniumБесплатное и мощное средство для автоматического тестирования.

Достоинства- Универсальная, мощная, прекрасно поддерживаемая система.

- Полная кроссплатформенность и кроссбраузерность.

- Open Source.- Поддержана работа с Flash с использованием

Macromedia Flash JavaScript Gateway.

Недостатки- Нестабильность работы отдельных компонентов.

- Поддержка Macromedia Flash JavaScript Gateway ограничена.

Page 8: Client Side Autotesting Flash

Обзор существующих решений

• Компоненты, библиотеки

• AFLAXAsynchronous Flash and XML, автор (Paul Colton) позиционирует проект как «замену не поддерживаемому Macromedia Flash JavaScript Gateway».Плохое решение с «неработающим» подходом.

• Flash / JavaScript Integration KitИдея заключается в использовании FlashProxy для коммуникации с целевым объектом с использованием LocalConnection.Неплохое решение с интересным, но «неправильным» подходом.

Page 9: Client Side Autotesting Flash

Критерии поиски «правильного» решения

• Кроссплатформенность

• Кроссбраузерность

• Open Source, либо Open Source + Home made

Ключевой момент: Требования относятся как к способу взаимодействия с Flash-объектами, так и платформе для запуска автоматических тестов.

Page 10: Client Side Autotesting Flash

Macromedia Flash JavaScript gateway

…или «Scripting with Flash»• Поддержка платформ и браузеров

Netscape Navigator 3.0 и выше (с поддержкой LiveConnect и Java; Windows 95/98/NT/2000 или MacOS).Internet Explorer 3.0 и выше (с поддержкой ActiveX; только Windows 95/98/NT/2000).

• Требования к OBJECT и EMBEDТег <OBJECT> и <EMBED> должны иметь свойство ID/NAME соответственно.

• Доступные flash-методы

GetVariable() & SetVariable(), LoadMovie(), GotoFrame() и т.д.

FSCommand (command, args) - наиболее востребованный и интересный метод (тип данных – только String, ограничение на количество передаваемых аргументов).

Page 11: Client Side Autotesting Flash

External Interface Class• Поддержка платформ и браузеров

- Internet Explorer 5.0 и выше (без ограничения по платформам).

- Любые контейнеры (например, desktop-приложение), использующие экземпляр Flash Player ActiveX control.

- Любой браузер с поддержкой NPRuntime interface.

• Firefox 1.0 и выше• Mozilla 1.7.5 и выше• Netscape 8.0 и выше• Safari 1.3 и выше• Смело добавляем сюда – Opera 8 и выше (NPAPI поддерживает с 2004

года).

Page 12: Client Side Autotesting Flash

External Interface Class• Качественно новые возможности

- Нет ограничения по количеству передаваемых аргументов и длине имен аргументов.- Поддержка дополнительных типов данных аргументов (Boolean, Number).- Получение результатов вызова.

FSCommand() поддерживается, можно использовать как и раньше. Перенесено в flash.system.package.

• Известные ограничения

- External Interface недоступен в случае, если flash-объект расположен в теге <form>. Проблема решена на уровне JavaScript. Steve Kamerman создал патч SWFFormFIX, который внесен в библиотеку SWFObject.

- External Interface недоступен в случае, если flash-объект расположенный в теге <object> в id содержит символ определенный в JavaScript как оператор: +, *, /, \, ., и т.д.

Page 13: Client Side Autotesting Flash

Как всё это работает?

External Interface ClassExecuteCallBack(script);

CallBackEvalFunction(script);

FLASH application

Return Output results;

FlashObj.ExecuteCallBack(script);

Input scriptOutput results

JavaScript applicationvar FlashObj = findSWF(movieName);

External Interface ClassRegisteredCallBack(args);

FunctionBindedWithCallback(args);

FLASH application

Return Output results;

FlashObj.RegisteredCallBack(args);

Input argsOutput results

JavaScript applicationvar FlashObj = findSWF(movieName);

Page 14: Client Side Autotesting Flash

Рабочий пример

External Interface ClassExternalInterface.addCallback("ui_get_text",this,_getWindowText); ExternalInterface.addCallback("ui_press_ok",this,_okRelease); ExternalInterface.addCallback("ui_press_cancel",this,_cancelRelease

);

UIManager

FLASH application

Return Output results; FlashObj.ui_press_ok(windows_id);

JavaScript applicationvar window_id;var FlashObj = findSWF(movieName);

function ui_callback (window_id_flash, window_classname_flash) { window_id = ui_callback.arguments[0];

}

function ui_remove (window_id_flash_removed) { window_id-- ;

}

public function set ID ( ID : Number ) : Void { _id = ID;ExternalInterface.call("ui_callback",ID,_className); }

AS->JS call

Создание окна

public function remove():Void { ExternalInterface.call("ui_remove",_id); _container.removeMovieClip();

}

Закрытие окна

AS->JS call

Page 15: Client Side Autotesting Flash

Принципиальная схема решения

Selenium JavaScript CORE

Selenium Remote Control

Test::BuilderВнутренний тестовый Framework

Selenium Perl ClientTest::WWW::Selenium

WWW::Selenium

Браузер

HTTP-server

Test::More

Page 16: Client Side Autotesting Flash

Модификация Selenium Core

• Внесение изменений в selenium-api.js

Пример:

Selenium.prototype.doFlashPressOk = function(locator, window_id) {

/** * Press OK button in User Dialog. *

* @param locator the locator of the flash object

* @param window_id User Dialog ID */

var flashObj = this.page().findElement(locator); flashObj.ui_press_ok(window_id);

}

Page 17: Client Side Autotesting Flash

Сборка Selenium

• Сборка Selenium Core - mvn -Dnotest=1 -Dmaven.test.skip=true clean install

• Сборка Selenium RC + xslt-генерация Perl client - mvn -Dnotest=1 -Dmaven.test.skip=true -Pperl install

• Установка Perl Client – nmake install

Примечание: Для сборки проекта необходимы Ant, Maven, javac, nmake (make).

Page 18: Client Side Autotesting Flash

Пример автоматического тестаuse WWW::Selenium;

my $sel = WWW::Selenium->new( host => "localhost",

port => 4444,

browser => "*iexplore",

browser_url => "http://localhost",

);

my $flashobj = "sample";

my $window_id = 1;

$sel->start;

$sel->open("http://localhost/flash/testJS.html");

$sel->flash_press_ok($flashobj, $window_id); $sel->stop;

Page 19: Client Side Autotesting Flash

Проблемы• Необходимо разрабатывать дополнительный Action Script

код- Это фактически единственный серьезный минус.

Решение: Использовать предложенную схему генерации callback’ов, но в данном случае требуется более высокая квалификация разработчика тестов.

• Сложности интеграции с уже используемыми home-made решениями.

Page 20: Client Side Autotesting Flash

Варианты использования• Забудем про тестирование

Где можно эффективно использовать такие возможности?

- HTML-элементы управления содержимым flash-объектов.

- Контекстный поиск.

- Интерактивные flash-элементы, реагирующие на действия пользователя.

Page 21: Client Side Autotesting Flash

Автоматизация тестирования сложных Flash-интерфейсов Комлев Александр, Rambler, отдел QA

Вопросы?