вторник, 2 июля 2013 г.

Свой опыт с Genie

Итак, теперь, когда мы имеем немого представления об инструменте, я попытаюсь рассказать о своем опыте его использования. Что нужно, что бы записать простой скрипт с Geine? Запущенный сервер, Эклипс и зеленый треугольник UT на флешке (не забываем коннектиться к SWFке). Жмем на значок и запись скрипта пошла! При этом значок становится красным квадратом (ВНЕЗАПНО!), при нажатии на кортоый запись, соответственно, прекращается. Но об этом чуть позже.
Если перед записью скрипта мы выбрали в выпадающем меню пункт "Запись с тупняками" (Record Script At Application Pace),  то все задержки между кликами будут учтены в скрипте.  Запишем что-нибудь самое простецкое, закрытие входных pop-up'ов. Загружаем игру и когда появляется газета, запускаем запись. Покликали, закрыли и остановили. После остановки записи Джин любезно вываливает на окошко с телом скрипта и кнопками "скопировать" и "закрыть" - наше дело сохранить этот скрипт либо в файлик, либо пока прямо в панель Эклипса со скриптами. Получится примерно такое: 


package scripts;
import com.adobe.genie.genieCom.SWFApp;
import com.adobe.genie.executor.GenieScript;
import com.adobe.genie.executor.components.*;
import com.adobe.genie.executor.uiEvents.*;
import static com.adobe.genie.executor.GenieAssertion.*;
import com.adobe.genie.executor.enums.GenieLogEnums;

/**
 * This is a sample Genie script.
 *
//Change name of the class
public class Unnamed extends GenieScript {

public Unnamed() throws Exception

super();
}

@Override
public void start() throws Exception {
//Turn this on if you want script to exit
//when a step fails
EXIT_ON_FAILURE = false;
//Turn this on if you want a screenshot
//to be captured on a step failure
CAPTURE_SCREENSHOT_ON_FAILURE = false;

SWFApp app1=connectToApp("[object Preloader]");
(new GenieDisplayObject("SP^NewspaperPopup:::FP^NEWSPAPER:::SE^closeBtn::PX^0::PTR^0::IX^9::ITR^0",app1)).click(7,11,704,60,0,0,3,false);
(new GenieMovieClip("SP^MessageWindow:::FP^CloseButton:::SE^htmc::PX^25::PTR^0::IX^1::ITR^0",app1)).click(27,18,740,22,0,0,3,true);
}
}

где выделенны маркером те самые Genie ID и после них команда click (). Если аргументы click оставлять пустыми, то нажатие будет выполнено без подведения курсора на элемент. Теперь для того, чтобы запустить наш скрипт, нам понадобится сбросить его в текстовый файлик, обозвать его xxx.java (где xxx должен быть такой же, как и Unnamed - не забыть задать имя в теле скрипта), открыть в эклипсе. Если есть ошибки, редактор эклипса их выделит (в готовом скрипте ошибок конечно нет, но при модификации мы вполне можем что-нибудь напортачить). Следующий этап запуска - выбрать пункт Run Configuration... и в открывшемся окне в пункте New configuration во вкладке Arguments в доме, который построил Джек  строке Program Arguments указать перед .class имя скрипта (оно же имя из public class Unnamed extends GenieScript и
{
public Unnamed() throws Exception:

Т.е. если у меня скрипт называется MC, но и в теле скрипта тоже стоит MC и в классе тоже MC. Возможно, для программистов это очевидно, но я в этом объезьяна, как сказали, как написано в документе, так и описываю :) После этого кликаем Run и переходим к нашей флешке. Во время выполнения скрипта значок на SWFке вверху меняется на красный треугольник без фона.
Как видно, сам кусочек с кликами занимает всего ничего - закрыли пару окон, получили пару строчек. Но это если нам нужно сделать всего пару действий, при более сложных задачах конечно конструкции становятся сложнее. К примеру, скрипт на прохождение HOG-сцены включал в себя считывание текста с плашки, сопоставление текста с соответствующим ему объектом и клик уже непосредственно по идентифицированному объекту. Предметов в HOGe у нас от 60 до 75, для каждой сцены приходилось делать такие библиотеки со связками "текст-объект". И тем не менее, скрипт работает! Если бы получилось таки добить остальные куски и соединить их в комплект, у меня был тест, выполняющий максимальное покрытие вширь функционала за минимальное время. Подозреваю, что на этапе соединения тоже были бы свои проблемы, но увы, опыта в этом деле мне обрести пока не удалось. 

четверг, 27 июня 2013 г.

Genie, основные элементы

UPD: великодушно простите что скрины протухли
Обманула - перед тем, как начать разбираться со скриптами, нам нужно научиться работать с основными элементами, чем мы и займемся.
Итак, мы подняли Genie у себя и запустили эклипс с соответствующим плагином. А дальше? Рассмотрим основные элементы и что умеет наш Джин.
Для начала, чтобы можно было сразу проверять элементы в действии, законнектимся к нашей  SWFке (предварительно запущенной в браузере) - названия в списке могу быть другими, но это ваша SWF

После коннекта мы получим дерево с объектами, а в таблице ниже будут свойства выбранного и, самое важное, genieID - тот самый уникальный идентификатор для каждого (!) объекта.

К объекту можно обращаться через этот идентификатор. Свойства (Property) могут не показывать последнее состояние приложения, однако их можно вызвать - это будет освещено позже.
Итак, мы в коннекте с нашей SWF, видим дерево объектов. Но как в этом дереве найти нужный нам объект? Для этого рассмотрим панельку [тут был скрин, простите, гугл его скушал]
Начнем со значка Лупа. Именно этот элемент позволит нам, кликнув на объекте в SWF, увидеть его в дереве. У этого значка есть два состояния (помимо выключенного):
[тут был скрин, простите, гугл его скушал]
Первое - обычное - позволит найти объект и провзаимодействовать с ним (скликнуть). Второе:
[тут был скрин, простите, гугл его скушал]
кликнет на объект, но без взаимодействия - оно нужно, если вам нужно найти его в дереве, но не скликивать из рабочей области. К примеру, в HOG сцене ( (Hidden Object Game - игры, где на картинке нужно найти заданные объекты) мне нужен ID элемента, но если я кликну на него с взаимодействием (первое состояние), то объект будет отмечен как найденный и просто "уйдет" со сцены, что, мягко говоря, неудобно, если с ним требуется дальнейшая работа. В этом случае второе состояние поиска просто незаменимо. Третье нажатие на Лупу отключит поиск.
Кисточка позволит нам подстветить в SWF выбранный в дереве объект. Просто выделите объект, кликните на кисточку и в SWF вы увидите, что он выделился красным контуром:
[тут был скрин, простите, гугл его скушал]
Линейка позволит получить локальные координаты выбранного объекта. Честно говоря, не пользовалась и в моем случае координаты - не совсем то, к чему хотелось бы привязываться, но все равно круто. Панель с координатами появится в SWF прямо под значком Genie, водите по объектам, а в панельке показываются цифры.
Камера делает скриншот, через который тоже можно будет обратиться к элементу, указав путь и степень толерантности (точность совпадения, с которой будет сравниваться указанный рисунок с искомым на экране - от 0 до 100, чем ниже толерантность, тем точнее Genie будет пытаться определить объект). Эта функция очень удобна, если вдруг в игре или на экране имеется HTMLный элемент, к которому необходимо обратиться. Нужно отметить, что не стоит увлекаться чрезмерной точностью совпадения - при достаточно высокой толерантности Джин может просто не найти объект, соотвественно, при низкой - кликнуть не на тот, что нам нужен. Область скриншота лучше брать с захватом побольше - выше вероятность, что будет кликнут именно указанный, а не похожий объект. Как пользоваться камерой: жмем на значок, затемняется область и появляется крестик, выделяем нужную нам область и после отжатия клавиши мыши будет показано окно с рисунком и кнопками:

Сохранить понятно что делает, Recapture переснимает, с закрытием тоже понятно, а Add Hotspot добавляет на рисунок область, непосредственно в которую будет сделан клик. Т.е. по умолчанию клик буден сделан в центр, но если нам нужно кликнуть на кнопку, которая на рисунке не в центре, то просто задаем "горячую точку" и можем не беспокоится.
Добавить в скрипт клик на указанный рисунок можно используя класс функций Com.adobe.genie.executor.uiEvents.UIImage, например:
new UIImage().clickImage(String imagePath , int… tolerance) 
new UIImage ().clickImageHotspot (String imagePath , int… tolerance)
Запросить свойства объекта (Request Genie Properties of Object) вот та функция, которая пригодится нам в случае, когда просто Property не показывают последние изменения в SWF. К примеру, у меня меняется плашка в SWF, а Genie в свойствах показывает старый текст, нажимаем "Запросить свойства объекта" и получаем развернутый список, где поле text уже обновлено и содержит текущий текст.
Обновить дерево объектов - ну тут понятно, обновляется дерево, однако иногда это не помогает получить обновленные свойства и их нужно запрашивать предыдущей кнопкой.
И наконец несколько пунктов, которые не вынесены на панель, а появляются по клику на стрелочку [тут был скрин, простите, гугл его скушал]
Hide Genie Icon убирает значок  UT с флешки (иногда здорово мешает), минус в том, что только на время пока запущен Эклипс. Впрочем, иногда в разных браузерах значок сам отваливается.
Record Script At Application Pace скрипт будет записан с простоями, т.е. ваши паузы будут учтены в виде wait'ов
Disconect SWF с этим все ясно, отсоединиться от флешки.
Find component by GenieID тоже не требует особых пояснений.
Save Tree XML in File ясно что делает, но у меня не открылось сохраненное дерево, увы. Может кто-то лучше меня разбирается что с этим потом делать, поделитесь.
Вот, собственно, все функции Джина и их с головой достаточно чтобы сделать что-то удобоваримое. К сожалению, на проекте урезали бюджет и я пока не занимаюсь дальнейшей автоматизацией, все что у меня получилось - несколько тестов, не соединенных в слитный комплект, но ни с одни инструментом кроме Джина мне не удавалось добиться даже такого результата: получилось сделать скрипт на прохождение HOG сцен (сцены с предметами, которые нужно найти на ней), делать оплаты (фейковые, с элементами HTML - вот где пригодилось распознавание картинок), пройти туториал. Вероятно, Джин можно использоваться в связке с селениумом, может получится плодотворное сотрудничество. Возможно, опробую на сайте с флешем, если таковой дадут погонять :)
UPD: вот тут как раз человечище связал таки Genie c Webdriver и TestNG, получилось удобно

четверг, 23 мая 2013 г.

Тадааам! Позвольте представить - Genie!

Automated UI Tester for Adobe® ActionScript® is code named as Genie.

Джин - вот то, что поможет нам в автоматизации тестирования флешевых приложений! Джин создан для флеша, не требует доступа к исходному коду или запуска внутри приложения и может запускаться в фоне (в отличии от Sikuli). Его отличительной способностью является умение однозначно определять любой элемент внутри флеша (epic win!). Можно записывать произведенные действия скриптами и запускать их! Правда, после доработки напильником, но по сравнению с тем же Sikuli (сразу оговорюсь, что ничего не имею против самой проги - она отлична и достойна похвал, но для флеша её ценность стремится к нулю) это просто песня.
Что нужно для его запуска? Сам Джин конечно же, Эклипс, дебажный флеш-плеер и немного усилий в продирании по англоязычному гайду.
Итак, начнем.
Тут http://sourceforge.net/adobe/genie/wiki2/FAQ/ как можно догадаться, FAQ. Квитэссенцию прелестей я изложила выше.
Там же можно нажать Files, чтобы перейти к документации и файлам http://sourceforge.net/projects/genie.adobe/files/
В документации есть pdfка UserGuide, в которой очень подробно и хорошо, но на английском. расписывается что к чему и почему. Я постараюсь на русском изложить все, что оттуда удалось выдрать. Сразу оговорюсь, что у меня Винда, а работает эта штука только в опере, хотя написано, что поддерживает все браузеры с флешем (и как раз опера там не указана). Т.е моя конфигурация - Windows 7, Opera.
Итак,
1. Скачать из директории с файлами архив Genie-binary.zip и распаковать его куда угодно.
2. Установить дебажный флеш-плеер, инструкция любезно прилагает ссылку для скачивания  http://www.adobe.com/support/flashplayer/downloads.html (разумеется, выберите подходящий для вашей оси и разрядности)
2. Установить Яву (JDK - Java Development Kit), тоже любезно прилагается ссылка 
3. Ну и поскольку Джин у нас является эклипсовым плагином, то конечно нужен Эклипс, скачать тут
Это все был подготовительный этап, начинается впилка.
4. Наш разархивированный Джин лежит себе на диске с путем [GeniunePath], и этот путь нам еще пригодится.
5. Копируем из нашего  [GeniunePath]\GeniePlugin файлик GeniePlugin.jar и закидываем его в папку с плагинами Эклипса, например D:\Eclipse\Plugins
6. Копируем также из [GeniunePath]\GenieLibrary файл mm.cfg в пользовательскую папку, т.е. C:\Documents and Settings\testuser\
7. Теперь открываем его в блокноте и правим путь к SWFке, должно получится так:
PreloadSWF = [GeniunePath]\GenieLibrary\GenieLibrary.swf (помним, что это шаблон пути, где обитает наш Джин)
8. Дальше шаманство - переходим по ссылке  и, выбрав "Добавить местоположение"

указываем путь к SWFке (это тот самый путь, что мы прописывали в mm.cfg) [GeniunePath]\GenieLibrary\GenieLibrary.swf - зачем это делается, написано в самом окошке. После добавления пути нужно отметить "Всегда разрешать" и просто закрыть это окно.
9. Запускаем сервер Джина (повторюсь, что я поднимала все под Виндой, поэтому понятия не имею что с остальными осями, у прогаммиста под никсом все встало, но Джин не коннектится к SWFке и толку от него получается ноль) из [GeniunePath]\GenieServer - там лежит батник LaunchServer.bat
10. Запускаем Эклипс. Чтобы вытащить наш плагин на свет божий (если он автоматом не подкинулся), выбираем Windows > Show View > Other > Genie > Genie. Рекомендую подглядывать в гайду, там годные скриншоты.
11. Запускаем браузер и в нем любую SWFку, у меня это флешевая игра (ради чего всё и затевалось). На ней теперь в левом верхнем углу должен появится значок Джина:
 . Он будет серым, если батник с сервером не запущен. 
И этот зеленый значок значит, что мы все подняли правильно! Первый этап пройден :) Не переключайтесь, в следующем посте я расскажу сама себе, вызывайте санитаров! как слабать простенький скрипт :)

суббота, 9 марта 2013 г.

В поиске решения

В очередной раз пытаюсь найти решение, связанное автоматизацией регрессионного тестирования. Главная проблема состоит в том, что у нас Flash-приложение. Селениум тут пассует сходу - он не видит флеш от слова "совсем", для него это просто черная дыра (или же я чего-то не знаю о Селениуме), TestComplete тоже сказал что он конечно может нам наклацать по заданным координатам, но ребята, вы же понимаете, да?.. Чуть лучше оказался Sikuli и я было воодушевилась, но все оказалось тоже не так просто - слишком много завязано на графику, а чуть только меняется цвет/масштаб/задержка, все летит в тартарары и приходится переписывать тест. Написание оного, между тем, даже самого простого, с отладкой и корректировкой задержек, занимает никак не менее получаса. В общем, я опять выкусила и плюнула. Теперь у меня очередной виток - жутко надоело проклацывать одно и тоже в то время, когда новые функции проверены только в рамках позитивных тестов. Нет времени поэкспериментировать, покрутить как хочется. Начала снова рыть (я не скажу вам куда меня посылали гугль и яндекс по запросу "автоматизация тестирования flash"), но нигде конкретной информации на эту тему не нашла, увы. Пошла на форум по автоматизации, мучаю теперь старожилов. Посоветовали Роботекс (Robotex), но кроме забавной рекламы в нем я не нашла ничего. С запуском сего шедевра у меня комп начал тормозить так, будто я ему запустила 8 ослов и каждую с флешем. Ну и даже в таком режиме он что-то честно попытался записать, но увы и ах: еле-еле передавал инфу дальше своих нужд. Закрытие окна в игре длилось не меньше минуты. В общем, не подошел. Теперь на форуме разгребаю другие, более трудоемкие решения. Удивляюсь как до сих пор нет готовых решений для столь распространенной ситуации - флешевых игр в соцсетях тьма, неужели их все тестируют руками?
P.S. Если разберусь с этим зверем и найду решение - обязуюсь написать статью по этому вопросу.

суббота, 1 декабря 2012 г.

Теоретика и рабочие моменты

Во-первых, нашла наконец приличные учебные материалы, а не просто "как я тестировал то-то" и спешу поделиться. Это - материалы подготовки к сертификации ISTQB. Вот тут материалы подготовки по всем уровням, для базового - есть на русском языке, в т.ч. есть глоссарий - там выписаны все определения, каноничноЪ. Это, повторюсь, первый встреченный мною нормальный учебный (именно учебный, практически учебник) материал. Как преподаватель говорю :) Это не значит, что публикации корифеев читать не нужно и бесполезно - вовсе нет - чужой опыт ценен, а если вы сможете адаптировать его к собственным нуждам - бесценен. Но экзамен (или сертификацию) вы по нему не сдадите. Что касается сертификации тестировщиков как таковой, то мое отношение к ней такое же, как и к любой другой бумажке с курсов - это иногда помогает пустить пыль в глаза недалеким людям, но сам по себе сертификат особо ничего не значит. Он значит лишь то, что вы знаете теорию, а об умении применять ее на практике там практически ни слова, так, пара тестов. Где-то я вычитала фразу, что сертфикация в общем нужна лишь тебе самому - проверить свои сил, знания. И с этим я более чем согласна, но бывает человеку это и не надо. Я пока еще думаю буду ли я сдавать на нее, но скорее да - потому что у нас компания заинтересована в сертифицированных тестировщиках. На черта, правда, не знаю, но если начальство говорит: "Лягушка" - то надо прыгать :) Опять же - не нужно понимать эту фразу буквально - разумеется, требования начальства необходимо выполнять в разумных пределах, до тех пор, пока это не ущемляет какие-то личные права/свободы. Расползаюсь что-то, но в любом случае, я полагаю небесполезной будет информация о том, как это проходит. Даже если вы не собираетесь сдавать - рекомендуется к ознакомлению.
А теперь о рабочих моментах, в частности - о баг-репортах. И нет, не о их составлении. А, любите Родину, мать вашу! - об их чтении! Я понимаю, что данная ситуация не показатель вообще, конец пятницы, мы все устали - но бывает вот такое. Составленный четче некуда баг-репорт (не мной даже, начальник клепал давно, решили повысить приоритет после жалобы в FAQ'е) и вопросы от программиста: а что, а как, а так где мне это делать? Где?! В гнезде!!! Мы все знаем, что у нас игра (программа), так ГДЕ ты должен это воспроизводить? В баг-репорте важно _каждое_ слово, это документ (конечно, бывает я делаю спецом забавные опечатки - чтоб чуток развеять официоз), тут ничего не пишется просто так. Но нет, Коля молодец, он взял последний абзац (не вникая в описание), который как раз относился непосредственно к описанной ситуации - и говорит - не, у меня все работает! Это слава яйцам, мы сидим в одной комнате, я могу подойти, ткнуть пальцем и показать что именно он пропустил. А если бы это было "программист тут, тестер - там"? Мы бы запинали этот тикет до посинения и взаимной ненависти. В общем, я что хочу сказать - иногда если программист не понимает баг-репорта, это не обязательно значит, что тестировщик его плохо написал. Просто программисты тоже люди и могут что-то в описании - одно слово! - прошляпить. А это одно слово может быть определяющим. Так что учитесь сами писать верно и учите верно читать.

вторник, 17 апреля 2012 г.

Савин+Тамре. Генерация тестовых случаев

Савин.
Методы генерации тестов:
1. Черновик-чистовик. Локальный мозговой штурм. Цикличен.
2. Матричная раскладка.
Этапы: набросок элементов и комбинация элементов.
В примере рассматривалось тестирование полей ввода индекса:
3. Блок-схемы.
Методы отбора тестов.
1. Оценка рисков. Какие из тестов будут исполнятся в первую очередь исходя из ситуации, оценку должны производить профессионалы, т.к. "на первый взгляд логично..." очень часто приводит к противоположенным результатам без знания нюансов.
2. Эквивалентные классы.
3. Граничные значения (возможно, как частный случай эквивалентных классов).
Тамре.
Я уже писала подробно, выпишу ещё раз вкратце.
Категории тестов.
• нет данных
• повторный ввод данных
• верные данные (значения внутри диапазона)
• неверные данные (граничное значение +/- 1)
• сброс/отмена/дисконект ~ стрессовое тестирование
• создание напряжений в системе ~ нагрузочное
• тестирование характеристик ~ функциональное
Знать как отченаш.

понедельник, 16 апреля 2012 г.

Савин-3

Цикл разработки ПО, модель "Водопад" (Waterfall)
1. Идея - маркетинг, описание цели.
2. Разработка дизайна и создание спецификации - путь к цели.
Must be спецификации:
• акцент на деталях и их чёткое определение
• недопущение неверного толкования (предельная чёткость формулировок)
• непротиворечивость
• логическая взаимосвязь компонентов
• полнота охвата предмета
• соответствие нормативным актам
• соответствие деловой практике/этике
Стадии: Черновик --> Ожидает подтверждения --> Утверждён
макеты с иллюстрациями спецификаций
3. Кодирование.
Внутренний дизайн кода
Причины возникновения багов:
• некачественная или изменяющаяся спецификация
• личные качества программиста
• отсутствие опыта
• пренебрежение стандартами кодирования
• сложность системы
• баги в ПО сторонних лиц
• отсутствие юнит-тестирования
• сжатые сроки разработки
Причины ликвидации соответствующие.
Требования к юнит-тестированию: юнит-тесты планируются ДО написания кода; требования к ним должны быть сформулированы в стандартах.
4. Исполнение тестирвоания и ремонт багов.
Приоритет:
-тестирование новых компонентов
-регрессионное
5. Релиз.
Виды: релиз, дополнительные релиз, пач-релиз
Бранчи.
А вот почему "водопад":