Post on 29-Nov-2014
description
Автоматизация Flex-приложений с помощью Selenium RC
Игорь Хрол
Немного о себе
• Игорь Хрол• Специализируюсь на
автоматизации тестирования с 2006 года
• Инструменты:– Selenium, HP QTP, Watir,
TestComplete, Jmeter• E-mail: khroliz@gmail.com
Что будет в докладе?
• Немного о проекте• Какой стоял выбор для автоматизации
Flex’a?• Сравнение инструментов• Выбранное решение и архитектура• Tips&Tricks• Текущие результаты работы
О проекте
• www.atg.com (с января 2011-го – часть Oracle)
• Середина 2009-го – вся UI-автоматизация на HP QTP
• Конец 2009-го – первые версии приложения с Flex и решение начать автоматизацию на Selenium
Варианты Flex-автоматизации
• HP QTP + Flex QTP add-in
• Selenium-Flex API + Selenium RC + Java
• FunFX + Watir + Ruby
Результаты оценки – скорость работы (JSP)
QTP Selenium Watir0
10
20
30
40
50
60
JSP - IEJSP - Firefox
Время выполнения сценария в минутах
Цикличное создание-удаление 100 сущностей в JSP
Результаты оценки – скорость работы (Flex)
QTP Selenium0
5
10
15
20
25
30
Flex - IEFlex - Firefox
QTP не поддерживает Firefox с Flex
Цикличное создание-удаление 100 сущностей вo Flex
Время выполнения сценария в минутах
Результаты оценки – скорость работы (Flex)
QTP Selenium0
50
100
150
200
250
300
Flex - IEFlex - Firefox
QTP не поддерживает Firefox с Flex
Цикличная навигация по Flex – 100 раз
Время выполнения сценария в минутах
Недостатки QTP• Нестабильная работа• Распознавание UI-объектов с учётом
практически всей иерархии объектов• Отсутствие удобного языка и средств
разработки
Схема работы Selenium Flex API
Браузер
Selenium Core
Тестируемое приложение
Selenium RCHTTP
Код тест-кейса (С#, Java, Python, Ruby и
другое)
Flex
ExternalInterface
user-extensions.js
Поддержка различных браузеров
• Нужна ли вообще?– Различные версии IE
– Google Chrome, Safari, Opera…– Ну и конечно Firefox
Структура фреймворка - локаторы• Подобие ХPath, но не совсем• Общая структура:– property:value– property1:value1,property2:value2– property1:value1/property2:value2– property1.subproperty11:value11,property2:value
2/property3.subproperty31:value31• Примеры…
Пример локатора
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/className:BrowsePanel/id:ancestorNavBar/id:dropdownButtonArea/id:nodeText
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/className:BrowsePanel/id:ancestorNavBar/id:dropdownButtonArea/id:nodeText
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/className:BrowsePanel/id:ancestorNavBar/id:dropdownButtonArea/id:nodeText
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/className:BrowsePanel/id:ancestorNavBar/id:dropdownButtonArea/id:nodeText
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/className:BrowsePanel/id:ancestorNavBar/id:dropdownButtonArea/id:nodeText
Пример локатора
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/name:mainPanel/className:HBox,numChildren:2,getChildAt(0).className:PropertyStatusIndicatorPanel,getChildAt(1).getChildAt(0).getChildAt(0).text:SKUs/styleName:defaultPropertyLabel
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/name:mainPanel/className:HBox,numChildren:2,getChildAt(0).className:PropertyStatusIndicatorPanel,getChildAt(1).getChildAt(0).getChildAt(0).text:SKUs/styleName:defaultPropertyLabel
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/name:mainPanel/className:HBox,numChildren:2,getChildAt(0).className:PropertyStatusIndicatorPanel,getChildAt(1).getChildAt(0).getChildAt(0).text:SKUs/styleName:defaultPropertyLabel
id:merchandising.manageCommerceAssets_0,root.numModalWindows:0/name:mainPanel/className:HBox,numChildren:2,getChildAt(0).className:PropertyStatusIndicatorPanel,getChildAt(1).getChildAt(0).getChildAt(0).text:SKUs/styleName:defaultPropertyLabel
Структура фреймворка
• Соотношение: – класс из Flex’a ↔класс из Java-фреймворка
Структура фреймворка• Java-класс инициализируется:– своим локатором– локатором контейнера
Структура фреймворка
• «Склейка» локаторов на уровне базового конструктора
Синхронизации нет???
Структура фреймворка - синхронизация
• При обращении к Java-объекту – ждём соответствующего объекта на UI
Tips&Tricks – FlexSpy
• Особенности:– Запускается внутри флеш-объекта (может
вызывать побочные эффекты)– Лучше добавить его вызов на какую-нибудь
комбинацию клавиш
FlexSpy
Обнаружение свойств объектов FlashInspector
• Плагин к Firefox• Требует:– Установки Firebug– Debug-версию FlashPlayer’а
FlashFirebug – другой аналог
Сложности
• Альтернативная разработка Selenium Flex API своими силами– Улучшена система локаторов– Исправлено несколько дефектов– Разработаны методы для работы с
DataGrid’ами– Расширено количество вызываемых событий
• Надеемся скоро это внести в виде своей доли в проект sfapi
Сложности
• «Нативные» нажатия на кнопки – например для закачивания/скачивания файлов
Решение: AutoIT• Создание выполняемых exe-файлов• Использование DLL через JNA
Интеграция с существующим кодом на QTP
• Цель: выполнение действий во Flex-е из QTP с помощью существующего Java-кода
• Алгоритм:– Запуск браузера из Selenium’a– Сохранение сессии– Работа с отрытым браузером из QTP– Вызов отдельных java-процессов с передачей в
них сессии
Поддержка WebDriver (Selenium 2)
Браузер
Тестируемое приложение
WebDriver API
Flex
ExternalInterface
Код тест-кейса (С#, Java,
Python, Ruby и другое)
JavaScript evaluation
Результаты
• ~400k строк кода• ~4500 java-классов (~3500
автоматизированных тест кейсов)
• Около 5 суток работы тестов
• Расширяемое решение
Вопросы