SlideShare a Scribd company logo
UI Automation Patterns: "Sleep" Pattern
МОТИВАЦИЯ
• Ваши автотесты постоянно валятся без
видимых причин
• Ваше приложение постоянно что-то
подгружает втихаря
• Ваше приложение не ожидает, что по
нему будут слишком уж быстро кликать
• Ваши автотесты проходят настолько
быстро, что вы не успеваете попить
кофе и хорошенько побраузать
ПРИМЕНИМОСТЬ
Используйте паттерн «Сон», чтобы:
• Подождать, пока какой-либо элемент появится на
странице
• Подождать, пока элемент исчезнет
• Подождать, пока у элемента изменится какой-нибудь
атрибут
• Подождать на случай, если элемент может появиться,
а может и нет
• Подождать, потому что иначе приложение тупо рухнет
• Просто подождать
СТРУКТУРА
УЧАСТНИКИ
• SleepService – «сервис сна»:
- определяет операцию sleep(), которая
позволяет осуществить процедуру ожидания.
Альтернативные наименования: pause(), wait() и т.п.
ОТНОШЕНИЯ
SleepService, как правило, не имеет смысла выделять в
отдельный класс. Вполне достаточно будет добавить
его функциональность в один или несколько из уже
существующих утилитных классов (возможно даже, с
применением интерфейса или абстрактного класса
CanSleep).
Клиенты получают доступ к процедуре сна через вызов
метод sleep().
РЕЗУЛЬТАТЫ
• Легко добавить ожидание в любой точке кода
• Любой компонент может при необходимости
приостановить свое выполнение
• Вызываемые автотестом методы исполняются
обстоятельно и без спешки
• Глядя на исполняющийся тест, можно по крайней
мере понимать, что он делает, и при этом успевать
заниматься прочими активностями
• Общее время выполнения тестовой сюиты
незначительно увеличивается за счет повышения
надежности тестов
РЕАЛИЗАЦИЯ
При реализации паттерна «Сон» необходимо рассмотреть
следующие вопросы:
• Сон должен блокировать выполнение теста
• Время сна должно быть можно конфигурировать
• Но должно быть можно инициировать сон и просто так,
не заморачиваясь на таймаутах
• Процедура сна должна быть масштабируемой
• В случае, если во время сна что-то пошло не так, об
этом надо куда-то сообщить
• Но в некоторых случаях можно особо из-за этого не
напрягаться
Простейшая реализация:
public static void sleep(long timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Плюсы: просто и элегантно.
Минусы: может засорять лог стектрейсами. Все равно
никто не знает, что с ними делать.
ПРИМЕРЫ КОДА
Улучшенная реализация:
public static void sleep(long timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) { }
}
Плюсы: еще проще и элегантнее.
Минусы: отсутствуют.
ПРИМЕРЫ КОДА
ПРИМЕРЫ КОДА
Продвинутая реализация с генерацией исключения:
public static void sleep(long timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
throw new RuntimeException(e.getMessage());
}
}
Плюсы: показывает, что вы не какие-нибудь там и умеете
генерировать исключения. Обратите внимание, блок throws не
требуется, так как это RuntimeException!
Минусы: исключение нужно где-то как-то обработать.
ПРИМЕРЫ КОДА
Продвинутая реализация с логированием предупреждения:
public static void sleep(long timeout) {
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
LOGGER.warn("sleep() method was interrupted.", e);
}
}
Плюсы: обработка исключения на более высоком уровне больше не требуется!
Минусы: нужно инициализировать логгер. Засоряет лог предупреждениями,
которые все равно никто не читает.
ПРИМЕРЫ КОДА
Продвинутая реализация с таймаутом по умолчанию:
private static final long DEFAULT_TIMEOUT = 15000;
public static void sleep() {
sleep(DEFAULT_TIMEOUT);
}
Плюсы: не надо думать о величине таймаута.
Минусы: отсутствуют.
МАСШТАБИРУЕМОСТЬ
Иногда необходимо выполнить ожидание в течение
нестандартного отрезка времени. Как же сделать, чтобы
процедура сна была масштабируемой?
public void clientMethod() {
…
SleepService.sleep(sleepTime * 8);
…
}
Это решение в лоб, очевидно, не годится, так как неприменимо для
случая вызова метода sleep() без параметров. Как же быть?
МАСШТАБИРУЕМОСТЬ
Все очень просто!
public void clientMethod() {
…
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
SleepService.sleep(sleepTime);
…
}
АЛЬТЕРНАТИВЫ
Рассмотрим другие, неправильные, альтернативы решения
проблемы:
• [Решение] Реализовать процедуру «поллинга», т.е.
опроса элементов в цикле на предмет достижения
требуемого условия.
• [Ответ] Но это же неэффективно! Вместо того, чтобы
спокойно поспать, автотест должен постоянно
обрабатывать какие-то инструкции, делать запросы,
анализировать результаты и т.п. Все это негативно
сказывается на сроке службы процессора. Кроме того, в
этом случае автотест не полностью эмулирует действия
пользователя, который, как известно, никакие элементы
не опрашивает, а тупо залипает в экран, пока страница
грузится. Именно эту активность пользователя и
эмулирует шаблон проектирования «Сон».
АЛЬТЕРНАТИВЫ
• [Решение] Попросить разработчиков встроить
механизмы синхронизации загрузки страниц и
защиты от так называемого «happy clicking».
• [Ответ] Непрофессионально! Вы - автоматизаторы
тестирования, а не какие-нибудь там молокососы,
бегающие с просьбами к разработчикам. Вы вполне в
состоянии справиться с проблемой без постороннего
вмешательства.
АЛЬТЕРНАТИВЫ
• [Решение] Больше работать, меньше браузать и пить
кофе.
• [Ответ] Ха. Ха ха. Ха ха ха ха ха.
ТОЛЬКО JAVA?
НЕТ!
Шаблон «Сон» можно реализовать на любом языке
программирования!
• C#: System.Threading.Thread.Sleep(5000);
• Ruby: sleep 5
• Python: time.sleep(5)
• QTP (VBScript): Wait 5
ВОПРОСЫ?
=)

More Related Content

PDF
Pros and Cons of Being an Automation Specialist
PPTX
How to Put Automation Engineers Down
PPTX
How to Calculate Test Automation ROI
PPTX
Tao and Test Automation
PDF
Mortal Sins and Guilty Pleasures of Automation Engineers
PPTX
Basics of assertions in automated testing
PPTX
Amusing Geometry in Test Automation
PPTX
How to write good autotests
Pros and Cons of Being an Automation Specialist
How to Put Automation Engineers Down
How to Calculate Test Automation ROI
Tao and Test Automation
Mortal Sins and Guilty Pleasures of Automation Engineers
Basics of assertions in automated testing
Amusing Geometry in Test Automation
How to write good autotests

What's hot (20)

PDF
Как же научиться программировать, в конце концов?
PDF
Фреймворк для регрессионного тестирования на основе WebDriver
PDF
Итак, вы тимлид
PDF
Совершенный тестовый фреймворк
PDF
Проблемы автоматизации крупных проектов: TestComplete
PDF
“Обезьянье тестирование” в мобильных проектах
PPTX
The most common mistakes in the first game session and how to avoid them
PDF
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
PPTX
Как мы админа увольняли, или тонкости организации корпоративной безопасности ...
PPTX
A1QA Summer 2014 - Alien bugs
PPT
Usability: практические приёмы
PDF
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
PDF
У всех на виду: нюансы Open Source разработки
PDF
В поисках магической кнопки или как приручить SOAP UI
PPT
Так говорят программисты
PPTX
Denys Herashchenko “Плаваючі баги серед нас”
PDF
Демонизированный PHP - before it was cool
PDF
Собеседование на позицию Java Developer
PDF
Мульти-блиц выступление на Стачка-2012
PPTX
Гадкий я. Или как не попасть в "ловушки" на пути к успеху
Как же научиться программировать, в конце концов?
Фреймворк для регрессионного тестирования на основе WebDriver
Итак, вы тимлид
Совершенный тестовый фреймворк
Проблемы автоматизации крупных проектов: TestComplete
“Обезьянье тестирование” в мобильных проектах
The most common mistakes in the first game session and how to avoid them
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Как мы админа увольняли, или тонкости организации корпоративной безопасности ...
A1QA Summer 2014 - Alien bugs
Usability: практические приёмы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
У всех на виду: нюансы Open Source разработки
В поисках магической кнопки или как приручить SOAP UI
Так говорят программисты
Denys Herashchenko “Плаваючі баги серед нас”
Демонизированный PHP - before it was cool
Собеседование на позицию Java Developer
Мульти-блиц выступление на Стачка-2012
Гадкий я. Или как не попасть в "ловушки" на пути к успеху
Ad

Viewers also liked (19)

PPTX
Part I. How to stop fooling around and begin automating
PPTX
Part II. How to automate properly
PPTX
Part III. How to maximize profit from automation
PPTX
The Dangers of Cucumber
PPTX
Метрики автоматизированного тестирования на пальцах
PPTX
Javascript in big project
PPTX
Automation patterns on practice
PDF
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
PDF
Артём Ерошенко «Рецепт приготовления облачных тестингов»
PPTX
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
PDF
Java Tools and Technologies Landscape for 2014 (image gallery)
PDF
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
PPTX
Мелочь пузатая или Объем тест кейса против его содержательности
PPTX
XPath локаторы в Selenium WebDriver
PPTX
Автоматизация тестирования: отбрасываем лишнее и проверяем суть
PDF
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
PPTX
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
PPTX
Тренировка служебных тестировщиков
PPTX
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
Part I. How to stop fooling around and begin automating
Part II. How to automate properly
Part III. How to maximize profit from automation
The Dangers of Cucumber
Метрики автоматизированного тестирования на пальцах
Javascript in big project
Automation patterns on practice
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
Java Tools and Technologies Landscape for 2014 (image gallery)
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
Мелочь пузатая или Объем тест кейса против его содержательности
XPath локаторы в Selenium WebDriver
Автоматизация тестирования: отбрасываем лишнее и проверяем суть
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
Тренировка служебных тестировщиков
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
Ad

Similar to UI Automation Patterns: "Sleep" Pattern (20)

PPTX
Типичные ошибки начинающих писать тесты на WebDriver
PDF
Jbreak 2016: Твой личный Spring Boot Starter
PDF
C++ STL & Qt. Занятие 10.
PDF
Дарья Егорушкина, «Лаборатория Касперского» — Экспертиза текста в интерфейсе....
PPTX
Spock - the next stage of unit testing
PDF
10M tests per day
PPT
КРИ 2008. Проектирование игр: функциональный подход
PPTX
Image-based automation
PDF
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
PPTX
Automation Functional Testing in Agile Projects
PDF
Универсальная методика поиска неисправностей от Cisco TAC Игорь Тумкин
PDF
Victor Kuliamin.CSEDays
PPTX
Установка: скрипты VS гайдов: что проще и что лучше?
PPTX
Poka yoke,jidoka,andon
PDF
мартюшев почему юнит-тесты не работают. история большого проекта
PPTX
мартюшев почему юнит-тесты не работают. история большого проекта
PPTX
Java Ahead-Of-Time compilation
PDF
Как сделать ваш JavaScript быстрее
PDF
Joker2014
PDF
микроСЕРВИСЫ: огонь, вода и медные трубы
Типичные ошибки начинающих писать тесты на WebDriver
Jbreak 2016: Твой личный Spring Boot Starter
C++ STL & Qt. Занятие 10.
Дарья Егорушкина, «Лаборатория Касперского» — Экспертиза текста в интерфейсе....
Spock - the next stage of unit testing
10M tests per day
КРИ 2008. Проектирование игр: функциональный подход
Image-based automation
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
Automation Functional Testing in Agile Projects
Универсальная методика поиска неисправностей от Cisco TAC Игорь Тумкин
Victor Kuliamin.CSEDays
Установка: скрипты VS гайдов: что проще и что лучше?
Poka yoke,jidoka,andon
мартюшев почему юнит-тесты не работают. история большого проекта
мартюшев почему юнит-тесты не работают. история большого проекта
Java Ahead-Of-Time compilation
Как сделать ваш JavaScript быстрее
Joker2014
микроСЕРВИСЫ: огонь, вода и медные трубы

UI Automation Patterns: "Sleep" Pattern

  • 2. МОТИВАЦИЯ • Ваши автотесты постоянно валятся без видимых причин • Ваше приложение постоянно что-то подгружает втихаря • Ваше приложение не ожидает, что по нему будут слишком уж быстро кликать • Ваши автотесты проходят настолько быстро, что вы не успеваете попить кофе и хорошенько побраузать
  • 3. ПРИМЕНИМОСТЬ Используйте паттерн «Сон», чтобы: • Подождать, пока какой-либо элемент появится на странице • Подождать, пока элемент исчезнет • Подождать, пока у элемента изменится какой-нибудь атрибут • Подождать на случай, если элемент может появиться, а может и нет • Подождать, потому что иначе приложение тупо рухнет • Просто подождать
  • 5. УЧАСТНИКИ • SleepService – «сервис сна»: - определяет операцию sleep(), которая позволяет осуществить процедуру ожидания. Альтернативные наименования: pause(), wait() и т.п.
  • 6. ОТНОШЕНИЯ SleepService, как правило, не имеет смысла выделять в отдельный класс. Вполне достаточно будет добавить его функциональность в один или несколько из уже существующих утилитных классов (возможно даже, с применением интерфейса или абстрактного класса CanSleep). Клиенты получают доступ к процедуре сна через вызов метод sleep().
  • 7. РЕЗУЛЬТАТЫ • Легко добавить ожидание в любой точке кода • Любой компонент может при необходимости приостановить свое выполнение • Вызываемые автотестом методы исполняются обстоятельно и без спешки • Глядя на исполняющийся тест, можно по крайней мере понимать, что он делает, и при этом успевать заниматься прочими активностями • Общее время выполнения тестовой сюиты незначительно увеличивается за счет повышения надежности тестов
  • 8. РЕАЛИЗАЦИЯ При реализации паттерна «Сон» необходимо рассмотреть следующие вопросы: • Сон должен блокировать выполнение теста • Время сна должно быть можно конфигурировать • Но должно быть можно инициировать сон и просто так, не заморачиваясь на таймаутах • Процедура сна должна быть масштабируемой • В случае, если во время сна что-то пошло не так, об этом надо куда-то сообщить • Но в некоторых случаях можно особо из-за этого не напрягаться
  • 9. Простейшая реализация: public static void sleep(long timeout) { try { Thread.sleep(timeout); } catch (InterruptedException e) { e.printStackTrace(); } } Плюсы: просто и элегантно. Минусы: может засорять лог стектрейсами. Все равно никто не знает, что с ними делать. ПРИМЕРЫ КОДА
  • 10. Улучшенная реализация: public static void sleep(long timeout) { try { Thread.sleep(timeout); } catch (InterruptedException e) { } } Плюсы: еще проще и элегантнее. Минусы: отсутствуют. ПРИМЕРЫ КОДА
  • 11. ПРИМЕРЫ КОДА Продвинутая реализация с генерацией исключения: public static void sleep(long timeout) { try { Thread.sleep(timeout); } catch (InterruptedException e) { throw new RuntimeException(e.getMessage()); } } Плюсы: показывает, что вы не какие-нибудь там и умеете генерировать исключения. Обратите внимание, блок throws не требуется, так как это RuntimeException! Минусы: исключение нужно где-то как-то обработать.
  • 12. ПРИМЕРЫ КОДА Продвинутая реализация с логированием предупреждения: public static void sleep(long timeout) { try { Thread.sleep(timeout); } catch (InterruptedException e) { LOGGER.warn("sleep() method was interrupted.", e); } } Плюсы: обработка исключения на более высоком уровне больше не требуется! Минусы: нужно инициализировать логгер. Засоряет лог предупреждениями, которые все равно никто не читает.
  • 13. ПРИМЕРЫ КОДА Продвинутая реализация с таймаутом по умолчанию: private static final long DEFAULT_TIMEOUT = 15000; public static void sleep() { sleep(DEFAULT_TIMEOUT); } Плюсы: не надо думать о величине таймаута. Минусы: отсутствуют.
  • 14. МАСШТАБИРУЕМОСТЬ Иногда необходимо выполнить ожидание в течение нестандартного отрезка времени. Как же сделать, чтобы процедура сна была масштабируемой? public void clientMethod() { … SleepService.sleep(sleepTime * 8); … } Это решение в лоб, очевидно, не годится, так как неприменимо для случая вызова метода sleep() без параметров. Как же быть?
  • 15. МАСШТАБИРУЕМОСТЬ Все очень просто! public void clientMethod() { … SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); SleepService.sleep(sleepTime); … }
  • 16. АЛЬТЕРНАТИВЫ Рассмотрим другие, неправильные, альтернативы решения проблемы: • [Решение] Реализовать процедуру «поллинга», т.е. опроса элементов в цикле на предмет достижения требуемого условия. • [Ответ] Но это же неэффективно! Вместо того, чтобы спокойно поспать, автотест должен постоянно обрабатывать какие-то инструкции, делать запросы, анализировать результаты и т.п. Все это негативно сказывается на сроке службы процессора. Кроме того, в этом случае автотест не полностью эмулирует действия пользователя, который, как известно, никакие элементы не опрашивает, а тупо залипает в экран, пока страница грузится. Именно эту активность пользователя и эмулирует шаблон проектирования «Сон».
  • 17. АЛЬТЕРНАТИВЫ • [Решение] Попросить разработчиков встроить механизмы синхронизации загрузки страниц и защиты от так называемого «happy clicking». • [Ответ] Непрофессионально! Вы - автоматизаторы тестирования, а не какие-нибудь там молокососы, бегающие с просьбами к разработчикам. Вы вполне в состоянии справиться с проблемой без постороннего вмешательства.
  • 18. АЛЬТЕРНАТИВЫ • [Решение] Больше работать, меньше браузать и пить кофе. • [Ответ] Ха. Ха ха. Ха ха ха ха ха.
  • 19. ТОЛЬКО JAVA? НЕТ! Шаблон «Сон» можно реализовать на любом языке программирования! • C#: System.Threading.Thread.Sleep(5000); • Ruby: sleep 5 • Python: time.sleep(5) • QTP (VBScript): Wait 5