O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

1.344 visualizações

Publicada em

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

Publicada em: Educação
  • Seja o primeiro a comentar

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

  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

×