Паттерн Singleton в автоматизации тестирования

Паттерн Singleton в автоматизации тестирования

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Всем привет. Подошло время рассмотреть шаблон Singleton (Одиночка). Он гарантирует, что в приложении существует не более одного экземпляра определенного класса. Также паттерн предоставляет глобальную точку доступа к этому экземпляру. К тому же,  он использует приватный конструктор и статическое свойство в сочетании со статической переменной.

Составляющие классы:

  • Page Objects (BingMainPage) – содержит действия, такие как Search и Navigate. Предоставляет доступ к классу валидации BingMainPageValidator. Сами объекты находятся в классе BingMainPageElementMap.
  • BasePageSingleton<S, M> – инкапсулирует доступ к карте элементов (map), создавая свойство для доступа к объекту, а также определяет метод Navigate. См. предыдущую статью.
  • BasePageSingleton<S, M, V> – добавляет создание объекта класса валидации.
  • ThreadSafeNestedContructorsBaseSingleton<T> – класс непосредственной реализации синглтона.

Все остальные элементы остались без изменения (также можете обратиться к предыдущей статье).

Самый простой способ интегрировать Синглтон в наши тесты – добавить статическую переменную и свойство в базовый класс BasePage.

Недостатком такого варианта есть то, что он  предотвращает создание классов в паттерне Facade.

Чтобы избежать этого, можно использовать не безопасный с точки зрения потоков класс BaseSingleton:

Для большинства случаев этот вариант подойдет. Но при использовании параллельного запуска тестов посоветую следующий вариант.

Потокобезопасный класс BaseSingleton с объектом Lock:

В этом случае, если другой поток попытается зайти в код, ограниченный lock функцией, он будет ждать, пока объект не высвободится:

Потокобезопасный класс BaseSingleton с неявной (Lazy) инициализацией:

Обобщенный встроенный в платформу .Net класс Lazy<T> дает возможность проводить неявную инициализацию. Он позволяет обезопасить также и объект Т:

И наконец-то более сложный вариант со вложенными классами и рефлексией:

Используя это вариант, классы BasePage теперь не будут иметь конструкторов, наследуя шаблон Singleton.

Теперь структура базовых классов будет немного изменена:

Заметьте, что классы являются абстрактными, наследуясь от ThreadSafeNestedContructorsBaseSingleton и не реализовывая его методы и свойства.

Класс объектов теперь наследуется от него:

Хочу обратить внимание, что конструктор этого класса теперь является приватным, что предостерегает нас от использования конструктора по-умолчанию.

Теперь создание объектов страниц осуществляется без использования ключевого слова new():

На этом все. До новых статей :)

Связанные статьи