Всем привет. Мы уже рассмотрели несколько паттернов проектирования, теперь пришел черед к фасаду.
Этот шаблон объединяет группу объектов в рамках одного специализированного интерфейса и переадресует вызовы его методов к этим объектам.
Его использование необходимо, если нужно:
- упростить доступ к сложной системе;
- уменьшить число зависимостей между системой и клиентом;
- создать различные уровни доступа к системе.
Прежде всего нужно уточнить, что интерфейс, предоставляющий шаблон, не является суммой всех методов объектов, входящих в систему. Создание такой обобщенной версии приводит к появлению “божественного интерфейса”, – интерфейса с огромным числом методов, без четко выраженной цели и порождающего большое количество зависимостей. Таким образом, назначение Фасада – создать интерфейс, содержащий методы для решения определённой задачи или предоставляющий некоторую абстракцию исходной системы.
Как и раньше, опишем основные элементы и классы проекта:
- Facade (класс проекта PurchaseFacade) – содержит объекты страниц и вызовы методов-действий над ними.
- Page Objects (например, ItemPage, ShippingAddressPage, ShoppingCartPage, SignInPage) – содержат реализацию методов, например, Search и Navigate. Также предоставляют доступ к методам-валидаторам, содержащимся в других классах, например, ItemPageValidator. Как и раньше, мы используем классы элементов, – SignInPageMap и т. д.
- UI тесты (Facade_Tests) – содержит тест(ы). Может иметь только один объект Фасада.
Что будет выполнять наш тест?
1. Переходить на страницу товара спортивного магазина: http://www.prodirectsoccer.com/products/Nike-Team-Training-Ball-Football-Balls-Yellow-Yellow-Purple-61857.aspx?
2. Проверять цену.
3. Выбирать размер мяча:
4. Нажимать на кнопку “BUY NOW”.
5. Переходить в корзину путем нажатия на нее в шапке сайта.
6. Нажимать на кнопку “CHECKOUT:
7. После этого выполнять вход.
8. Заполнять необходимые поля для доставки.
9. Нажимать на кнопку “PROCEED TO PAYMENT”:
Структура проекта
Солюшен проекта представлен ниже:
Core и Pages мы рассмотрели в предыдущей статье. Стоит только обратить внимание на ShippingAddressPage, где содержится метод для заполнения полей доставки товара:
1 2 3 4 5 |
public void FillShippingInfo(ClientInfo clientInfo) { this.Map.FirstName.Clear(); this.Map.FirstName.SendKeys(clientInfo.FirstName); } |
Класс ClientInfo объявляет лишь поля, с которых мы будем использовать лишь первые два:
1 2 3 4 5 6 7 8 9 10 11 |
public class ClientInfo { public string FirstName { get; set; } public string LastName { get; set; } public string Country { get; set; } public string Address1 { get; set; } public string City { get; set; } public string Phone { get; set; } public string Zip { get; set; } public string Email { get; set; } } |
Рассмотрим непосредственно класс фасада:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using FacadeSeleniumFramework.Pages.ItemPage; using FacadeSeleniumFramework.Pages.ShippingAddressPage; using FacadeSeleniumFramework.Pages.ShoppingCartPage; using FacadeSeleniumFramework.Pages.SignInPage; using System; using System.Linq; namespace FacadeSeleniumFramework { public class PurchaseFacade { private ItemPage itemPage; private ShippingAddressPage shippingAddressPage; private SignInPage signInPage; private ShoppingCartPage shoppingCartPage; public ItemPage ItemPage { get { if (itemPage == null) { itemPage = new ItemPage(); } return itemPage; } } public SignInPage SignInPage { get { if (signInPage == null) { signInPage = new SignInPage(); } return signInPage; } } public ShippingAddressPage ShippingAddressPage { get { if (shippingAddressPage == null) { shippingAddressPage = new ShippingAddressPage(); } return shippingAddressPage; } } public ShoppingCartPage ShoppingCartPage { get { if (shoppingCartPage == null) { shoppingCartPage = new ShoppingCartPage(); } return shoppingCartPage; } } public void ProceedToPayment(string item, string itemPrice, ClientInfo clientInfo) { this.ItemPage.Navigate(item); this.ItemPage.Validate().Price(itemPrice); this.ItemPage.ChooseSize(); this.ItemPage.ClickBuyNowButton(); this.ItemPage.GoToShoppingCart(); this.ShoppingCartPage.ClickCheckoutButton(); this.SignInPage.Login(); this.ShippingAddressPage.FillShippingInfo(clientInfo); this.ShippingAddressPage.ClickProceedButton(); } } } |
Он содержит свойства, которые возвращают соответствующие объекты страниц. И если возникнуть какие-то изменения, то нам придется сделать изменения лишь в классах элементов, валидаторах или же в методе ProceedToPayment, если изменение в логике.
Ниже представлен код самого теста:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace FacadeSeleniumFramework { [TestClass] public class Facade_Tests { [TestInitialize] public void SetupTest() { Driver.StartBrowser(); } [TestCleanup] public void TeardownTest() { Driver.StopBrowser(); } [TestMethod] public void Purchase_Football_Ball() { string itemUrl = "products/Nike-Team-Training-Ball-Football-Balls-Yellow-Yellow-Purple-61857.aspx?"; string itemPrice = "£8.00"; ClientInfo currentClientInfo = new ClientInfo() { FirstName = "Max Khimiy" }; new PurchaseFacade().ProceedToPayment(itemUrl, itemPrice, currentClientInfo); } } } |
Проект можно просмотреть по ссылке.
На этом все, подписывайтесь на рассылку!