Upload
sqalab
View
1.033
Download
0
Embed Size (px)
Citation preview
Вам не нужен Автоматизатор!
@yashaka
Автоматизация это сложно…или нет?
Нет:p
Нет:p
(по крайней мере для WEB UI)
если знать как её готовить;)
Нет:p
Но всему свое время:)
Начнем сначала…
Продукт
Шушпанчики
Юз кейсы (черновик)Деревья
шпят
едят
бегают
висят
Норы
шпят
едят
бегают
During All activities:
шуршпанят
Особенные случаи:
GIVEN шпятWHEN есть кто за 2 метра
THEN становятся невидимыми
Переходы:
деревья > норы
деревья < норы
Деревья
шпят *
едят *
бегают *
висят *
Норы
шпят *
едят *
бегают *
During All activities:
шуршпанят
Особенные случаи:
GIVEN шпятWHEN есть кто за 2 метра
THEN становятся невидимыми
Переходы:
деревья > норы *
деревья < норы *
Выбираем высокоприоритетные “фичи”
Деревья
шпят *
едят *
бегают *
висят *
Норы
шпят *
едят *
бегают *
Переходы:
деревья > норы *
деревья < норы *
Что бы автоматизировать в первую очередь
и побыстрей (Smoke)
Сценарий (End to End)перебежать в нору
побегатьперебежать на дерево
повисетьпоесть
перебежать в норупошпать
Деревья
шпят
едят e
бегают
висят e
Норы
шпят e
едят
бегают e
During All activities:
шуршпанят
Особенные случаи:
GIVEN шпятWHEN есть кто за 2 метра
THEN становятся невидимыми
Переходы:
деревья > норы e
деревья < норы e
Прослеживаем покрытие
Коробит?
будь DRY ;)
Улучшаем наглядность
будь DRY
Действия\Контексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !! !Переходы: норы > деревья
eноры < деревья
e
Действия\Контексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !! !Переходы: норы > деревья
eноры < деревья
e
Дыра в покрытии
E2E тест одной Фичиперебежать на
дерево
пошпать невидимым
перебежать в норупобегать
перебежать на дерево
повисетьпоесть
перебежать в норупошпать
Заканчиваем Smoke покрытие
E2E тест одной Фичиперебежать на
дерево
пошпать невидимым
проверить шуршпание
Используем момент для увеличения покрытия
перебежать в норупобегать
перебежать на дерево
повисетьпоесть
перебежать в норупошпать
Действия\Контексты Норы Деревья шуршпанят?
побегать !!e ! !
повисеть - !!e !
поесть !! !!e !
пошпать !!e !! !
- невидимым ? !!f !fПереходы: норы > деревья
eноры < деревья
e
Действия\Контексты Норы Деревья шуршпанят?
побегать !!e !f !f
повисеть - !!e !f
поесть !!f !!e !f
пошпать !!e !!f !f
- невидимым ? !!f !f
Закончили Smoke? - Переходим к полному (приемочному) покрытию с помощью фиче-тестов
Советы: покрываем
функциональные юз-кейсывысокого приоритета,
(пользователь будет использовать регулярно)
Советы: НЕ покрываем
низко-приоритетные проверкипроверки “всех возможных вариаций”
Действия\Контексты Норы Деревья шуршпанят?
побегать !!e !f !f
повисеть - !!e !f
поесть !!f !!e !f
пошпать !!e !!f !f
- невидимым ? !!f !f
Нет низко-приоритетным проверкам
Действия\Контексты Норы Деревья шуршпанят?побегать !!e !f !f
- быстро- медленно
повисеть - !!e !f- низко- высоко
поесть !!f !!e !f- много- мало
пошпать !!e !!f !f- невидимым ? !!f !f
Нет проверкам “всех возможных вариаций”
Действия\Контексты Норы Деревья шуршпанят?побегать !!e !f !f
- быстро- медленно
повисеть - !!e !f- низко- высоко
поесть !!f !!e !f- много- мало
пошпать !!e !!f !f- невидимым ? !!f !f
Должны быть покрыты на уровне юнит тестов
разные вариации одной “функции”(дающие тот же
“user flow” )
Мы здесь => => Только:функциональн
ыеюз-кейсывысокого
приоритетаразные вариации
одной “функции”
Здесь =>
Избегаем =>переносим
дополнительные требования такие как“разные типы даных”,
и другие “вариации функций”, и т. д. …<= в
=> из
Где код?
Спокойствие и только спокойствие:)
Product
От
Product
До
Действия
бегать, висеть, есть, шпать
создать, редактировать, удалить, переключить
(активная/завершенная), переключить все
Контексты
норы, деревьяфильтры:
все, активные, завершенные
Действия
бегать, висеть, есть, шпать
create, edit, delete, toggle, toggle all
Контексты
норы, деревьяфильтры:
all, active, completed
Одно и то же ;)
Сценарий (End to End)перебежать в нору
побегатьперебежать на дерево
повисетьпоесть
перебежать в норупошпать
Сценарий (End to End)given at todomvc
add "a" toggle "a" filter active
filter completededit "a" to "a edited"
toggle "a edited"…
Добавляем ожидаемые результатыgiven at todomvc
add "a" toggle "a" filter active
assert no tasks
filter completededit "a" to "a edited"
toggle "a edited"
assert no tasks
…
given at todomvc add "a"
toggle "a"
filter active
assert no tasks
filter completededit "a" to "a edited"
toggle "a edited"
assert no tasks
…
Часто можем оставить “неявные” проверки
Демо
Начнем же кодить ;)given at todomvc
add "a" toggle "a" filter active
assert no tasks
filter completededit "a" to "a edited"
toggle "a edited"
assert no tasks
…
Помогаем компьютеру понять код (на Java)givenAtTodoMVC();
add("a");
toggle("a"); filterActive();
assertNoTasks();
filterCompleted();
edit("a", "a edited");
toggle("a edited");
assertNoTasks();
//…
public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... }}
public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... }}
?
public static void givenAtTodoMVC(){ open("https://todomvc4tasj.herokuapp.com/"); newTask.shouldBe(enabled);}
givenAtTodoMVC();
public static SelenideElement newTask = $("#new-todo");
newTask
CSS Selector
CSS Selector ?
[id=“new-todo"] <=> #new-todo
public static SelenideElement newTask = $("#new-todo");
newTask
[id=“new-todo"] <=> #new-todo
public static void add(String taskText) { newTask.setValue(taskText).pressEnter();}
add("a");
public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click();}
toggle("a");
public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click();}
toggle("a");
public static ElementsCollection tasks = $$("#todo-list>li");
tasks
public static ElementsCollection tasks = $$("#todo-list>li");
tasks
public static void toggle(String taskText) { tasks.findBy(exactText(taskText)).$(".toggle").click();}
toggle("a");
public static void filterActive(){ $(By.linkText("Active")).click();}
filterActive();
By.linkText("Active")
public static void assertNoTasks() { tasks.filterBy(visible).shouldBe(empty);}
assertNoTasks();
tasks.filterBy(visible).shouldBe(empty);
public class TodoMVCTest { @Test public void testTasksLifeCycle(){ givenAtTodoMVC(); add("a"); toggle("a"); filterActive(); assertNoTasks(); filterCompleted(); edit("a", "a edited"); toggle("a edited"); assertNoTasks(); //... }}
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);
Просто?
End to End Юнит/1-фича-на-тестСтиль тестов
перебежать на дерево
пошпать невидимым
перебежать в нору
побегать
перебежать на дерево
повисеть
поесть
перебежать в нору
пошпать
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-фича-на-тестСтиль тестов
End to EndПлюсы
+ больше покрытия за меньшее время
с меньшими усилиями во время реализации POC
для фреймворка+ интеграционное покрытие
+ в случае багов, дают более
полный репорт+ с репортах проще идентифицировать проблему
=> + меньше времени и
усилий на саппорт
“Фиче-тесты”
End to EndКогда использовать?
+ в начале, во время разработки POC для фреймворка+ в спешке, для покрытия как можно большего количества фич+ для “черновиков”+ для интеграционного покрытия
+ для новых фич+ на регулярной
основе, когда POC утвержден
“Фиче-тесты”
Разве это было сложно? :)
Простые инструменты?
Easy tools?Java: Selenide
Python: Selene is coming…
C#: NSelene is coming…
Ruby: Capybara
? JavaScript: Protractor
? PHP: Codeception
Как начать?Выбрать язык
Выучить язык (книги, интерактивные туториалы, koans, exercism.io, google.com, другое)
Выбрать “простые инструменты”
Найти ментора (друг, программист на проекте, it-чаты, форумы, другое…)
Вперед!
Как выбрать язык?Есть проект?
=> язык на котором пишут разработчики (бекенд)
Нет проекта но нужно побыстрее найти работу?
=> самый популярный язык на рынке
Нет проекта, не важна скорость нахождения работы, важно удовольствие от процесса программирования?
=> язык который подходит вам по стилю
Нет простого инструмента для нужного языка?
Недостаточно опыта?
=> попросить программистов помочь
Есть опыт/время?
=> реализовать самому
Послесловие
Есть хорошие практики в контексте,
но нет самых лучших практик.
(c) Cem Kaner, James Bach
Вопросы
Спасибо
github.com/yashaka
youtube.com/c/ItlabsNetUa
gitter.im/yashaka/better-selenium
slideshare.net/yashaka
[email protected] @yashaka