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

Post on 13-Apr-2017

1.025 views 0 download

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

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

@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

yashaka@gmail.com @yashaka