Successfully reported this slideshow.

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

1

Share

Loading in …3
×
1 of 36
1 of 36

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

1

Share

Наш код умнеет и совершенствуется вместе с нами. Хорошие пракитики отпечатываются в ДНК наших тестов, и остаются с нами и в новых проектах. Плохие - совершенствуются или отмирают.
В даном докладе мы познакомимся с процессом эволюции wait-хромосомы(примеры на языке .NET). И посмотрим, куда эволюционировать дальше.

Наш код умнеет и совершенствуется вместе с нами. Хорошие пракитики отпечатываются в ДНК наших тестов, и остаются с нами и в новых проектах. Плохие - совершенствуются или отмирают.
В даном докладе мы познакомимся с процессом эволюции wait-хромосомы(примеры на языке .NET). И посмотрим, куда эволюционировать дальше.

More Related Content

More from QAFest

Related Books

Free with a 14 day trial from Scribd

See all

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

  1. 1. Теория Дарвина в тестах Эволюция Wait-ов Первый в Украине фестиваль тестирования Киев - 2016
  2. 2. About me ▹ 7+ years in IT ▹ Automation Engineer ▹ Scrum Master ▹Betsson project, Ciklum 2
  3. 3. Agenda ▸ Теория Дарвина в тестировании ▸Эволюция Wait ▸Выводы 3
  4. 4. Теория Дарвина в тестировании
  5. 5. Теория Дарвина ▹Чарлз Дарвин первым сформулировал теорию согласно которой главным (хотя и не единственным) фактором эволюции является естественный отбор. (c Wiki) 5
  6. 6. Теория Дарвина. Процесс эволюции Процесс эволюции по Дарвину говорит нам: ▸ Улучшение [органические формы медленно и постепенно преобразовывались и совершенствовались в соответствии с окружающими условиями] ▸ Ветвление [В основе преобразования видов в природе лежат такие свойства организмов, как изменчивость и наследственность] ▸ Адаптация [Результатом эволюции является приспособленность организмов к условиям их обитания и многообразие видов в природе] 6
  7. 7. Теория Дарвина. Autotests ▹ Переход от мануальной работы к автоматизации ▹ Удобство написания скриптов ▹ Создание тестовых наборов данных ▹ Свой SDL (удобство написания скриптов) 7 Record & Playback Helpers (function reusing) Data driven Keyword driven Other (hybrid)
  8. 8. Теория Дарвина. Page Objects ▹ Удобство написания скриптов ▹ Изобилие tool-ов эумляции (watir, selenium, nightwatch) ▹ Изобилие страниц, переходов между ними 8 Test scripts Wrappers Page Object Actions, Factories, Chains
  9. 9. Теория Дарвина. Bender9
  10. 10. Эволюция Wait
  11. 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. 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. 13. Thread.Sleep(10000) ▹Проблема: Тесты падают не дожидаясь нужного состояния. ▹Решение: Ожидать состояние константное время 13
  14. 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. 15. For / While / Do ▹Проблема: Выполнение тестов занимает слишком много времени. Мы ожидаем в пустую. ▹Решение: Опрашивать состояние короткими временными интервалами. 15
  16. 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. 17. Encapsulation ▹Проблема: Код тестов разрастается и дублируется. ▹Решение: Инкапсуляция. Создаем метод-помощник 17
  18. 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. 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. 20. Test helpers ▹Проблема: Под каждый метод надо писать свой хелпер. ▹Решение: Сделаем универсальный хелпер. 20
  21. 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. 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. 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. 24. Probability distribution ▹Проблема: Мы все еще долго ждем ▹Решение: Усовершенствуем наши интервалы ожидания (фибоначчи, вероятностное распределение) 24
  25. 25. 25
  26. 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. 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. 28. Stop on Errors ▹Проблема: Выполнение Failed тестов все еще долгое. ▹Решение: Добавляем проверку текущего состояния. 28
  29. 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. 30. Syntax Sugar ▹Проблема: Удобство использования хромает.. ▹Решение: Extension methods 30
  31. 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. 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. 33. Common pitfalls Забываем про: ▹ время ожидания в интервалах ▹ время выполнения операции ▹ вутренние функции ожидания (explicit/implicit wait, etc) 33
  34. 34. Что дальше? ▹ Polling  Events handling ▹ Inline Methods  Common Helpers  Extension Methods ▹ Test Data Data Sets  Data Oracles 34
  35. 35. Выводы Всегда есть что улучшить. Ищите слабые места и улучшайте их Улучшать можно не только код - но и процесс его создания Если система не нуждается в эволюции - незачем тратить время Варьируйте и адаптируйте свои решения 35
  36. 36. 36 Спасибо за внимание! Вопросы? pashko.ivan@gmail.com https://www.facebook.com/gro ups/1180099188730673/

×