Грязная автоматизация
Станислав Бахарев. Performance Lab
План
• Что такое автоматизация тестирования и как она
делается?
• Краткий рассказ о средствах автоматизации
тестирования.
• Мой последний проект.
Автоматизация: базовые вещи
• Объекты интерфейса любой системы образуют
дерево.
• Каждый объект имеет набор свойств.
• Маппинг объектов – это привязка к конкертному узлу
дерева индивидуального имени.
• В конечном итоге автоматизированный сценарий –
это всегда программный код.
Автоматизированный тест
• Поиск объектов
• Имитация действий человека
• Проверки корректности результатов действий
Подходы к автоматизации
Автоматизация через
графический интерфейс
Запись и
воспроизведение
Программирование
фреймворка
Запись и воспроизведение
• Нажать RECORD
• Сделать что-то
• Нажать STOP
• Доработать получившийся код
• Нажать PLAY
• …
• PROFIT!!!
Запись и воспроизведение:
когда нельзя
• Динамическая структура элементов интерфейса
• Динамические имена/идентификаторы объектов
• Частые обновления интерфейса системы
• Нетривиальная логика сценариев
Фреймворк для автотестирования
• Минусы:
– Нужен программист или несколько
– Долго делать
– Надо обучать тест-дизайнеров
• Плюсы:
– Отказоустойчивость
– Код тестов читабелен
– Изначальный контроль над происходящим
– Не стыдно
Дружелюбность фреймворка
MainWindow main = new MainWindow();
main.clickMenu("Администрирование", "Настройки сервера");
main.clickTab("Параметры сервера");
CachedEditObject edit = main.findEdit("Название сервера:");
edit.setText("!@#$%^&*()");
CachedButtonObject button = main.findButton("Сохранить");
if (!button.isEnabled()) {
Logger.logSuccess("Кнопка сохранения недоступна");
} else {
Logger.logFail("Кнопка сохранения доступна");
}
«Дружелюбность»
сгенерированного кода
Хорошая автоматизация
• Фреймворк:
– Использует API средства автоматизации
– Низкоуровневые операции целиком возлагает на средство
автоматизации
• Тесты создаются исключительно в рамках
написанного фреймворка
Средства автоматизации
тестирования
• Берут начало в конце 1990-х – начале 2000х
• Работают с несколькими доменами тестирования
• Общий API для работы с разными доменами
• Пытаются быть как IDE
• Работают медленно
• Глючат (зачастую непредсказуемо)
Rational Functional Tester: плюсы
• Базируется на Eclipse, код на Java
• Относительная стабильность и завершённость
продукта
• Неплохой API
• Поддержка тестирования экзотических доменов
Rational Functional Tester: минусы
• Неполная и не всегда понятная документация
• Цена не разглашается
• Баги, недоработки и скорость работы
• Не знает про мобильные платформы
• Инструменты автоматизатора глючат и неудобны в
использовании
Тестируемая система
• Графическая оболочка для генерации запросов к
базе данных и отображения их результатов в
интерфейсе пользователя.
• Предназначение – выявление случаев
мошенничества в операциях с бумажными
документами.
• Написана на Java под JRE версии 1.6.
Тестируемая система
Тестируемая система
Дерево объектов
• Окно основано на контейнерах класса
«SWT_Window0», так или иначе все объекты
содержатся в них.
• Уровень вложенности дерева достигает 15.
• Реальное дерево объектов не всегда соотносится с
внешим видом элементов окна.
Скорость операций
• Стандартные операции над объектами:
– Запрос свойств(а) объекта
– Получение родительского объекта
– Получение дочерних объектов
– Проверка существования и видимости объекта
– Поиск среди дочерних объектов
– Ввод или чтение значений полей
– Имитация действий пользователя
Занимают от 150 до 400 милисекунд
Проверка видимости объекта
• Стандартные методы объекта isShowing() и
ensureObjectIsVisible() не работают.
• RFT не генерирует исключений при попытке
манипуляций с недоступным объектом.
• Нужно использовать свойство «.visible» у цепочки
родительских объектов, чтобы понять, видим ли
объект.
Проверка видимости объекта
• Кешировать всё дерево объектов на старте теста.
• Кешировать все свойства объектов, кроме
динамических (например, «.visible»).
• Ввести понятие «интервалов заморозки» свойств, в
которые динамические свойства могут
запрашиваться с реального объекта не более одного
раза.
Гибкий интерфейс
• Вся структура окна видоизменяема, что позволяет
использовать маппинг объектов только на верхних
уровнях дерева.
• Поиск должен осуществляться только среди видимых
объектов.
Гибкий интерфейс
• Составляется список всех панелей окна и список
видимых панелей в данный момент.
• Поиск объектов написан с нуля.
• Поиск объектов считается интервалом «заморозки
свойств» объектов.
Контекст поиска
• Для ускорения поиска объектов нужно выбирать
максимально узкий диапазон поиска – в идеале,
корневую панель вкладки, на которую был сделан
последний переход.
• Из-за особенности структуры дерева нельзя найти
корневую панель вкладки среди дочерних объектов
контроллера вкладок.
Контекст поиска
Главное окно
Главное меню
Куча панелей
Вкладки и их
содержимое
Заголовки вкладок и их
клиентские области
(прямоугольники области
содержимого)
Контекст
поиска
Контекст поиска
• Определение контекста поиска осуществляется
путём сравнения координат видимых панелей и
координат клиентской области вкладки.
• Поиск объектов отказывается «заходить» внутрь
невидимых панелей.
Этого мало?
• Кешировать результаты поиска в рамках контекста!
• Кешировать данные, ассоциированные с объектом!
• Кешировать все заголовки вкладок в окне!
• Кешировать все заголовки страниц!
• Главное окно – не окно! Поиск всегда переадресуется
на одну из его основных панелей.
Как это работает: 1
Кеширование дерева…
Если в начале теста
фреймворку была отправлена
команда клика по вкладке
«Выборки», то сначала
запускается долгий процесс
кеширования всего дерева
объектов.
Как это работает: 2
Поиск панелей и вкладок…
После кеширования
фреймворк обнаружит в
дереве объектов все панели и
заголовки вкладок, которых в
окне в прямом смысле сотни.
Как это работает: 3
Поиск видимых панелей…
Затем среди всех панелей
будет составлен список тех,
которые отображаются на
экране в настоящий момент.
Их значительно больше, чем
изображено на рисунке.
Как это работает: 4
Клиентская область…
Затем, с помощью
привязанного к заголовку
вкладки прямоугольника
клиентской области будут
отсеяны все вкладки, не
попадающие в неё.
Как это работает: 5
Определение контекста…
В итоге контекстом поиска
будет считаться самая
высокоуровневая панель из
тех, которые вписываются в
клиентскую область.
Итоги: скорость работы
Кеширование дерева объектов 5 – 30 секунд
Кеширование панелей и вкладок 2 – 6 секунд
Определение видимых панелей 1,5 – 3 секунды
Определение контекста < 200 мс
Поиск объектов в контексте 1 – 6 секунд
Итоги
Сложность фреймворка
Дружелюбность и простота тестов
Скорость работы
Стабильность
Отказоустойчивость
Время разработки фреймворка
Выводы
• Автоматизировать можно почти всё что угодно
• Средства автоматизации дефективные удивительные
• Иногда нельзя сделать всё красиво
Доклад подготовил и озвучил
Станислав Бахарев, инженер по
обеспечению качества
E-mail: [email protected]
Время вопросов
Top Related