Эффективные методы автоматизации тестирования в Rational Functional TesterИсточник: IBM developerWorks Россия
Если вы часто используете инструменты автоматизации тестирования, то, вероятно, уже знакомы с концепцией инфраструктуры автоматизации тестирования. Тестировщики часто просят дать им рекомендации, консультации и решения по инфраструктуре, но инфраструктура - это только половина того, что необходимо иметь в виду. Ваш подход к структурированию тестового кода с целью улучшения тестирования приложений - это второй шаг на пути к эффективной автоматизации. В этой статье мы рассмотрим первый шаг, который заключается в понимании того, как эффективно использовать имеющиеся инструменты тестирования. Это шаг можно разделить на несколько тем:
По каждой из этих тем имеются ссылки на дополнительную информацию, которые можно найти в разделе Ресурсы в конце этой статьи. Примечание:
Альтернативные способы поиска объектов и их свойств Такие компоненты, как диалоговые окна, кнопки команд и метки, имеют связанные с ними фрагменты информации, которые называются свойствами. Свойства имеют имена и значения. Нам часто бывают нужны различные свойства тестируемых объектов для того, чтобы можно было выполнить какой-либо вид верификации или программным способом определить дальнейшие действия сценария тестирования. В этом разделе рассказывается об объектах, их свойствах и способах, позволяющих взаимодействовать с ними в рамках сценария. Запрос и настройка значений свойств объектов Возникало ли у вас когда-либо желание динамически в процессе выполнения программы сравнить предыдущий вариант значения с текущим значением? А может быть, вам хотелось добавить в сценарий Rational Functional Tester переход, основанный на текущем значении свойства, содержащегося в каком-либо объекте? Извлечь значение свойства можно программным путем посредством вызова метода В примере из листинга 1 метод Листинг 1: Использование метода getProperty
Если нужно узнать, какими свойствами обладает некоторый объект, можно открыть карту тестовых объектов Test Object Map и просмотреть перечисленные в ней свойства. (См. рисунок 1.) Рисунок 1. Свойства в карте тестовых объектов
Кроме того, можно просмотреть доступные свойства, записав временную точку верификации (verification point, VP) свойств объекта или вставив команду для извлечения значения свойства в переменную при помощи мастера VP and Actions. Примечание: Теперь, когда вы знаете, как получить свойства объектов, вы можете задать вопрос: "А как можно найти сам объект?" Хороший вопрос. Способы поиска тестовых объектов Основной компоновочный блок сценария Rational Functional Tester - это постоянно используемый тестовый объект, Скорее всего, вы обычно взаимодействуете с тестовыми объектами Rational Functional Tester использует объект с именем
Марк Новацки (Mark Nowacki) и Лиза Нодвелл (Lisa Nodwell) написали статью о правильном понимании и использовании метода Решение проблемы неточного распознавания объектов Время от времени Rational Functional Tester не может различить два объекта, которые вели себя похожим образом при воспроизведении сценария. Чаще всего это происходит в том случае, если одновременно открыты два браузера или два экземпляра одного приложения. Если запущены два Web-браузера, то Rational Functional Tester пытается разрешить неоднозначность, используя якорь для определения целевого объекта. Теперь вы знаете, как использовать поисковый метод, и можете идентифицировать экземпляры браузера или приложения при помощи ссылки на Одновременный запуск нескольких экземпляров приложения во время воспроизведения сценария ведет к неоднозначности определения цели таких команд, как Листинг 2: Использование ProcessTestObject для привязки приложения
Выполняем уборку-удаление регистрации тестовых объектов Заключительный аспект использования метода поиска касается удаления регистрации объектов. Метод Rational Functional Tester удаляет регистрацию ограниченных ссылок только после завершения выполнения всего теста, а не одного конкретного сценария. Пока существует ограниченная ссылка на объект, Rational Functional Tester может не допустить полного освобождения объекта в приложении. Например, пока вы сохраняете ограниченную ссылку на Java™-объект, этот Java-объект не считается потерявшим актуальность и подлежащим удалению. Поэтому мы рекомендуем явно удалить регистрацию всех созданных поисковых ссылок сразу после того, как они станут ненужными. Класс
Предостережение: Способы решения распространенных проблем с браузерами Ниже перечислены некоторые распространенные проблемы, с которыми можно встретиться при тестировании HTML-приложений Устранение нежелательного поведения при помощи метода .readystate Если состояние вашего браузера или объектов в браузере не соответствует ожидаемому, можно столкнуться с нежелательным (странным, непредсказуемым) поведением при попытке взаимодействия с браузером или объектами, особенно если много взаимодействий выполняется не в рамках вспомогательных методов. Именно поэтому проверка состояния готовности readyState Web-браузера или какого-либо из объектов должна стать привычным делом. Значения readyState в Rational Functional Tester
Если вы знаете, что предстоит взаимодействие с большой таблицей, деревом (каталогом файлов) или HTML-документом, стоит проверить состояние этих объектов (Листинг 3) до начала взаимодействий. Листинг 3. Проверка состояния готовности readyState
Улучшение исполнения теста при помощи метода Возможно, вы также заметили, что при воспроизведении сценариев тестирования запуск браузера все еще продолжается в то время, как окно воспроизведения сценария ожидает выполнения первой команды. Такое поведение обуславливается тем, что более современные браузеры работают медленнее, возможно, из-за своих дополнительных элементов, например, вкладок, которые необходимо загрузить именно при запуске. Поэтому при запуске браузера рекомендуется использовать метод
Однако вам, возможно будет проще самостоятельно добавить вызов после команды Обработка незапланированных активных окон С браузерами (и некоторыми Java-приложениями) связана еще одна распространенная проблема - это многочисленные всплывающие окна. Незапланированные активные окна наиболее часто встречаются, когда сценарии выполняются на разных машинах или с различными браузерами, или если браузеры имеют разные настройки. Впрочем, в справочной системе Rational Functional Tester описаны два эффективных решения (одно простое, другое посложнее). Одно из решений - воспользоваться классической методикой try-and-catch (Листинг 4) и дождаться появления сообщения. Если сообщение не появится, можно продолжать. Листинг 4. Ожидание всплывающего диалогового окна
Совет: Еще одно решение, требующее чуть больше усилий - это реализация простой проверки, аналогичной проверке из исключения onObjectNotFound. Включив эту реализацию во вспомогательный суперсценарий, можно обрабатывать события для любого сценария Rational Functional Tester, являющегося расширением этого вспомогательного суперкласса (подробнее об этом далее в этой статье). Подумайте об использовании нетрадиционных точек верификации Кроме точек верификации, определяемых во время записи, в сценарий тестирования Rational Functional Tester можно включить и дополнительные точки верификации (и не только с помощью команды Точки верификации, добавляемые вручную Добавление точек верификации вручную полезно при самостоятельном создании данных для точек верификации, когда нужно сравнить данные. Например, данные могут быть результатом вычислений или происходить из внешнего источника, например, из таблицы, пула данных, базы данных или пользовательского вычисления. Объекты добавляемых вручную точек верификации создаются при помощи метода Листинг 5. Использование метода vpManual
При первом выполнении точки верификации, добавленной вручную, если объект точки верификации еще не существует, будет передано базовое значение (которое затем можно просмотреть и изменить в Rational Functional Tester, как и значение любой другой точки верификации). В файле журнала будет написано: Created verification point baseline. Начиная с этого момента, все последующие вызовы метода Динамические точки верификации Иногда возникает необходимость в выполнении точки верификации в тестовых объектах, не включенных в карту объектов. С этой целью можно использовать динамические точки верификации при помощи метода Если вы передаете сценарию только имя точки верификации, то при следующем воспроизведении этого сценария будет активирован мастер записи точек верификации Recording Verification Point and Action Wizard . С помощью этого мастера можно задать тестовые объекты Листинг 6. Использование метода vpDynamic
Предостережение: Распространенной ошибкой при использовании этого метода является неиспользование метода Подробно об использовании низкоуровневых команд Низкоуровневое воспроизведение эмулирует точные перемещения мыши и манипуляции с клавиатурой, выполняемые пользователем. Такое воспроизведение сценариев позволяет более точно управлять отдельными действиями пользователей, например, в программах для векторного рисования (черчения), эмуляторах PDA и других нетрадиционных инструментах, учитывающих свойства объектов, которые совсем не похожи на обычные команды Например, предположим, что вы тестируете распознавание ручного ввода в эмуляторе VTech Helio Emulator, который показан на рисунке 2. Рисунок 2: Эмулятор VTech Helio Emulator
Традиционные сценарии Rational Functional Tester в приложениях, подобных Helio Emulator, малоэффективны. Фактически, как я писал в предыдущей статье о применении низкоуровневых сценариев в IBM® Rational® Robot (см. раздел Ресурсы), почти единственным выбором для таких приложений остается низкоуровневая запись. Перейдя на низкий уровень, вы сможете воспроизвести отдельные компоненты щелчка мышью. Класс
Ниже приводится список методов для конструирования низкоуровневых событий LowLevelEvents в фабрике
Код сценария, представленный в листинге 7, рисует на блокноте распознавания ручного ввода для Helio в Microsoft® Paint®. Листинг 7. Использование низкоуровневых сценариев в Rational Functional Tester
Код, представленный в листинге 7, генерирует в окне документа программы букву V как показано на рисунке 3. Рисунок 3: Рисование при помощи Microsoft Paint в эмуляторе Helio
Есть ли недостатки у этой грандиозно эффективной функции? Насколько я знаю, в отличие от Rational Robot, весь этот код вам придется писать вручную. Мне не известен способ переключения на низкоуровневую запись в Rational Functional Tester. Но и описанного вполне достаточно. Если вы действительно тестируете программу типа Helio, вам все равно придется создать методы многократного использования для написания букв. Поэтому, вероятнее всего, вам нужно будет разобраться со всеми буквами всего один раз. В любом случае запомните эту функцию, потому что бывают моменты, когда вы просто не в состоянии получить комбинации типа click-drag в процессе записи сценария. В таких случаях иногда может помочь низкоуровневая запись. Улучшение сценариев при помощи вспомогательного суперкласса Если вы не читали статью Денниса Шульца (Dennis Schultz) "Creating a super helper class in IBM Rational Functional Tester," (Создание вспомогательных суперклассов в IBM Rational Functional Tester), перейдите к разделу Ресурсы и прочтите ее сейчас. Эта статья - самый лучший ресурс для изучения того, как работает суперкласс, из всех, которые мне приходилось видеть. Вспомогательные классы помогают добавить функциональности вашим сценариям тестирования. По умолчанию, все сценарии Rational Functional Tester представляют собой расширения класса Вы можете определить вспомогательный суперкласс, который Rational Functional Tester будет использовать при каждом создании или записи сценария в проекте. Этот вспомогательный класс по умолчанию указывается в свойствах проекта функционального теста . Кроме того, в свойствах проекта функционального теста можно указать вспомогательный суперкласс для отдельного сценария на странице свойств сценария . После создания сценарий сохраняет ссылку на суперкласс по умолчанию как на собственный вспомогательный суперкласс. Вспомогательные суперклассы полезны для совместного использования функций несколькими сценариями. Именно во вспомогательный суперкласс можно поместить код, который вы хотите сделать доступным для каждого сценария. Любой размещенный здесь код будет наследоваться любым вспомогательным классом, расширяющим ваш вспомогательный суперкласс. |