SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Теория Дарвина в
тестах
Эволюция Wait-ов
Первый в Украине фестиваль тестирования
Киев - 2016
About me
▹ 7+ years in IT
▹ Automation Engineer
▹ Scrum Master
▹Betsson project, Ciklum
2
Agenda
▸ Теория Дарвина в
тестировании
▸Эволюция Wait
▸Выводы
3
Теория Дарвина в
тестировании
Теория Дарвина
▹Чарлз Дарвин первым сформулировал теорию
согласно которой главным (хотя и не единственным)
фактором эволюции является естественный отбор.
(c Wiki)
5
Теория Дарвина. Процесс эволюции
Процесс эволюции по Дарвину говорит нам:
▸ Улучшение
[органические формы медленно и постепенно преобразовывались и совершенствовались в
соответствии с окружающими условиями]
▸ Ветвление
[В основе преобразования видов в природе лежат такие свойства организмов, как
изменчивость и наследственность]
▸ Адаптация
[Результатом эволюции является приспособленность организмов к условиям их обитания
и многообразие видов в природе]
6
Теория Дарвина. Autotests
▹ Переход от мануальной работы к
автоматизации
▹ Удобство написания скриптов
▹ Создание тестовых наборов
данных
▹ Свой SDL (удобство написания
скриптов)
7
Record
&
Playback
Helpers
(function
reusing)
Data driven
Keyword
driven
Other
(hybrid)
Теория Дарвина. Page Objects
▹ Удобство написания скриптов
▹ Изобилие tool-ов эумляции (watir,
selenium, nightwatch)
▹ Изобилие страниц, переходов
между ними
8
Test
scripts
Wrappers
Page
Object
Actions,
Factories,
Chains
Теория Дарвина. Bender9
Эволюция Wait
Disclaimer
▹ E2E Тесты ( UI / Integration / System )
▹ Нет оповещения об окончании
события (No events)
▹ Обработка функций занимает время
11
http://img.picturequotes.com/2/371/370243/anything-less-than-immortality-is-a-complete-waste-of-
time-quote-1.jpg
12
[TestMethod]
public void CheckMagicPositiveFlow()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
var result = SUT.IsMagicAppeared();
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
Thread.Sleep(10000)
▹Проблема: Тесты падают не
дожидаясь нужного состояния.
▹Решение: Ожидать состояние
константное время
13
14
[TestMethod]
public void CheckMagicThreadSleep()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
Thread.Sleep(10000);
var result = SUT.IsMagicAppeared();
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
For / While / Do
▹Проблема: Выполнение тестов
занимает слишком много времени. Мы
ожидаем в пустую.
▹Решение: Опрашивать состояние
короткими временными интервалами.
15
16
...
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
for(int i = 0; i < MAGIC_WAIT_INTERVAL_MS; i+=100)
{
Thread.Sleep(100);
result = SUT.IsMagicAppeared();
if (result)
break;
}
result = SUT.IsMagicAppeared();
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
Encapsulation
▹Проблема: Код тестов разрастается
и дублируется.
▹Решение: Инкапсуляция. Создаем
метод-помощник
17
18
private static bool WaitForMagicAppearance()
{
for(int i=0; i < MAGIC_WAIT_INTERVAL_MS; i+= 100)
{
Thread.Sleep(100);
bool result = SUT.IsMagicAppeared();
if (result)
return result;
}
return false;
}
19
[TestMethod]
public void CheckMagicEncapsulation()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
var result = WaitForMagicAppearance();
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
Test helpers
▹Проблема: Под каждый метод надо
писать свой хелпер.
▹Решение: Сделаем универсальный
хелпер.
20
21
public static bool WaitFor(Func<bool> predicate, int timeout_ms)
{
for (int i = 0; i < timeout_ms; i+=100)
{
Thread.Sleep(100);
var result = predicate();
if (result)
{
return result;
}
}
return false;
}
22
[TestMethod]
public void CheckMagicGenericMethod()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
Func<bool> isMagicAppearredFunc = SUT.IsMagicAppeared;
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
var result = WaitFor(isMagicAppearredFunc, WAIT_INTERVAL_MS);
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
23
[TestMethod]
public void CheckMagicGenericMethod()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
var result = WaitFor(() =>
SUT.IsMagicAppearedWithParams(1,2),
INTERVAL_MS);
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
Probability
distribution
▹Проблема: Мы все еще долго ждем
▹Решение: Усовершенствуем наши
интервалы ожидания (фибоначчи,
вероятностное распределение)
24
25
26
public static IEnumerable<int> Fibonacchi()
{
var current = 1;
var next = 1;
while (true)
{
yield return current;
next += current;
current = next - current;
}
}
27
public static bool WaitFor(Func<bool> predicate, int timeout_ms)
{
int time = 0, n = 0;
while (time < timeout__ms)
{
var sleepTime = Fibonacchi().Skip(++n).First();
Thread.Sleep(sleepTime);
time += sleepTime;
var result = predicate();
if (result) return result;
}
return false;
}
Stop on Errors
▹Проблема: Выполнение Failed
тестов все еще долгое.
▹Решение: Добавляем проверку
текущего состояния.
28
29
public static bool WaitFor(Func<bool> predicate, Func<bool>
validateCurrentState, int timeout_limit_ms)
{
int time = 0, n = 0;
while (time < timeout_limit_ms)
{
...
if (!validateCurrentState())
Assert.Fail("State is wrong. We shouldn't wait
anymore!");
var result = predicate();
...
Syntax Sugar
▹Проблема: Удобство
использования хромает..
▹Решение: Extension methods
30
31
public static bool Wait(this Func<bool> predicate, int
timeout_limit_ms)
{
for (int i = 1; i < timeout_limit_ms; i+=100)
{
Thread.Sleep(100);
var result = predicate();
if (result)
return result;
}
return false;
}
32
[TestMethod]
public void CheckMagicExtensionMethod()
{
//Arrange
const string MAGIC_SPELL = "Expecto Patronum!";
Func<bool> isMagicAppeared = SUT.IsMagicAppeared;
//Act
SUT.DoMagic(MAGIC_SPELL);
//Magic is happening here..
var result = isMagicAppeared.Wait(MAGIC_WAIT_INTERVAL_MS);
//Assert
Assert.IsTrue(result, "Magic does not exist..");
}
Common pitfalls
Забываем про:
▹ время ожидания в интервалах
▹ время выполнения операции
▹ вутренние функции ожидания (explicit/implicit wait,
etc)
33
Что дальше?
▹ Polling  Events handling
▹ Inline Methods  Common Helpers  Extension
Methods
▹ Test Data Data Sets  Data Oracles
34
Выводы
Всегда есть что улучшить.
Ищите слабые места и
улучшайте их
Улучшать можно не только код -
но и процесс его создания
Если система не нуждается в
эволюции - незачем тратить
время
Варьируйте и адаптируйте
свои решения
35
36
Спасибо за
внимание!
Вопросы?
pashko.ivan@gmail.com
https://www.facebook.com/gro
ups/1180099188730673/

Weitere ähnliche Inhalte

Andere mochten auch

QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QAFest
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QAFest
 
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
QAFest
 
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
QAFest
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
Badoo Development
 

Andere mochten auch (20)

QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
 
QA Fes 2016. Александр Хотемской. Обзор ProtractorJS как фреймворка для брауз...
QA Fes 2016. Александр Хотемской. Обзор ProtractorJS как фреймворка для брауз...QA Fes 2016. Александр Хотемской. Обзор ProtractorJS как фреймворка для брауз...
QA Fes 2016. Александр Хотемской. Обзор ProtractorJS как фреймворка для брауз...
 
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайниковQA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
QA Fest 2016. Андрей Мясников. Тест-дизайн для чайников
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
 
QA Fest 2016. Александр Неделяев. Браузерные помощники тестировщика
QA Fest 2016. Александр Неделяев. Браузерные помощники тестировщикаQA Fest 2016. Александр Неделяев. Браузерные помощники тестировщика
QA Fest 2016. Александр Неделяев. Браузерные помощники тестировщика
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
QA Fes 2016. Ярослав Пернеровский. Не Jav'ой единой. Пример автоматизации тес...
 
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
QA Fes 2016. Игорь Бондаренко. Тестирование Ecommerce проектов. На что обраща...
 
QA Fes 2016. Катерина Овеченко & Михаил Дырда. История одной авантюры: наш не...
QA Fes 2016. Катерина Овеченко & Михаил Дырда. История одной авантюры: наш не...QA Fes 2016. Катерина Овеченко & Михаил Дырда. История одной авантюры: наш не...
QA Fes 2016. Катерина Овеченко & Михаил Дырда. История одной авантюры: наш не...
 
QA Fest 2016. Антон Серпутько. Автоматизация запуска тестов с помощью Jenkins...
QA Fest 2016. Антон Серпутько. Автоматизация запуска тестов с помощью Jenkins...QA Fest 2016. Антон Серпутько. Автоматизация запуска тестов с помощью Jenkins...
QA Fest 2016. Антон Серпутько. Автоматизация запуска тестов с помощью Jenkins...
 
QA Fes 2016. Игорь Любин. Об автоматическом тестировании бэкенда в MediaMarkt
QA Fes 2016. Игорь Любин. Об автоматическом тестировании бэкенда в MediaMarktQA Fes 2016. Игорь Любин. Об автоматическом тестировании бэкенда в MediaMarkt
QA Fes 2016. Игорь Любин. Об автоматическом тестировании бэкенда в MediaMarkt
 
QA Fest 2016. Татьяна Люлюченко. Немного о мобильных браузерах
QA Fest 2016. Татьяна Люлюченко. Немного о мобильных браузерахQA Fest 2016. Татьяна Люлюченко. Немного о мобильных браузерах
QA Fest 2016. Татьяна Люлюченко. Немного о мобильных браузерах
 
QA Fes 2016. Анна Карпенко. Специфика тестирования мобильных приложений или к...
QA Fes 2016. Анна Карпенко. Специфика тестирования мобильных приложений или к...QA Fes 2016. Анна Карпенко. Специфика тестирования мобильных приложений или к...
QA Fes 2016. Анна Карпенко. Специфика тестирования мобильных приложений или к...
 
QA Fes 2016. Артем Быковец. Как выживать тестировщику в Agile среде
QA Fes 2016. Артем Быковец. Как выживать тестировщику в Agile средеQA Fes 2016. Артем Быковец. Как выживать тестировщику в Agile среде
QA Fes 2016. Артем Быковец. Как выживать тестировщику в Agile среде
 
QA Fest 2016. Екатерина Шепелева. Секрет успеха: как стать и оставаться востр...
QA Fest 2016. Екатерина Шепелева. Секрет успеха: как стать и оставаться востр...QA Fest 2016. Екатерина Шепелева. Секрет успеха: как стать и оставаться востр...
QA Fest 2016. Екатерина Шепелева. Секрет успеха: как стать и оставаться востр...
 
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестированияQA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
QA Fest 2016. Денис Яременко. Как облегчить процесс мобильного тестирования
 
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
QA Fes 2016. Василий Сливка. 10 лучших практик для тестирования мобильных при...
 
QA Fes 2016. Роман Якимчук. Продвинутое тестирование состояний и переходов
QA Fes 2016. Роман Якимчук. Продвинутое тестирование состояний и переходовQA Fes 2016. Роман Якимчук. Продвинутое тестирование состояний и переходов
QA Fes 2016. Роман Якимчук. Продвинутое тестирование состояний и переходов
 
How QA engineers could affect quality?
How QA engineers could affect quality?How QA engineers could affect quality?
How QA engineers could affect quality?
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
 

Ähnlich wie QA Fes 2016. Иван Пашко. Теория Дарвина в тестах. Эволюция Wait-ов.

Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
Krivoy Rog IT Community
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" Pattern
Þorgeir Ingvarsson
 

Ähnlich wie QA Fes 2016. Иван Пашко. Теория Дарвина в тестах. Эволюция Wait-ов. (11)

Spock - the next stage of unit testing
Spock - the next stage of unit testingSpock - the next stage of unit testing
Spock - the next stage of unit testing
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Thread
ThreadThread
Thread
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
ZooKeeper Java Cloud
ZooKeeper Java CloudZooKeeper Java Cloud
ZooKeeper Java Cloud
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
UI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" PatternUI Automation Patterns: "Sleep" Pattern
UI Automation Patterns: "Sleep" Pattern
 
Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)Тестируем тесты с PIT (мутационное тестирование)
Тестируем тесты с PIT (мутационное тестирование)
 
Кванториум: софт скиллз
Кванториум: софт скиллзКванториум: софт скиллз
Кванториум: софт скиллз
 
Грязная магия Java
Грязная магия JavaГрязная магия Java
Грязная магия Java
 
Selenium, а давай подождем?
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
 

Mehr von QAFest

QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QAFest
 
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QAFest
 

Mehr von QAFest (20)

QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилинQA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
QA Fest 2019. Сергій Короленко. Топ веб вразливостей за 40 хвилин
 
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The FutureQA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
QA Fest 2019. Анна Чернышова. Self-healing test automation 2.0. The Future
 
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
QA Fest 2019. Doug Sillars. It's just too Slow: Testing Mobile application pe...
 
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
QA Fest 2019. Катерина Спринсян. Параллельное покрытие автотестами и другие и...
 
QA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать большеQA Fest 2019. Никита Галкин. Как зарабатывать больше
QA Fest 2019. Никита Галкин. Как зарабатывать больше
 
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiledQA Fest 2019. Сергей Пирогов. Why everything is spoiled
QA Fest 2019. Сергей Пирогов. Why everything is spoiled
 
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгораниемQA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
QA Fest 2019. Сергей Новик. Между мотивацией и выгоранием
 
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
QA Fest 2019. Владимир Никонов. Код Шредингера или зачем и как мы тестируем н...
 
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
QA Fest 2019. Владимир Трандафилов. GUI automation of WEB application with SV...
 
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium ClusterQA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
QA Fest 2019. Иван Крутов. Bulletproof Selenium Cluster
 
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
QA Fest 2019. Николай Мижигурский. Миссия /*не*/выполнима: гуманитарий собесе...
 
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
QA Fest 2019. Володимир Стиран. Чим раніше – тим вигідніше, але ніколи не піз...
 
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automationQA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
QA Fest 2019. Дмитрий Прокопук. Mocks and network tricks in UI automation
 
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
QA Fest 2019. Екатерина Дядечко. Тестирование медицинского софта — вызовы и в...
 
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
QA Fest 2019. Катерина Черникова. Tune your P’s: the pop-art of keeping testa...
 
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях ITQA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
QA Fest 2019. Алиса Бойко. Какнезапутаться в коммуникативных сетях IT
 
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложенииQA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
QA Fest 2019. Святослав Логин. Как найти уязвимости в мобильном приложении
 
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
QA Fest 2019. Катерина Шепелєва та Інна Оснач. Що українцям потрібно знати пр...
 
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
QA Fest 2019. Антон Серпутько. Нагрузочное тестирование распределенных асинхр...
 
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
QA Fest 2019. Петр Тарасенко. QA Hackathon - The Cookbook 22
 

QA Fes 2016. Иван Пашко. Теория Дарвина в тестах. Эволюция Wait-ов.

  • 1. Теория Дарвина в тестах Эволюция Wait-ов Первый в Украине фестиваль тестирования Киев - 2016
  • 2. About me ▹ 7+ years in IT ▹ Automation Engineer ▹ Scrum Master ▹Betsson project, Ciklum 2
  • 3. Agenda ▸ Теория Дарвина в тестировании ▸Эволюция Wait ▸Выводы 3
  • 5. Теория Дарвина ▹Чарлз Дарвин первым сформулировал теорию согласно которой главным (хотя и не единственным) фактором эволюции является естественный отбор. (c Wiki) 5
  • 6. Теория Дарвина. Процесс эволюции Процесс эволюции по Дарвину говорит нам: ▸ Улучшение [органические формы медленно и постепенно преобразовывались и совершенствовались в соответствии с окружающими условиями] ▸ Ветвление [В основе преобразования видов в природе лежат такие свойства организмов, как изменчивость и наследственность] ▸ Адаптация [Результатом эволюции является приспособленность организмов к условиям их обитания и многообразие видов в природе] 6
  • 7. Теория Дарвина. Autotests ▹ Переход от мануальной работы к автоматизации ▹ Удобство написания скриптов ▹ Создание тестовых наборов данных ▹ Свой SDL (удобство написания скриптов) 7 Record & Playback Helpers (function reusing) Data driven Keyword driven Other (hybrid)
  • 8. Теория Дарвина. Page Objects ▹ Удобство написания скриптов ▹ Изобилие tool-ов эумляции (watir, selenium, nightwatch) ▹ Изобилие страниц, переходов между ними 8 Test scripts Wrappers Page Object Actions, Factories, Chains
  • 11. Disclaimer ▹ E2E Тесты ( UI / Integration / System ) ▹ Нет оповещения об окончании события (No events) ▹ Обработка функций занимает время 11 http://img.picturequotes.com/2/371/370243/anything-less-than-immortality-is-a-complete-waste-of- time-quote-1.jpg
  • 12. 12 [TestMethod] public void CheckMagicPositiveFlow() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. var result = SUT.IsMagicAppeared(); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 13. Thread.Sleep(10000) ▹Проблема: Тесты падают не дожидаясь нужного состояния. ▹Решение: Ожидать состояние константное время 13
  • 14. 14 [TestMethod] public void CheckMagicThreadSleep() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. Thread.Sleep(10000); var result = SUT.IsMagicAppeared(); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 15. For / While / Do ▹Проблема: Выполнение тестов занимает слишком много времени. Мы ожидаем в пустую. ▹Решение: Опрашивать состояние короткими временными интервалами. 15
  • 16. 16 ... SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. for(int i = 0; i < MAGIC_WAIT_INTERVAL_MS; i+=100) { Thread.Sleep(100); result = SUT.IsMagicAppeared(); if (result) break; } result = SUT.IsMagicAppeared(); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 17. Encapsulation ▹Проблема: Код тестов разрастается и дублируется. ▹Решение: Инкапсуляция. Создаем метод-помощник 17
  • 18. 18 private static bool WaitForMagicAppearance() { for(int i=0; i < MAGIC_WAIT_INTERVAL_MS; i+= 100) { Thread.Sleep(100); bool result = SUT.IsMagicAppeared(); if (result) return result; } return false; }
  • 19. 19 [TestMethod] public void CheckMagicEncapsulation() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. var result = WaitForMagicAppearance(); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 20. Test helpers ▹Проблема: Под каждый метод надо писать свой хелпер. ▹Решение: Сделаем универсальный хелпер. 20
  • 21. 21 public static bool WaitFor(Func<bool> predicate, int timeout_ms) { for (int i = 0; i < timeout_ms; i+=100) { Thread.Sleep(100); var result = predicate(); if (result) { return result; } } return false; }
  • 22. 22 [TestMethod] public void CheckMagicGenericMethod() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; Func<bool> isMagicAppearredFunc = SUT.IsMagicAppeared; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. var result = WaitFor(isMagicAppearredFunc, WAIT_INTERVAL_MS); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 23. 23 [TestMethod] public void CheckMagicGenericMethod() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. var result = WaitFor(() => SUT.IsMagicAppearedWithParams(1,2), INTERVAL_MS); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 24. Probability distribution ▹Проблема: Мы все еще долго ждем ▹Решение: Усовершенствуем наши интервалы ожидания (фибоначчи, вероятностное распределение) 24
  • 25. 25
  • 26. 26 public static IEnumerable<int> Fibonacchi() { var current = 1; var next = 1; while (true) { yield return current; next += current; current = next - current; } }
  • 27. 27 public static bool WaitFor(Func<bool> predicate, int timeout_ms) { int time = 0, n = 0; while (time < timeout__ms) { var sleepTime = Fibonacchi().Skip(++n).First(); Thread.Sleep(sleepTime); time += sleepTime; var result = predicate(); if (result) return result; } return false; }
  • 28. Stop on Errors ▹Проблема: Выполнение Failed тестов все еще долгое. ▹Решение: Добавляем проверку текущего состояния. 28
  • 29. 29 public static bool WaitFor(Func<bool> predicate, Func<bool> validateCurrentState, int timeout_limit_ms) { int time = 0, n = 0; while (time < timeout_limit_ms) { ... if (!validateCurrentState()) Assert.Fail("State is wrong. We shouldn't wait anymore!"); var result = predicate(); ...
  • 30. Syntax Sugar ▹Проблема: Удобство использования хромает.. ▹Решение: Extension methods 30
  • 31. 31 public static bool Wait(this Func<bool> predicate, int timeout_limit_ms) { for (int i = 1; i < timeout_limit_ms; i+=100) { Thread.Sleep(100); var result = predicate(); if (result) return result; } return false; }
  • 32. 32 [TestMethod] public void CheckMagicExtensionMethod() { //Arrange const string MAGIC_SPELL = "Expecto Patronum!"; Func<bool> isMagicAppeared = SUT.IsMagicAppeared; //Act SUT.DoMagic(MAGIC_SPELL); //Magic is happening here.. var result = isMagicAppeared.Wait(MAGIC_WAIT_INTERVAL_MS); //Assert Assert.IsTrue(result, "Magic does not exist.."); }
  • 33. Common pitfalls Забываем про: ▹ время ожидания в интервалах ▹ время выполнения операции ▹ вутренние функции ожидания (explicit/implicit wait, etc) 33
  • 34. Что дальше? ▹ Polling  Events handling ▹ Inline Methods  Common Helpers  Extension Methods ▹ Test Data Data Sets  Data Oracles 34
  • 35. Выводы Всегда есть что улучшить. Ищите слабые места и улучшайте их Улучшать можно не только код - но и процесс его создания Если система не нуждается в эволюции - незачем тратить время Варьируйте и адаптируйте свои решения 35