Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

414 views

Published on

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

Published in: Education
  • Be the first to comment

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/

×