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
WebPageMenuCheckListButtonTable
@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 siteHome 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