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.

Вам не нужен Автоматизатор!

1,269 views

Published on

Доклад Якова Краманенко на конференции SQA Days-18, 27-28 ноября 2015 г., Москва
www.sqadays.com

Published in: Education
  • Be the first to comment

Вам не нужен Автоматизатор!

  1. 1. Вам не нужен Автоматизатор!
  2. 2. Нет:p
  3. 3. Нет:p
  4. 4. если знать как её готовить;) Нет:p
  5. 5. Но всему свое время:)
  6. 6. Начнем сначала…
  7. 7. Продукт
  8. 8. Шушпанчики
  9. 9. Юз кейсы (черновик) Деревья шпят едят бегают висят Норы шпят едят бегают During All activities: шуршпанят Особенные случаи: GIVEN шпят WHEN есть кто за 2 метра THEN становятся невидимыми Переходы: деревья > норы деревья < норы
  10. 10. Деревья шпят * едят * бегают * висят * Норы шпят * едят * бегают * During All activities: шуршпанят Особенные случаи: GIVEN шпят WHEN есть кто за 2 метра THEN становятся невидимыми Переходы: деревья > норы * деревья < норы * Выбираем высокоприоритетные “фичи”
  11. 11. Деревья шпят * едят * бегают * висят * Норы шпят * едят * бегают * Переходы: деревья > норы * деревья < норы * Что бы автоматизировать в первую очередь и побыстрей (Smoke)
  12. 12. Сценарий (End to End) перебежать в нору побегать перебежать на дерево повисеть поесть перебежать в нору пошпать
  13. 13. Деревья шпят едят e бегают висят e Норы шпят e едят бегают e During All activities: шуршпанят Особенные случаи: GIVEN шпят WHEN есть кто за 2 метра THEN становятся невидимыми Переходы: деревья > норы e деревья < норы e Прослеживаем покрытие
  14. 14. Коробит?
  15. 15. будь DRY ;) Улучшаем наглядность будь DRY
  16. 16. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e ! ! повисеть - !!e ! поесть !! !!e ! пошпать !!e !! ! - невидимым ? !! ! Переходы: норы > деревья e норы < деревья e
  17. 17. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e ! ! повисеть - !!e ! поесть !! !!e ! пошпать !!e !! ! - невидимым ? !! ! Переходы: норы > деревья e норы < деревья e Дыра в покрытии
  18. 18. E2E тест одной Фичи перебежать на дерево пошпать невидимым перебежать в нору побегать перебежать на дерево повисеть поесть перебежать в нору пошпать Заканчиваем Smoke покрытие
  19. 19. E2E тест одной Фичи перебежать на дерево пошпать невидимым проверить шуршпание Используем момент для увеличения покрытия перебежать в нору побегать перебежать на дерево повисеть поесть перебежать в нору пошпать
  20. 20. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e ! ! повисеть - !!e ! поесть !! !!e ! пошпать !!e !! ! - невидимым ? !!f !f Переходы: норы > деревья e норы < деревья e
  21. 21. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e !f !f повисеть - !!e !f поесть !!f !!e !f пошпать !!e !!f !f - невидимым ? !!f !f Закончили Smoke? - Переходим к полному (приемочному) покрытию с помощью фиче- тестов
  22. 22. Советы: покрываем функциональные юз-кейсы высокого приоритета, (пользователь будет использовать регулярно)
  23. 23. Советы: НЕ покрываем низко-приоритетные проверки проверки “всех возможных вариаций”
  24. 24. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e !f !f повисеть - !!e !f поесть !!f !!e !f пошпать !!e !!f !f - невидимым ? !!f !f Нет низко-приоритетным проверкам
  25. 25. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e !f !f - быстро - медленно повисеть - !!e !f - низко - высоко поесть !!f !!e !f - много - мало пошпать !!e !!f !f Нет проверкам “всех возможных вариаций”
  26. 26. ДействияКонтексты Норы Деревья шуршпанят? побегать !!e !f !f - быстро - медленно повисеть - !!e !f - низко - высоко поесть !!f !!e !f - много - мало пошпать !!e !!f !f Должны быть покрыты на уровне юнит тестов разные вариации одной “функции” (дающие тот же “user flow” )
  27. 27. Мы здесь => => Только: функциональны е юз-кейсы высокого приоритета разные вариации одной “функции” Здесь =>
  28. 28. Избегаем => переносим дополнительные требования такие как “разные типы даных”, и другие “вариации функций”, и т. д. … <= в => из
  29. 29. Где код?
  30. 30. Спокойствие и только спокойствие:)
  31. 31. Product От
  32. 32. Product До
  33. 33. Действия бегать, висеть, есть, шпать создать, редактировать, удалить, переключить (активная/завершенная), переключить все Контексты норы, деревья фильтры: все, активные, завершенные
  34. 34. Действия бегать, висеть, есть, шпать create, edit, delete, toggle, toggle all Контексты норы, деревья фильтры: all, active, completed
  35. 35. Одно и то же ;)
  36. 36. Сценарий (End to End) перебежать в нору побегать перебежать на дерево повисеть поесть перебежать в нору пошпать
  37. 37. Сценарий (End to End) given at todomvc add "a" toggle "a" filter active filter completed edit "a" to "a edited" toggle "a edited" …
  38. 38. Добавляем ожидаемые результаты given at todomvc add "a" toggle "a" filter active assert no tasks filter completed edit "a" to "a edited" toggle "a edited" assert no tasks …
  39. 39. given at todomvc add "a" toggle "a" filter active assert no tasks filter completed edit "a" to "a edited" toggle "a edited" assert no tasks … Часто можем оставить “неявные” проверки
  40. 40. Демо
  41. 41. Начнем же кодить ;) given at todomvc add "a" toggle "a" filter active assert no tasks filter completed edit "a" to "a edited" toggle "a edited" assert no tasks …
  42. 42. Помогаем компьютеру понять код (на Java) givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //…
  43. 43. public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... } }
  44. 44. public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... } } ?
  45. 45. public static void givenAtTodoMVC(){ open("https://todomvc4tasj.herokuapp.com/"); newTask.shouldBe(enabled); } givenAtTodoMVC();
  46. 46. public static SelenideElement newTask = $("#new-todo"); newTask CSS Selector
  47. 47. CSS Selector ?
  48. 48. [id=“new-todo"] <=> #new-todo
  49. 49. public static SelenideElement newTask = $("#new-todo"); newTask [id=“new-todo"] <=> #new-todo
  50. 50. public static void add(String taskText) { newTask.setValue(taskText).pressEnter(); } add("a");
  51. 51. public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click(); } toggle("a");
  52. 52. public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click(); } toggle("a");
  53. 53. public static ElementsCollection tasks = $$("#todo-list>li"); tasks
  54. 54. public static ElementsCollection tasks = $$("#todo-list>li"); tasks
  55. 55. public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click(); } toggle("a");
  56. 56. public static void filterActive(){ $(By.linkText("Active")).click(); } filterActive();
  57. 57. By.linkText("Active")
  58. 58. public static void assertNoTasks() { tasks.filterBy(visible).shouldBe(empty); } assertNoTasks();
  59. 59. tasks.filterBy(visible).shouldBe(empty);
  60. 60. public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... } }
  61. 61. open("https://todomvc4tasj.herokuapp.com/"); newTask.shouldBe(enabled); newTask = $("#new-todo"); tasks = $$("#todo-list>li"); newTask.setValue("a").pressEnter(); tasks.findBy(exactText("a")).$(".toggle").click(); $(By.linkText("Active")).click(); tasks.filterBy(visible).shouldBe(empty);
  62. 62. Просто?
  63. 63. End to End Юнит/1-фича-на-тест Стиль тестов перебежать на дерево пошпать невидимым перебежать в нору побегать перебежать на дерево повисеть поесть перебежать в нору пошпать
  64. 64. public void testFiltering(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... } public void testDelete(){ givenAtTodoMVC(); add("a"); delete("a"); assertNoTasks(); } End to End Юнит/1-фича-на-тест Стиль тестов
  65. 65. End to End Плюсы + больше покрытия за меньшее время с меньшими усилиями во время реализации POC для фреймворка + интеграционное покрытие + в случае багов, дают более полный репорт + с репортах проще идентифицировать проблему => + меньше времени и усилий на саппорт “Фиче-тесты”
  66. 66. End to End Когда использовать? + в начале, во время разработки POC для фреймворка + в спешке, для покрытия как можно большего количества фич + для “черновиков” + для интеграционного покрытия + для новых фич + на регулярной основе, когда POC утвержден “Фиче-тесты”
  67. 67. Разве это было сложно? :)
  68. 68. Простые инструменты?
  69. 69. Easy tools? Java: Selenide Python: Selene is coming… C#: NSelene is coming… Ruby: Capybara ? JavaScript: Protractor ? PHP: Codeception
  70. 70. Как начать? Выбрать язык Выучить язык (книги, интерактивные туториалы, koans, exercism.io, google.com, другое) Выбрать “простые инструменты” Найти ментора (друг, программист на проекте, it-чаты, форумы, другое…) Вперед!
  71. 71. Как выбрать язык? Есть проект? => язык на котором пишут разработчики (бекенд) Нет проекта но нужно побыстрее найти работу? => самый популярный язык на рынке Нет проекта, не важна скорость нахождения работы, важно удовольствие от процесса программирования? => язык который подходит вам по стилю
  72. 72. Нет простого инструмента для нужного языка? Недостаточно опыта? => попросить программистов помочь Есть опыт/время? => реализовать самому
  73. 73. Послесловие Есть хорошие практики в контексте, но нет самых лучших практик. (c) Cem Kaner, James Bach
  74. 74. Вопросы
  75. 75. Спасибо github.com/yashaka youtube.com/c/ItlabsNetUa gitter.im/yashaka/better-selenium slideshare.net/yashaka yashaka@gmail.com@yashaka

×