EPAM JDI UI TEST
AUTOMATION FRAMEWORK
QA Conference
March 2016
Chief QA Automation
Работал руководителем отдела тестирования
Более 11 лет в тестировании из них 9 в
автоматизации
Роман Иовлев
•Новый проект (сверху)
•Новый проект (снизу)
•Долгий проект без автоматизации
Автоматизация
UI Автоматизация
Виды тестирования Виды UI тестирования
UI Web
Just Develop It together
UI OBJECTS
Шаблон UI Objects
• UI Objects (Epam)
• Пользовательские типизированные элементы для UI (Web, Mobile, Desktop…)
• Реализованные Page Objects (Page, Form, Search, Pagination, Login и т.д..)
• HTML Elements (Yandex)
• Пользовательские типизированные элементы (Button, Label, Table…) для Web
• Page Objects (Selenium)
• Список WebElement-ов (тегов в Html)
• Действия с WebElement-ами
@Test
public void menuTest() {
menu.select("Man");
sizes.check("M", "L");
searchButton.click();
Assert.areEquals(results.rows().count(), 4);
Assert.isNotEmpty(results.row("Best Jacket", column("Title")));
}
Пример теста
@JPage(url = "http://www.epam.com")
public class BuyPage extends WebPage {
@FindBy(css = “.menu") public Menu menu;
@FindBy(xpath = “//[@class=‘sizes’]") public CheckList sizes;
@FindBy(id = “button") public Button searchButton;
@FindBy(css = “.table") public Table results;
}
Пример UI Object
WebPage
Menu
CheckList
Button
Table
@Test
public void menuTest() {
selectInMenu("Man");
checkSizes("M", "L");
clickOnSearchButton();
Assert.areEquals(getResultRowsCount(), 4);
Assert.isEmpty(!getRowFromResults("Best Jacket", "Title"));
}
А как это выглядит на Selenium?
@FindBy(css = "") private List<WebElement> menuElements;
@FindBy(css = "") private WebElement menuIsSelected;
@FindBy(css = "") private List<WebElement> sizesElements;
@FindBy(css = "") private WebElement sizesIsChecked;
@FindBy(css = "") private List<WebElement> sizesLabels;
@FindBy(css = "") private WebElement searchButton;
@FindBy(css = "") private List<WebElement> resultsColHeaders;
@FindBy(css = "") private List<WebElement> resultsRowsHeaders;
@FindBy(css = "") private List<WebElement> resultsCellsHeaders;
@FindBy(css = "") private List<WebElement> resultsColumn;
@FindBy(css = "") private List<WebElement> resultsRow;
…
}
А как это выглядит на Selenium?
…
public void selectInMenu(string name) { … }
public void checkSizes(string… sizes) { … }
public void clickOnSearchButton() { … }
public int getResultRowsCount () { … }
public Map<string, string>
getRowFromResults(string expectedValue, string colName) { … }
…
public int getResultsCount() { … }
public boolean isResultPresent(String name) { … }
public WebElement getSomeAttributeForResult(String name)
{ … }
…
public List<WebElement> findAllResultsMatch(String name) {
… }
}
protected WebDriver driver;
public JacketPage(WebDriver driver) {
this.driver = driver
}
public class JacketPage {
Web, Mobile, Desktop…
C# .Net
Java
JDI.UITestFramework
Web-Selenium
<dependency>
<groupId>com.epam.jdi</groupId>
<artifactId>jdi-uitest-web</artifactId>
<version>1.0.2-SNAPSHOT </version>
</dependency>
Desktop-Sikuli
<dependency>
<groupId>com.epam.jdi</groupId>
<artifactId>jdi-uitest-gui</artifactId>
<version>1.0.2-SNAPSHOT </version>
</dependency>
Mobile-Appium
<dependency>
<groupId>com.epam.jdi</groupId>
<artifactId>jdi-uitest-mobile</artifactId>
<version>1.0.2-SNAPSHOT </version>
</dependency>
@JSite(domain = "https://www.epam.com")
public class EpamSite extends WebSite {
@JPage(url = "/")
public static HomePage homePage;
@JPage(url = "/careers", title = "Careers")
public static CareerPage careerPage;
@JPage(url = "/careers/job-listings", title = "Job Listings",
urlCheckType = CONTAIN, titleCheckType = CONTAIN)
public static JobPage jobPage;
...
}
Сайт и страницы
Epam site
Home page
• Navigation Menu : IMenu
• Search : ISearch
• Footer : Footer
• About : Ilink
• Contacts: IText
Career page
• JobFilter
• Keywords
• Category
• City
Job page
• …
WebSite.init(EpamSite.class);WebSite.init(EpamSite.class);
@JPage(url = "http://www.epam.com")
public class BuyPage extends WebPage {
@FindBy(css = “.menu") public Menu menu;
@FindBy(xpath = “//[@class=‘sizes’]") public CheckList sizes;
@FindBy(id = “button") public Button searchButton;
@FindBy(css = “.table") public Table results;
@Frame(css = “.store") public Store store;
}
Пример UI Object
public class AddCVForm extends Form<Attendee> {
@FindBy(css = “.first-name“) private ITextField name;
@FindBy(css = “.last-name“) private ITextField lastName;
@FindBy(css = “.email“) private ITextField email;
@FindBy(css = “.file-upload“) private RFileInput cv;
@FindBy(css = “.comment-input“) private ITextArea comment;
@FindBy(xpath = “//*[.='Submit']“) private IButton submit;
@FindBy(xpath = “//*[.='Cancel']“) private IButton cancel;
}
Формы
@Test(dataProvider = “attendees”)
public void menuTest(Attendee attendee) {
searchFilter.fill(attendee);
checkSuggestionsContains(attendee);
searchFilter.search(attendee);
assertEquals(results.rows().count(), 1);
results.row(attendee.name, column(“Name”))
addCVForm.submit(attendee.cv);
checkCVInDB(attendee.cv);
previewForm.verify(attendee);
}
EDT (Entities driven testing)
loginForm.login(user);
purchase.cancel(wear);
experiment.publish(experiment);
creditForm.save(order.data);
…
public class User {
public String name;
public String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
}
• JDI – фреймворк реализующий подход UI Objects
• Большое количество элементов (более 30) включая сложные (с 10-ками
действий)
• Иерархическая инициализация UI Objects
• Умеет работать с Фреймами
• Поддерживает EDT
UI Objects
ИНТЕГРАЦИЯ
КАСТОМИЗАЦИЯ
СТАБИЛИЗАЦИЯ
“Easy things should be easy, and hard things should be possible”
Larry Wall (c)
Концепция
Модульная структура
Наши друзья
Кастомизация
Конкретное действие
Новый тип элемента
Все действия всех элементов
Стабилизация
Уменьшить затрат (время/деньги) на написание тестов в целом и
создание модели сайта в частности в разы (если не на порядки)*
Уменьшение затрат на поддержку тестов
Читабельность тестов (UI Objects)
Уменьшение времени поиска багов
Читабельность тестов (UI Objects)
Логирование
Репортинг
PROFIT!!!
* Объектная модель экономия до 80% времени
Написание тестов около 50% времени
Затраты на поддержку тестов экономия до 70%
Поиск багов экономия 30-50%
Уменьшение числа false-positive/negative
Стабилизация
Читабельность тестов (UI Objects)
Любой UI (Web, Mobile, Desktop)
Поддержка Java и C#
Удовольствие от автоматизации
PROFIT!!!
Планы
No effort performance testing
Tests execution statistic
UI view testing module
Web plugin for fast PageObjects recording
Ожидания
Вопросы?
https://jdi.epam.com
https://github.com/epam/JDI
https://vk.com/jdi_framework
roman.Iovlev
roman_iovlev@epam.com

SECON'2016. Иовлев Роман, JDI is UI Automation Future

  • 1.
    EPAM JDI UITEST AUTOMATION FRAMEWORK QA Conference March 2016
  • 2.
    Chief QA Automation Работалруководителем отдела тестирования Более 11 лет в тестировании из них 9 в автоматизации Роман Иовлев
  • 3.
    •Новый проект (сверху) •Новыйпроект (снизу) •Долгий проект без автоматизации Автоматизация
  • 4.
    UI Автоматизация Виды тестированияВиды UI тестирования UI Web
  • 5.
  • 6.
  • 7.
    Шаблон UI Objects •UI Objects (Epam) • Пользовательские типизированные элементы для UI (Web, Mobile, Desktop…) • Реализованные Page Objects (Page, Form, Search, Pagination, Login и т.д..) • HTML Elements (Yandex) • Пользовательские типизированные элементы (Button, Label, Table…) для Web • Page Objects (Selenium) • Список WebElement-ов (тегов в Html) • Действия с WebElement-ами
  • 8.
    @Test public void menuTest(){ menu.select("Man"); sizes.check("M", "L"); searchButton.click(); Assert.areEquals(results.rows().count(), 4); Assert.isNotEmpty(results.row("Best Jacket", column("Title"))); } Пример теста
  • 9.
    @JPage(url = "http://www.epam.com") publicclass BuyPage extends WebPage { @FindBy(css = “.menu") public Menu menu; @FindBy(xpath = “//[@class=‘sizes’]") public CheckList sizes; @FindBy(id = “button") public Button searchButton; @FindBy(css = “.table") public Table results; } Пример UI Object WebPage Menu CheckList Button Table
  • 10.
    @Test public void menuTest(){ selectInMenu("Man"); checkSizes("M", "L"); clickOnSearchButton(); Assert.areEquals(getResultRowsCount(), 4); Assert.isEmpty(!getRowFromResults("Best Jacket", "Title")); } А как это выглядит на Selenium?
  • 11.
    @FindBy(css = "")private List<WebElement> menuElements; @FindBy(css = "") private WebElement menuIsSelected; @FindBy(css = "") private List<WebElement> sizesElements; @FindBy(css = "") private WebElement sizesIsChecked; @FindBy(css = "") private List<WebElement> sizesLabels; @FindBy(css = "") private WebElement searchButton; @FindBy(css = "") private List<WebElement> resultsColHeaders; @FindBy(css = "") private List<WebElement> resultsRowsHeaders; @FindBy(css = "") private List<WebElement> resultsCellsHeaders; @FindBy(css = "") private List<WebElement> resultsColumn; @FindBy(css = "") private List<WebElement> resultsRow; … } А как это выглядит на Selenium? … public void selectInMenu(string name) { … } public void checkSizes(string… sizes) { … } public void clickOnSearchButton() { … } public int getResultRowsCount () { … } public Map<string, string> getRowFromResults(string expectedValue, string colName) { … } … public int getResultsCount() { … } public boolean isResultPresent(String name) { … } public WebElement getSomeAttributeForResult(String name) { … } … public List<WebElement> findAllResultsMatch(String name) { … } } protected WebDriver driver; public JacketPage(WebDriver driver) { this.driver = driver } public class JacketPage {
  • 12.
    Web, Mobile, Desktop… C#.Net Java JDI.UITestFramework Web-Selenium <dependency> <groupId>com.epam.jdi</groupId> <artifactId>jdi-uitest-web</artifactId> <version>1.0.2-SNAPSHOT </version> </dependency> Desktop-Sikuli <dependency> <groupId>com.epam.jdi</groupId> <artifactId>jdi-uitest-gui</artifactId> <version>1.0.2-SNAPSHOT </version> </dependency> Mobile-Appium <dependency> <groupId>com.epam.jdi</groupId> <artifactId>jdi-uitest-mobile</artifactId> <version>1.0.2-SNAPSHOT </version> </dependency>
  • 13.
    @JSite(domain = "https://www.epam.com") publicclass EpamSite extends WebSite { @JPage(url = "/") public static HomePage homePage; @JPage(url = "/careers", title = "Careers") public static CareerPage careerPage; @JPage(url = "/careers/job-listings", title = "Job Listings", urlCheckType = CONTAIN, titleCheckType = CONTAIN) public static JobPage jobPage; ... } Сайт и страницы Epam site Home page • Navigation Menu : IMenu • Search : ISearch • Footer : Footer • About : Ilink • Contacts: IText Career page • JobFilter • Keywords • Category • City Job page • … WebSite.init(EpamSite.class);WebSite.init(EpamSite.class);
  • 14.
    @JPage(url = "http://www.epam.com") publicclass BuyPage extends WebPage { @FindBy(css = “.menu") public Menu menu; @FindBy(xpath = “//[@class=‘sizes’]") public CheckList sizes; @FindBy(id = “button") public Button searchButton; @FindBy(css = “.table") public Table results; @Frame(css = “.store") public Store store; } Пример UI Object
  • 15.
    public class AddCVFormextends Form<Attendee> { @FindBy(css = “.first-name“) private ITextField name; @FindBy(css = “.last-name“) private ITextField lastName; @FindBy(css = “.email“) private ITextField email; @FindBy(css = “.file-upload“) private RFileInput cv; @FindBy(css = “.comment-input“) private ITextArea comment; @FindBy(xpath = “//*[.='Submit']“) private IButton submit; @FindBy(xpath = “//*[.='Cancel']“) private IButton cancel; } Формы
  • 16.
    @Test(dataProvider = “attendees”) publicvoid menuTest(Attendee attendee) { searchFilter.fill(attendee); checkSuggestionsContains(attendee); searchFilter.search(attendee); assertEquals(results.rows().count(), 1); results.row(attendee.name, column(“Name”)) addCVForm.submit(attendee.cv); checkCVInDB(attendee.cv); previewForm.verify(attendee); } EDT (Entities driven testing) loginForm.login(user); purchase.cancel(wear); experiment.publish(experiment); creditForm.save(order.data); … public class User { public String name; public String password; public User(String name, String password) { this.name = name; this.password = password; } }
  • 17.
    • JDI –фреймворк реализующий подход UI Objects • Большое количество элементов (более 30) включая сложные (с 10-ками действий) • Иерархическая инициализация UI Objects • Умеет работать с Фреймами • Поддерживает EDT UI Objects
  • 18.
  • 19.
    “Easy things shouldbe easy, and hard things should be possible” Larry Wall (c) Концепция
  • 20.
  • 21.
  • 22.
    Кастомизация Конкретное действие Новый типэлемента Все действия всех элементов
  • 23.
  • 24.
    Уменьшить затрат (время/деньги)на написание тестов в целом и создание модели сайта в частности в разы (если не на порядки)* Уменьшение затрат на поддержку тестов Читабельность тестов (UI Objects) Уменьшение времени поиска багов Читабельность тестов (UI Objects) Логирование Репортинг PROFIT!!! * Объектная модель экономия до 80% времени Написание тестов около 50% времени Затраты на поддержку тестов экономия до 70% Поиск багов экономия 30-50%
  • 25.
    Уменьшение числа false-positive/negative Стабилизация Читабельностьтестов (UI Objects) Любой UI (Web, Mobile, Desktop) Поддержка Java и C# Удовольствие от автоматизации PROFIT!!!
  • 26.
    Планы No effort performancetesting Tests execution statistic UI view testing module Web plugin for fast PageObjects recording
  • 27.
  • 28.

Editor's Notes

  • #3 Работаю в компании Epam в
  • #4 * К вам приходит босс и говорит: Саша, у нас тут начинается новый проект, мы хотим чтобы в нем была автоматизация вперед * Вы после долгих уговоров и объяснений зачем проекту нужна автоматизация получаете добро. С чего начать? (важно не подвести, сделать автоматизацию быстро и качественно) Долгий проект, ручное тестирование , большая регрессия: заказчик понял, что так больше нельзя и попросил вас наладить регрессию (и так большая загрузка - важно быстро начать получать пользу – уменьшить время регрессии) Epam – крупная компания в которой работает более 17 тысяч человек по всем миру. Только в Питере уже более чем 1200 и каждый год мы только растем У нас множество разных проектов от Биоинформатики и Генной инженерии до разработки магазинов, трейдинговых систем и банковских сервисов Задачи тоже разные от создания корпоративных сайтов до разработки высокопроизводительных кластеров и высоконагруенных систем Все это обилие проектов заставляет нас оптимизировать затраты на старт новых проектов (поскольку новые проекты стартуют довольно часто)
  • #6 Давайте работать вместе. Если вы начинающий тест инженер или у вас нет под рукой своего хорошего фреймворка для UI, то используя наш Фреймворк вы можете серьезно сократить затраты на начало тестирования. И сразу написать гораздо более качественные тесты Если вы сделали свой классный фреймворк, и считаете что он лучше наше и конечно стремитесь им поделится, или вы просто считает, что какие-то важные области не охвачены фреймворком. Мы будем рады сотрудничеству. Посмотреть на ваши идеи и внедрить их к себе либо реализовать ваши пожелания
  • #13 В компании Epam
  • #15 Встроенная поддержка работы с фреймами
  • #20 * К вам приходит босс и говорит: Саша, у нас тут начинается новый проект, мы хотим чтобы в нем была автоматизация вперед * Вы после долгих уговоров и объяснений зачем проекту нужна автоматизация получаете добро. С чего начать? (важно не подвести, сделать автоматизацию быстро и качественно) * Долгий проект, ручное тестирование , большая регрессия: заказчик понял, что так больше нельзя и попросил вас наладить регрессию (и так большая загрузка - важно быстро начать получать пользу – уменьшить время регрессии)