Найти в Дзене

Паттерны для тестировщиков: proxy

Оглавление
Статья подготовлена для студентов курса «Java QA Automation Engineer» в образовательном проекте OTUS.

Главная идея паттерна proxy (в русскоязычных изданиях его называют «заместитель») состоит в том, чтобы выдать для работы не реальный объект, а подмену, которая использует методы объекта и нашу логику, если мы такую добавили.

Как это делается

1) Создаём интерфейс с публичными методами объекта, который хотим подменить.

2) Создаём класс, который:

— реализует этот интерфейс;

— имеет доступ к оригинальному объекту, чтобы вызывать его методы.

3) Добавляем в методы созданного класса свою логику.

Практика

На практике должно быть понятней.

Дано: есть у нас WebDriver. И есть у него метод findElements(By by);

Задача: мне очень сильно нужно логировать, сколько элементов было найдено по селектору.

Каждый раз, когда я вызываю метод:

-2

я хочу видеть в логах запись — сколько элементов было найдено.

Решение 1. В лоб

Чего уж там: я его применял. Просто берём и при каждом вызове пишем, сколько было найдено:

-3

Вариант нормальный, пока таких вызовов, ну, скажем, 7. Хотя уже неприятно и минусы такого подхода очевидны любому, кто хоть раз «слегка модифицировал свой код».

Решение 2. Используем прокси

WebDriver — интерфейс. Объявлены методы, но нет реализации. Реализацию содержат ChromeWebDriver, FirefoxWebDriver и т. д. Нам, в тестах, не обязательно работать с каким-то конкретным классом для хрома или сафари. Нужно только, чтобы класс имплементил интерфейс WebDriver. Это и сделаем.

Создаём интерфейс с публичными методами объекта, который хотим подменить. В нашем примере такой интерфейс уже есть — WebDriver. Создаём класс, который:

— реализует этот интерфейс;

— имеет доступ к оригинальному объекту, чтобы вызывать его методы.

-4

Добавляем в методы созданного класса свою логику:

-5

Что произошло?

В класс добавлен:

-6

Это тот самый объект, который мы хотим подменить. Именно его методы мы будем вызывать дальше. Теперь, можно посмотреть, например, на метод:

-7

Всё, что делает метод, — вызывает get() у настоящего драйвера. А вот метод:

-8

Мы расширили в соответствии с нашей задачей. Вот и всё, можно юзать в тестах:

-9

Паттерн хорош, если нужно навесить логирование, кэширование, ленивую инициализацию, контроль доступа к методам. В общем, если вы пишете код и вам очень хочется, чтобы была какая-то прослоечка с вашими фичами, один из вариантов — прокси.

Теперь, когда мы знаем на один паттерн больше, напомню, что когда в руке молоток, всё вокруг кажется гвоздями. Просто помните об этом.


Набор студентов на курс «Java QA Automation Engineer» уже открыт, не пропустите! 
ВСТУПИТЕЛЬНОЕ ТЕСТИРОВАНИЕ