<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Page Object Pattern on jUst QA blog</title>
    <link>https://slavaqa.pp.ua/tags/page-object-pattern/</link>
    <description>Recent content in Page Object Pattern on jUst QA blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>uk</language>
    <lastBuildDate>Mon, 10 Nov 2014 12:13:16 +0200</lastBuildDate><atom:link href="https://slavaqa.pp.ua/tags/page-object-pattern/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Про тестовий фреймворк замовте слово&amp;#8230;</title>
      <link>https://slavaqa.pp.ua/posts/2014/11/10/do-not-forget-to-mention-a-test-framework/</link>
      <pubDate>Mon, 10 Nov 2014 12:13:16 +0200</pubDate>
      <guid>https://slavaqa.pp.ua/posts/2014/11/10/do-not-forget-to-mention-a-test-framework/</guid>
      <description>&lt;h2 id=&#34;для-тих-хто-хоче-але-боїться-автоматизації&#34;&gt;«Для тих, хто хоче, але боїться автоматизації»&lt;/h2&gt;
&lt;p&gt;Не знаю, як для кого звучить згадка про тестовий фреймворк, але для мене, перш ніж став «тісно» працювати над автоматизацією слова когось на конференції/у відео-уроці «Я написав свій тестовий фрейморк» викликали шанобливу повагу та «тремтіння у колінах». Що цілком легко зрозуміло було, оскільки знань з програмування та розуміння того, з чим доведеться працювати було замало і по суті фраза сприймалася як «я написав свій ще крутіший варіант Selenium».&lt;/p&gt;</description>
      <content>&lt;h2 id=&#34;для-тих-хто-хоче-але-боїться-автоматизації&#34;&gt;«Для тих, хто хоче, але боїться автоматизації»&lt;/h2&gt;
&lt;p&gt;Не знаю, як для кого звучить згадка про тестовий фреймворк, але для мене, перш ніж став «тісно» працювати над автоматизацією слова когось на конференції/у відео-уроці «Я написав свій тестовий фрейморк» викликали шанобливу повагу та «тремтіння у колінах». Що цілком легко зрозуміло було, оскільки знань з програмування та розуміння того, з чим доведеться працювати було замало і по суті фраза сприймалася як «я написав свій ще крутіший варіант Selenium».&lt;/p&gt;
&lt;p&gt;Гугління і вікіпедіння не дуже допомагало, тому що скрізь також зустрічалися визначення типу «програмний продукт», «набір бібліотек» тощо. Асоціативний ряд відразу виводив до деяких .dll файлів, які виникають якимось складним і фантастичним чином.&lt;/p&gt;
&lt;p&gt;Насправді все не так. Точніше, не так «складно та фантастично». У всіх (які мені зустрічалися) курси автоматизації тестування з використанням Selenium перші уроки починаються з навчання роботі з Selenium IDE. Можливо, зі зростанням популярності Selenium Builder курси починатимуть навчати працювати з ним – але це так, ліричний відступ. Так ось, перший скрипт з IDE є набором команд, які є реалізацією фреймворку Selenium/Webdriver. Якщо його зберегти, підпиляти – то, в принципі, можна з ним і надалі працювати. Але проблема полягає в тому, що доведеться далі в тестах використовувати одні й ті ж повторення команд, одні й ті самі переходи, одні й самі алгоритми, елементи на сторінці/у вікні тощо, і т.д. Це незручно, довго та нудно. Набагато швидше вирішити квадратне рівняння за формулою (згадуємо шкільний курс:)), ніж будувати на мілімітровці графіки щоразу.&lt;br&gt;
Тобто. насправді, “тестовий фрейморк” – це “конструктор, зроблений з конструктора”.&lt;br&gt;
Один простий приклад: натиснути кнопку «Зберегти».&lt;br&gt;
Можна завжди у тестах писати так:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre data-wpae=&amp;#34;lang:csharp;theme:github;&amp;#34; style=&amp;#34;background-color: #ddd;&amp;#34;&amp;gt;driver.FindElement(By.Id(&amp;#34;ctl00_A_btnSave&amp;#34;)).Click();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Але що робити, якщо таких записів «багато-багато», а треба щось змінити? Або змінилося (в самому Selenium) назва методу натискання на елемент (став не Click(), а ClickElement()), або змінився ID, або ще якесь або? Для цього локатор зберігається окремо (в описі сторінки для PageObject/елемента сторінки HtmlObject), метод описується окремо, а всередині знаходиться той самий&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre data-wpae=&amp;#34;lang:csharp;theme:github;&amp;#34; style=&amp;#34;background-color: #ddd;&amp;#34;&amp;gt;driver.FindElement(By.Id(locator)).Click();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;І так, малими «цеглинами», вибудовується оперування сторінками/вікнами/діалогами, а потім з цих «найбільших цеглинок» збираються тести. Що буде найважливішими моментами при початку роботи над «своїм дітищем» (що дозволить потім вийти на сцену на конференції з тестування і гордо випнувши груди сказати «я написав свій тестовий фреймворк»:))?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Розуміння плюсів/особливостей мови, якою писатиметься. Зі своїх граблів: перші спроби «автоматизувати» довелося викинути/переписувати через те, що тести об’єкто-орієнтованою мовою писалися «по-старому». І змусити працювати «того монстра Франкенштейна» вдалося, але через тоді «незрозумілі милиці».&lt;/li&gt;
&lt;li&gt;Знання патернів (шаблонів, прийомів) проектування для тестових фреймворків. В інтернатах інформації багато, можливо, трохи пізніше «напишу і своє велосипедне пояснення». Зараз просто напишу так: якщо не знаєш, що має вийти – то може взагалі щось нікому незрозуміле.&lt;/li&gt;
&lt;li&gt;Планування. Не можна автоматизувати відразу і все. Почніть із простих сценаріїв.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Кому як, а для мене добрим підходом здається наступний:&lt;br&gt;
а) написати тест-кейси «на папірці»&lt;br&gt;
б) перенести в тестовий проект у «командному» вигляді, тобто. не&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre data-wpae=&amp;#34;lang:csharp;theme:github;&amp;#34; style=&amp;#34;background-color: #ddd;&amp;#34;&amp;gt;driver.FindElement(By.Id(locator)).Click();

а

Site.OpenPage(page1);
Site.Page1.ButtonSavePresent();
Site.Page1.ButtonSaveClick();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;який природно не проходитиме, оскільки всі (або частина) ці методи ще реалізовані.&lt;br&gt;
в) реалізувати методи, виходячи з того, що OpenPage «глобальніший», а&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre data-wpae=&amp;#34;lang:csharp;theme:github;&amp;#34; style=&amp;#34;background-color: #ddd;&amp;#34;&amp;gt;Page1.ButtonSaveClick();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;стосується лише Page1. І ось якраз цей самий момент реалізацій пункту і буде «тестовим фреймворком автоматизації».&lt;br&gt;
г) підготувати “code convention”. Навіть якщо автоматизацією на проекті займатиметься одна людина – варто заздалегідь продумати певні правила, як саме писати як код тестів, так і код «конструктора». Бажано обговорити з програмістами, бо якщо знадобиться їхня порада, щоб не виявилося, що код «написаний на абсолютно різних діалектах однієї мови». (Елементарне: як ставити фігурні дужки? На цьому ж рядку відкривати – чи з наступного? Якщо можна «і так, і так».)&lt;/p&gt;
&lt;p&gt;Природно, у фреймоврк варто заздалегідь закладати репортинг/логування результатів/звітність. Якщо це нове для вас – то не варто одразу чекати побудови гарних графіків. Відразу варто пам’ятати, що кількість тестів буде не 10 і тестових оточень буде більше ніж одна, а значить Grid і паралельне виконання тестів наближається. Звичайно не варто «відразу писати тести по всьому»: покрийте базову функціональність, основні сценарії, а потім приступайте до детальніших перевірок «всього». Природно, що тестових даних буде багато, а значить один і той же сценарій працюватиме на багатьох наборах даних (які читатимуться їх файли, бази даних, генеруватимуться «на льоту» залежно від контексту). Роботи багато, часу на реалізацію займе багато, особливо якщо з мовою програмування «на Ви» (про те, яку мову вибрати – теж треба подумати заздалегідь: якщо не буде «під рукою» людини, з якою можна порадитись щодо реалізації, то робота може “встати”, ще не розпочавшись).&lt;/p&gt;
&lt;p&gt;Але недаремно є приказка «терпіння і працю все перетруть».&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Запрацювало!</title>
      <link>https://slavaqa.pp.ua/posts/2013/08/28/it-works-finally/</link>
      <pubDate>Wed, 28 Aug 2013 11:05:20 +0300</pubDate>
      <guid>https://slavaqa.pp.ua/posts/2013/08/28/it-works-finally/</guid>
      <description>&lt;p&gt;Ура! Нарешті запрацювало!&lt;br&gt;
… або Переходимо до Page Object Pattern&lt;/p&gt;
&lt;p&gt;… Вирішив переробити структуру проекту автотестів із “банального” (але працюючого!:)) варіанта&lt;br&gt;
&lt;strong&gt;Constants &amp;lt;- Helper &amp;lt;- Test &amp;lt;-Runners&lt;/strong&gt;&lt;br&gt;
в&lt;br&gt;
&lt;strong&gt;Helper &amp;lt;- Modules; Tests (Helper, Modules)&lt;/strong&gt;&lt;br&gt;
де &lt;strong&gt;Modules&lt;/strong&gt; – окремі класи (файли) для різних сторінок програми, Tests (Helper, Modules) – окремі класи (файли) для тест-сьютів для кожного окремого модуля (сторінки), що використовують методи з базового класу Helper та спадкоємців Modules. Та ось невдача: знань з основ програмування на C# не вистачало. Після кількаденного танцю із бубнем та переписування всього, консультацій з хлопцями-програмістами з проекту вийшло ось що у файлі тестів&lt;/p&gt;</description>
      <content>&lt;p&gt;Ура! Нарешті запрацювало!&lt;br&gt;
… або Переходимо до Page Object Pattern&lt;/p&gt;
&lt;p&gt;… Вирішив переробити структуру проекту автотестів із “банального” (але працюючого!:)) варіанта&lt;br&gt;
&lt;strong&gt;Constants &amp;lt;- Helper &amp;lt;- Test &amp;lt;-Runners&lt;/strong&gt;&lt;br&gt;
в&lt;br&gt;
&lt;strong&gt;Helper &amp;lt;- Modules; Tests (Helper, Modules)&lt;/strong&gt;&lt;br&gt;
де &lt;strong&gt;Modules&lt;/strong&gt; – окремі класи (файли) для різних сторінок програми, Tests (Helper, Modules) – окремі класи (файли) для тест-сьютів для кожного окремого модуля (сторінки), що використовують методи з базового класу Helper та спадкоємців Modules. Та ось невдача: знань з основ програмування на C# не вистачало. Після кількаденного танцю із бубнем та переписування всього, консультацій з хлопцями-програмістами з проекту вийшло ось що у файлі тестів&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-sharp&#34; data-lang=&#34;sharp&#34;&gt;{
    public TestsFirefox(): base(new FirefoxDriver())
    { }
}

public class TestsIE : TestsCases2TS
{
    public TestsIE(): base(new InternetExplorerDriver())
    { }
}

public TestsCases2TS(IWebDriver browser): this()
{
    Helper.driver = browser;
}

public TestsCases2TS()
{
    myHelper = new Helper();
    myModule = new Module();
    myHelper.baseURL = Helper.testServerBaseUrl;
    myHelper.verificationErrors = new StringBuilder();
}
public Helper myHelper { get; set; }
public Module myModule { get; set; }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;І ось ЦЕ запрацювало!:) (власне, описи тестів та методів у самих файлах залишилися майже без змін)&lt;/p&gt;
&lt;p&gt;Але більш докладно розібратися з конструкторами, інкапсуляцією та іншими радощами реалізації ООП в C# мені ще належить…&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
