Как не изобретать велосипед, или паттерны...

47
1 Как не изобретать велосипед, или паттерны проектирования для автотестов Вадим Зубович

Upload: sqalab

Post on 09-Jan-2017

157 views

Category:

Education


3 download

TRANSCRIPT

Page 1: Как не изобретать велосипед, или паттерны проектирования для автотестов

1

Как не изобретать велосипед, или паттерны проектирования

для автотестовВадим Зубович

Page 2: Как не изобретать велосипед, или паттерны проектирования для автотестов

2

О себе

Вадим Зубович

Automation Tech/Team LeadISsoft / Coherent Solutions

www.coherentsolutions.comwww.comaqa.bywww.dpi.solutions

Page 3: Как не изобретать велосипед, или паттерны проектирования для автотестов

3

Создать чистую

архитектуру

Главные трудности при написании автотестов

Избежать перегруженн

ой архитектуры

Page 4: Как не изобретать велосипед, или паттерны проектирования для автотестов

4

Инкапсуляция – важнейший принцип ООП

Казалось бы, при чем здесь инкапсуляция?

Page 5: Как не изобретать велосипед, или паттерны проектирования для автотестов

5

Инкапсуляция – важнейший принцип ООП

Она лежит в основе всех рассматриваемых паттернов, а стало быть понимание и применение ее является ключевым для правильного понимания паттернов

Page 6: Как не изобретать велосипед, или паттерны проектирования для автотестов

6

Что такое инкапсуляция?

Инкапсуляция это ограничение доступа к внутренним данным одного компонента программы для других компонентов, с предоставлением готового интерфейса для доступа к этим данным.

Иными словами:

Мы скрываем логику и детали реализации алгоритма, создаем механизмы и правила изменения внутренних данных и предоставляем возможность изменять эти данные в соответствии с созданными правилами.

Инкапсуляция – важнейший принцип ООП

Page 7: Как не изобретать велосипед, или паттерны проектирования для автотестов

7

Пример на пальцах

Инкапсуляция – важнейший принцип ООП

Page 8: Как не изобретать велосипед, или паттерны проектирования для автотестов

8

Элементы (блоки) готового к повторному использованию кода;

Паттерны проектирования – простейшее определение

Готовая к повторному использованию форма решения архитектурной задачи;

Page 9: Как не изобретать велосипед, или паттерны проектирования для автотестов

9

Паттерны проектирования, которые относятся к определенной области (например автоматизация тестирования) называется языком паттернов (pattern language)

Паттерны проектирования как язык

Язык паттернов проектирования обеспечивает общую терминологию для обсуждения и решения проблем, с которыми сталкиваются специалисты

Page 10: Как не изобретать велосипед, или паттерны проектирования для автотестов

10

Паттерны, относящиеся к области автоматизации тестирования:

Паттерны проектирования для автоматизации тестирования

• Page Element• Page Object• Action• Flow• DSL• Navigator (for Web)

Page 11: Как не изобретать велосипед, или паттерны проектирования для автотестов

11

Page Element – инкапсулирует «сложность» отдельного UI-элемента. Каноничный пример – таблица как часть пользовательского интерфейса.

Page Element

Page 12: Как не изобретать велосипед, или паттерны проектирования для автотестов

12

Page Element

Page 13: Как не изобретать велосипед, или паттерны проектирования для автотестов

13

Page Element

Page 14: Как не изобретать велосипед, или паттерны проектирования для автотестов

14

Page Element

Page 15: Как не изобретать велосипед, или паттерны проектирования для автотестов

15

Page Element

Page 16: Как не изобретать велосипед, или паттерны проектирования для автотестов

16

Page Object – инкапсулирует способ идентификации и логическое группирование элементов.

Page Object

Page 17: Как не изобретать велосипед, или паттерны проектирования для автотестов

17

Page Object по Мартину Фаулеру, правило логической страницы

Page Object == Logical PagePage Object != Physical Page

Header

Menu

Footer

Conten

t

Page 18: Как не изобретать велосипед, или паттерны проектирования для автотестов

18

Где должны находиться проверки (asserts)?

Page Object по Мартину Фаулеру, правило проверок

Page 19: Как не изобретать велосипед, или паттерны проектирования для автотестов

19

Статический класс

Объект или статический класс?

Page 20: Как не изобретать велосипед, или паттерны проектирования для автотестов

20

Объект

Объект или статический класс?

Page 21: Как не изобретать велосипед, или паттерны проектирования для автотестов

21

Вывод

Объект или статический класс?

– В подавляющем большинстве случаев предпочтительнее использовать решения на базе статических классов (stateless);

– Прежде чем использовать решение с использованием объектов, сделайте перерыв, подумайте снова, возможно вы найдете подходящее решение на базе статических классов.

Page 22: Как не изобретать велосипед, или паттерны проектирования для автотестов

22

UI работает в режиме “Wizard”

Page Object на базе объектов, особые случаи

Page 23: Как не изобретать велосипед, или паттерны проектирования для автотестов

23

Веб UI вместе с мобильным “native view”

Page Object на базе объектов, особые случаи

Page 24: Как не изобретать велосипед, или паттерны проектирования для автотестов

24

Интернет вещей (в большинстве случаев)

Page Object на базе объектов, особые случаи

Page 25: Как не изобретать велосипед, или паттерны проектирования для автотестов

25

Сложные сценарии, подразумевающие переходы более чем на 1 страницу в рамках одного теста (например несколько порталов или разных страниц одного приложения передают друг другу данные в рамках одного “business use case”):

Page Object на базе объектов, особые случаи

– Такое встречается редко;– Больше похоже на интеграционные тесты.

Page 26: Как не изобретать велосипед, или паттерны проектирования для автотестов

26

Добавьте ваши примеры

Page Object на базе объектов, особые случаи

Page 27: Как не изобретать велосипед, или паттерны проектирования для автотестов

27

Page Object – Архитектура проекта

Page 28: Как не изобретать велосипед, или паттерны проектирования для автотестов

28

Action – набор вызовов низкоуровневых функций (в нашем случае Selenium или оберток над ним), объединенных одним пользовательским действием.

Action

Page 29: Как не изобретать велосипед, или паттерны проектирования для автотестов

29

Action как правило используется совместно с паттернами Page Element и Page Object.

Action

Page 30: Как не изобретать велосипед, или паттерны проектирования для автотестов

30

Слой Action может быть представлен отдельно от слоя Page Object.

Action

Page 31: Как не изобретать велосипед, или паттерны проектирования для автотестов

31

2 «типа» Actions:

Action

Ориентированные на автоматизаторов

Ориентированные на «бизнес» (~Product Owner)

может содержать буквально несколько строк кода для облегчения работы с элементами

может включать в себя целый тест

Page 32: Как не изобретать велосипед, или паттерны проектирования для автотестов

32

В подавляющем большинстве случаев не стоит хранить проверки в Action:

Action - рекомендация

– Нет смысла проверять одну и ту же часть функционала при каждом вызове;– Такой подход может продлить время прогона тестов;

Page 33: Как не изобретать велосипед, или паттерны проектирования для автотестов

33

Flow – Fluent interface это реализация объектно-ориентированного API, целью которой является повышение читаемости кода.

Flow по определению wiki

Fluent interface обычно реализуется с использованием «каскадирования» методов (конкретнее - построения цепочки методов) чтобы предоставить дополнительный контекст в виде последующих вызовов (однако fluent interface характеризуется не только построением цепочек).

Как правило контекст определяется через возвращаемое методом значение, и прекращается возвращением пустого значения (тип void).

Page 34: Как не изобретать велосипед, или паттерны проектирования для автотестов

34

Flow – пример

Page 35: Как не изобретать велосипед, или паттерны проектирования для автотестов

35

Flow – пример

Page 36: Как не изобретать велосипед, или паттерны проектирования для автотестов

36

Flow – пример

Page 37: Как не изобретать велосипед, или паттерны проектирования для автотестов

37

Основная идея DSL заключается в создании компьютерного языка, ориентированного на решение конкретной задачи (Автоматизация тестирования или даже автоматизация в конкретном домене), а не языка общего назначения, который ориентирован на решение любой задачи. Доменно-специфичные языки существуют и используются с самых первых дней вычислительной техники.

DSL по Мартину Фаулеру

Page 38: Как не изобретать велосипед, или паттерны проектирования для автотестов

38

DSL = Язык, специфичный для доменаБизнес домена

Технического домена

DSL – Domain Specific Language

Page 39: Как не изобретать велосипед, или паттерны проектирования для автотестов

39

Писать тесты на какой-либо форме доменно-специфичного языка является распространенным явлением, например Cucumber. Если прибегать к этому подходу, то лучше всего создавать этот слой поверх page object, чтобы в итоге получился парсер, который будет преобразовывать выражения на DSL в вызовы методов на page object.

DSL по Мартину Фаулеру

Page 40: Как не изобретать велосипед, или паттерны проектирования для автотестов

40

Внутренние DSL - использование языка общего назначения таким образом, что ему придаются свойства определенного узконаправленного языка. Такой подход получил огромную популярность в Ruby-сообществе, хотя у него была богатая история в других языках, например в Lisp. Хотя обычно проще это делать в низкоуровневых языках, можно успешно реализовывать внутренние DSL в более распространенных языках, как Java и C#. Внутренние DSL также называют вложенными DSL

Типы DSL по Мартину Фаулеру

Внешние DSL характеризуются своим собственным синтаксисом и для них пишутся полноценные парсеры. В Unix community давно существует традиция создания подобных языков. Многие конфигурации XML стали в итоге внешними DSL.

Page 41: Как не изобретать велосипед, или паттерны проектирования для автотестов

41

Navigator – следует принципам “DRY” и “Single source of truth”, инкапсулирует «сложность» ссылок/переходов по веб-страницам, таким образом бизнес-логика не смешивается с перемещением по приложению.

Navigator (for Web)

Page 42: Как не изобретать велосипед, или паттерны проектирования для автотестов

42

Navigator (for Web)

Page 43: Как не изобретать велосипед, или паттерны проектирования для автотестов

43

1. “Если в ваших тестовых методах есть обращения к WebDriver API, вы делаете это неправильно.” – Саймон Стюарт

3 главных принципа / правила

=

Page 44: Как не изобретать велосипед, или паттерны проектирования для автотестов

44

2. Не повторяйся (DRY): “Каждый фрагмент знаний должен иметь единственное, однозначное, надежное представление в сисиеме” -  Эндрю Хант и Дэйв Томас в книге «Программист-прагматик»

3 главных принципа / правила

=

Page 45: Как не изобретать велосипед, или паттерны проектирования для автотестов

45

3. “Теория разбитых окон” -  Эндрю Хант и Дэйв Томас в книге «Программист-прагматик»

3 главных принципа / правила

=

Page 46: Как не изобретать велосипед, или паттерны проектирования для автотестов

46

Page Object – универсальный паттерн, подходящий для любого проекта

Выводы

Page Element годится для случаев, когда на проекте есть повторяющиеся в неизменном, либо изменяемом виде сложные элементы, состоящие из набора простых элементов (таблица, строка поиска, форма)

Action – упрощение работы с Page Object, следовательно имеет смысл на большинстве проектов

Fluent interface – хорош, если есть потребность в приближении кода тестов к бизнес-домену, кроме того исключает возможность нарушить бизнес-логику

DSL – разработка своего DSL хороша лишь в том случае, если стандартные инструменты не позволяют провести тестирование (например тестирование через API приложения)

Navigator – подходит для проектов со сложной структурой приложения

Page 47: Как не изобретать велосипед, или паттерны проектирования для автотестов

47

Спасибо за внимание

Вадим ЗубовичISSoft Solutions

www.coherentsolutions.comwww.comaqa.by

www.dpi.solutions