SlideShare a Scribd company logo
SCULPT! YOUR! TESTS!
Taras Oleksyn
 4+ years of test automation experience
(in company, freelance)
 Enjoys building simple and elegant
solutions
 Has beautiful eyes
READABILITY
more than 70% of a developers time is spend
reading and understanding code*
*https://blogs.msdn.microsoft.com/peterhal/2006/01/04/what-do-programmers-really-do-anyway-aka-part-2-of-the-yardstick-saga/
 Tuning your language
extension libraries
new features
 Readable web UI test stack
 Sculpting! Your! Tests!
WE’LL TALK:
LOMBOK
both beautiful island in Indonesia and
awesome Java extension library
https://projectlombok.org/
TYPE INFERENCE
automatic deduction of the data type of an
expression
LOCAL VARIABLE TYPE INFERENCE
boolean isRemoteEnabled = true;
final String browser = getProperty("browser", "FIREFOX");
final ArrayList<ProductType> productTypeList = new ArrayList<>();
var isRemoteEnabled = true;
val browser = getProperty("browser", "FIREFOX");
val productTypeList = new ArrayList<ProductType>();
TYPE INFERENCE
val – final local variable
var – non-final local variable
works on:
local variables
loop scope variables
https://habrahabr.ru/post/280075/
http://openjdk.java.net/jeps/286
POJO
public AutomationEngineer(String name,
boolean likesToBuildFrameworks,
boolean hatesBDD) {
this.name = name;
this.likesToBuildFrameworks = likesToBuildFrameworks;
this.hatesBDD = hatesBDD;
}
public class AutomationEngineer {
…
private final String name;
private final boolean likesToBuildFrameworks;
private final boolean hatesBDD;
public String getName() {return name;}
public boolean hatesBDD() { return hatesBDD; }
public boolean likesToBuildFrameworks() { … }
@Override
public boolean equals(Object o) { … }
@Override
public int hashCode() { … }
@Override
public String toString() { … }
}
POJO
LOMBOK
public class AutomationEngineer {
private final String name;
private final boolean likesToBuildFrameworks;
private final boolean hatesBDD;
}
@Data
public enum State {
ALABAMA("AL", 1),
ALASKA("AK", 2),
ARIZONA("AZ", 3),
CALIFORNIA("CA", 4);
private final String shortName;
private final int stateIndex;
}
LOMBOK
State(String shortName, int stateIndex) {
this.shortName = shortName;
this.stateIndex = stateIndex;
}
public String getShortName() { return shortName; }
public int getStateIndex() { return stateIndex; }
}
@Getter
@RequiredArgsConstructor
EXTENSION METHOD
a method added to an object after the original
object was compiled
EXTENSION METHOD
new ChromeDriver()
.getClickableElement(By.id("some_id"))
.click();
new ChromeDriver()
.findElement(By.id("some_id"))
.click();
EXTENSION METHOD
public class WebElementExtension {
public static WebElement getClickableElement(WebDriver driver, By by){
return new WebDriverWait(driver, 30)
.until(ExpectedConditions.elementToBeClickable(by));
}
}
@ExtensionMethod(WebElementExtension.class)
public class ExtensionMethodExample {
@Test
void testDriverExtension(){
new ChromeDriver()
.getClickableElement(By.id("some_id"))
.click();
}
}
LOMBOK
@Value
@Builder
@Accessors
@UtilityClass
…
VAVR (EX JAVASLANG)
functional library for Java 8+ to reduce the amount
of code and to increase the robustness
http://blog.vavr.io/
PATTERN MATCHING
act of checking a given sequence for the
presence of the constituents of some pattern
http://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
PLAIN JAVA
public void filterUsersBy(UserType user) {
WebElement userLocator;
switch (user) {
case ADMIN:
userLocator = adminUserLocator; break;
case MEMBER:
userLocator = memberUserLocator; break;
case VENDOR:
userLocator = vendorUserLocator; break;
default:
userLocator = superAdminLocator; break;
}
select(userLocator);
click(filterButton);
}
public void filterUsersBy(UserType user) {
val userLocator = Match(user).of(
Case($(ADMIN), adminUserLocator),
Case($(MEMBER), memberUserLocator),
Case($(VENDOR), vendorUserLocator),
Case($(), superAdminLocator)
);
select(userLocator);
click(filterButton);
}
VAVR
public void doActionFor(UserType user) {
Match(user).of(
Case(isIn(ADMIN, SUPER_ADMIN), obj -> run(this::selectAdminUser)),
Case($(MEMBER), obj -> run(this::selectMemberUser)),
Case($(), obj -> {throw new SomeException("Invalid user: “ + obj);})
);
}
VAVR
OWNER
library for getting rid of the boilerplate code in
properties based configuration
http://owner.aeonbits.org/
PROPERTY
BrowserSetting.properties:
browserName=firefox
version=57
platform=LINUX
javascriptEnabled=true
acceptSslCerts=false
isRemote=true
public interface BrowserSetting extends Config {
String browserName();
String version();
Platform platform();
boolean isRemote();
boolean javascriptEnabled();
boolean acceptSslCerts();
}
OWNER
BrowserSetting.properties:
browserName=firefox
version=57
platform=WINDOWS
isRemote=true
javascriptEnabled=true
acceptSslCerts=false
OWNER
browserSetting.browserName();
browserSetting.platform();
browserSetting.version();
browserSetting.isRemote();
browserSetting.javascriptEnabled();
browserSetting.acceptSslCerts();
val browserSetting = ConfigFactory.create(BrowserSetting.class);
OWNER
@Key("browser.name")
@DefaultValue("FIREFOX")
@HotReload
@Sources({
"file:BrowserSetting.properties",
"classpath:BrowserSetting.properties"})
…
@
public List<Product> getProductsFor(ProductCategory category) {
return filteredProducts;
}
JAVA
List<WebElement> products = getVisibleElementsFor(productsLocator);
List<Product> filteredProducts = new ArrayList<>();
for (WebElement productElement : products) {
String productName = productElement.getText();
String productCategory = getCategoryFrom(productName);
}
if (productCategory.equals(category)) {
Product product = new Product(productName);
filteredProducts.add(product);
}
public List<Product> getProductsFor(ProductCategory category) {
return getVisibleElementsFor(productsLocator)
.stream()
.map(WebElement::getText)
.filter(productName ->
getCategoryFrom(productName).equals(category))
.map(Product::new)
.collect(toList());
}
JAVA 8
Gradle
TestNG
Selenide Allure AssertJ
DSL layer
Selenium Grid/Selenoid
TO GO STACK
API
SELENIDE
WebDriverManager
ThreadLocal static instance
SelenideElement
built-in smart waits
file uploads
…
maintain browser drivers
manage WebDriver
instance
UI mapping
wait strategies
assertions
…
ASSERTJ
void verifyAddingApplicant() {
…
assertTrue("John Smith".equals(applicant.getName()),
"Failed to update applicant name");
…
assertTrue(applicantsTable.getRecordsCount() == 1,
“Applicants table has more than 1 record");
}
void verifyAddingApplicant() {
…
assertThat(applicant).hasName(“John Smith“);
…
assertThat(applicantsTable).hasRecords(1);
}
CUSTOM ASSERT
public class ApplicantAssert
extends AbstractAssert<ApplicantAssert, ApplicantInfo> {
public ApplicantAssert(ApplicantInfo actual) {
super(actual, ApplicantAssert.class);
}
public static ApplicantAssert assertThat(ApplicantInfo actual) {
return new ApplicantAssert(actual);
}
public ApplicantAssert hasName(String name) {
...
}
}
SCULPTING! YOUR! TESTS!
extending language with libraries
using new language features
using ready solutions
building concise DSL
void testAddingApplicant() {
final ApplicantInfo applicant = getApplicantInfo();
final EducationInfo education = getEducationInfo();
applicantsPage
.startAddingApplicant()
.fillAllFieldsWith(applicant)
.startAddingInfo(ApplicantInfoType.EDUCATION)
.fillAllFieldsWith(education)
.saveApplicant();
assertTrue(applicantsPage.getApplicantAddedMessage().isDisplayed(),
"Failed to add new applicant");
}
1
2
3
final ApplicantInfo applicant = getApplicantInfo();
final EducationInfo education = getEducationInfo();
assertThat(applicantsPage).applicantAdded();
applicantsPage
.startAddingApplicant()
.fillAllFieldsWith(applicant)
.startAddingInfo(ApplicantInfoType.EDUCATION)
.fillAllFieldsWith(education)
.saveApplicant();
assertTrue(applicantsPage
.getApplicantAddedMessage().isDisplayed(),
"Failed to add new applicant");
val applicant = getApplicantInfo();
val education = getEducationInfo();
applicantsPage
.add(applicant)
.addInfo(education)
.saveApplicant();
void testAddingApplіcant() {
val applicant = getApplicantInfo();
val education = getEducationInfo();
applicantsPage
.add(applicant)
.addInfo(education)
.saveApplicant();
assertThat(applicantsPage).applicantAdded();
}
void testAddingApplicant() {
final ApplicantInfo applicant = getApplicantInfo();
final EducationInfo education = getEducationInfo();
applicantsPage
.startAddingApplicant()
.fillAllFieldsWith(applicant)
.startAddingInfo(ApplicantInfoType.EDUCATION)
.fillAllFieldsWith(education)
.saveApplicant();
assertTrue(applicantsPage.getApplicantAddedMessage().isDisplayed(),
"Failed to add new applicant");
}
ADVANTAGES ?
decreased code base
increased code readability
time saved for adding actual value
…
DOWNSIDES ?
learning curve
complexity increases
external risks
…
Thank You!
HOW TO PRONOUNCE ?
[SUITE] pronounced like
Jason[JSON]
[LINUX] pronounced
sweet
pronounced like the name
[leenooks]

More Related Content

What's hot

Activator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetupActivator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetup
Henrik Engström
 
ERRest - The Next Steps
ERRest - The Next StepsERRest - The Next Steps
ERRest - The Next Steps
WO Community
 
Taming Core Data by Arek Holko, Macoscope
Taming Core Data by Arek Holko, MacoscopeTaming Core Data by Arek Holko, Macoscope
Taming Core Data by Arek Holko, Macoscope
Macoscope
 
Hibernate
Hibernate Hibernate
Hibernate
Sunil OS
 
1 aleksandr gritsevski - attd example using
1   aleksandr gritsevski - attd example using1   aleksandr gritsevski - attd example using
1 aleksandr gritsevski - attd example using
Ievgenii Katsan
 
JavaExamples
JavaExamplesJavaExamples
JavaExamples
Suman Astani
 
Apache Utilities At Work V5
Apache Utilities At Work   V5Apache Utilities At Work   V5
Apache Utilities At Work V5
Tom Marrs
 
Pragmatic unittestingwithj unit
Pragmatic unittestingwithj unitPragmatic unittestingwithj unit
Pragmatic unittestingwithj unit
liminescence
 
ShmooCon 2009 - (Re)Playing(Blind)Sql
ShmooCon 2009 - (Re)Playing(Blind)SqlShmooCon 2009 - (Re)Playing(Blind)Sql
ShmooCon 2009 - (Re)Playing(Blind)Sql
Chema Alonso
 
Good Practices On Test Automation
Good Practices On Test AutomationGood Practices On Test Automation
Good Practices On Test Automation
Gustavo Labbate Godoy
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
GaryCoady
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
CodeOps Technologies LLP
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
ciklum_ods
 
SAP Testing Training
SAP Testing TrainingSAP Testing Training
SAP Testing Training
VGlobal Govi
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
David Rodenas
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using Spock
Anuj Aneja
 
Sql Injection Myths and Fallacies
Sql Injection Myths and FallaciesSql Injection Myths and Fallacies
Sql Injection Myths and Fallacies
Karwin Software Solutions LLC
 
Testing in android
Testing in androidTesting in android
Testing in android
jtrindade
 

What's hot (20)

Activator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetupActivator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetup
 
ERRest - The Next Steps
ERRest - The Next StepsERRest - The Next Steps
ERRest - The Next Steps
 
Taming Core Data by Arek Holko, Macoscope
Taming Core Data by Arek Holko, MacoscopeTaming Core Data by Arek Holko, Macoscope
Taming Core Data by Arek Holko, Macoscope
 
Hibernate
Hibernate Hibernate
Hibernate
 
1 aleksandr gritsevski - attd example using
1   aleksandr gritsevski - attd example using1   aleksandr gritsevski - attd example using
1 aleksandr gritsevski - attd example using
 
JavaExamples
JavaExamplesJavaExamples
JavaExamples
 
Apache Utilities At Work V5
Apache Utilities At Work   V5Apache Utilities At Work   V5
Apache Utilities At Work V5
 
Pragmatic unittestingwithj unit
Pragmatic unittestingwithj unitPragmatic unittestingwithj unit
Pragmatic unittestingwithj unit
 
ShmooCon 2009 - (Re)Playing(Blind)Sql
ShmooCon 2009 - (Re)Playing(Blind)SqlShmooCon 2009 - (Re)Playing(Blind)Sql
ShmooCon 2009 - (Re)Playing(Blind)Sql
 
Good Practices On Test Automation
Good Practices On Test AutomationGood Practices On Test Automation
Good Practices On Test Automation
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Core Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug HuntCore Java - Quiz Questions - Bug Hunt
Core Java - Quiz Questions - Bug Hunt
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
SAP Testing Training
SAP Testing TrainingSAP Testing Training
SAP Testing Training
 
JS and patterns
JS and patternsJS and patterns
JS and patterns
 
Unit/Integration Testing using Spock
Unit/Integration Testing using SpockUnit/Integration Testing using Spock
Unit/Integration Testing using Spock
 
Jdbc
JdbcJdbc
Jdbc
 
Sql Injection Myths and Fallacies
Sql Injection Myths and FallaciesSql Injection Myths and Fallacies
Sql Injection Myths and Fallacies
 
Testing in android
Testing in androidTesting in android
Testing in android
 
Rhino Mocks
Rhino MocksRhino Mocks
Rhino Mocks
 

Similar to Тарас Олексин - Sculpt! Your! Tests!

[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search
indeedeng
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
javatwo2011
 
Android best practices
Android best practicesAndroid best practices
Android best practices
Jose Manuel Ortega Candel
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
Ignacio Coloma
 
Laurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationLaurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationAjax Experience 2009
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
Godfrey Nolan
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
Hassan Abid
 
Architecture components - IT Talk
Architecture components - IT TalkArchitecture components - IT Talk
Architecture components - IT Talk
Constantine Mars
 
Architecture Components
Architecture Components Architecture Components
Architecture Components
DataArt
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureC.T.Co
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android InfrastructureAlexey Buzdin
 
The Full Power of ASP.NET Web API
The Full Power of ASP.NET Web APIThe Full Power of ASP.NET Web API
The Full Power of ASP.NET Web API
Eyal Vardi
 
ActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group PresentationActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group Presentation
ipolevoy
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolbox
Shem Magnezi
 
Sencha / ExtJS : Object Oriented JavaScript
Sencha / ExtJS : Object Oriented JavaScriptSencha / ExtJS : Object Oriented JavaScript
Sencha / ExtJS : Object Oriented JavaScript
Rohan Chandane
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NET
James Johnson
 
Ajax Fundamentals Web Applications
Ajax Fundamentals Web ApplicationsAjax Fundamentals Web Applications
Ajax Fundamentals Web Applicationsdominion
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
Visual Engineering
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NET
James Johnson
 

Similar to Тарас Олексин - Sculpt! Your! Tests! (20)

[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search[@IndeedEng] Building Indeed Resume Search
[@IndeedEng] Building Indeed Resume Search
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Android best practices
Android best practicesAndroid best practices
Android best practices
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 
Laurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationLaurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus Presentation
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Javascript Design Patterns
Javascript Design PatternsJavascript Design Patterns
Javascript Design Patterns
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Architecture components - IT Talk
Architecture components - IT TalkArchitecture components - IT Talk
Architecture components - IT Talk
 
Architecture Components
Architecture Components Architecture Components
Architecture Components
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
Overview of Android Infrastructure
Overview of Android InfrastructureOverview of Android Infrastructure
Overview of Android Infrastructure
 
The Full Power of ASP.NET Web API
The Full Power of ASP.NET Web APIThe Full Power of ASP.NET Web API
The Full Power of ASP.NET Web API
 
ActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group PresentationActiveWeb: Chicago Java User Group Presentation
ActiveWeb: Chicago Java User Group Presentation
 
Android dev toolbox
Android dev toolboxAndroid dev toolbox
Android dev toolbox
 
Sencha / ExtJS : Object Oriented JavaScript
Sencha / ExtJS : Object Oriented JavaScriptSencha / ExtJS : Object Oriented JavaScript
Sencha / ExtJS : Object Oriented JavaScript
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NET
 
Ajax Fundamentals Web Applications
Ajax Fundamentals Web ApplicationsAjax Fundamentals Web Applications
Ajax Fundamentals Web Applications
 
Workshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testingWorkshop 23: ReactJS, React & Redux testing
Workshop 23: ReactJS, React & Redux testing
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NET
 

More from DataArt

DataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human ApproachDataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human Approach
DataArt
 
DataArt Healthcare & Life Sciences
DataArt Healthcare & Life SciencesDataArt Healthcare & Life Sciences
DataArt Healthcare & Life Sciences
DataArt
 
DataArt Financial Services and Capital Markets
DataArt Financial Services and Capital MarketsDataArt Financial Services and Capital Markets
DataArt Financial Services and Capital Markets
DataArt
 
About DataArt HR Partners
About DataArt HR PartnersAbout DataArt HR Partners
About DataArt HR Partners
DataArt
 
Event management в IT
Event management в ITEvent management в IT
Event management в IT
DataArt
 
Digital Marketing from inside
Digital Marketing from insideDigital Marketing from inside
Digital Marketing from inside
DataArt
 
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
DataArt
 
DevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проектDevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проект
DataArt
 
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArtIT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
DataArt
 
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
 «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han... «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
DataArt
 
Communication in QA's life
Communication in QA's lifeCommunication in QA's life
Communication in QA's life
DataArt
 
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьмиНельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
DataArt
 
Знакомьтесь, DevOps
Знакомьтесь, DevOpsЗнакомьтесь, DevOps
Знакомьтесь, DevOps
DataArt
 
DevOps in real life
DevOps in real lifeDevOps in real life
DevOps in real life
DataArt
 
Codeless: автоматизация тестирования
Codeless: автоматизация тестированияCodeless: автоматизация тестирования
Codeless: автоматизация тестирования
DataArt
 
Selenoid
SelenoidSelenoid
Selenoid
DataArt
 
Selenide
SelenideSelenide
Selenide
DataArt
 
A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"
DataArt
 
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
DataArt
 
IT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNGIT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNG
DataArt
 

More from DataArt (20)

DataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human ApproachDataArt Custom Software Engineering with a Human Approach
DataArt Custom Software Engineering with a Human Approach
 
DataArt Healthcare & Life Sciences
DataArt Healthcare & Life SciencesDataArt Healthcare & Life Sciences
DataArt Healthcare & Life Sciences
 
DataArt Financial Services and Capital Markets
DataArt Financial Services and Capital MarketsDataArt Financial Services and Capital Markets
DataArt Financial Services and Capital Markets
 
About DataArt HR Partners
About DataArt HR PartnersAbout DataArt HR Partners
About DataArt HR Partners
 
Event management в IT
Event management в ITEvent management в IT
Event management в IT
 
Digital Marketing from inside
Digital Marketing from insideDigital Marketing from inside
Digital Marketing from inside
 
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)What's new in Android, Igor Malytsky ( Google Post I|O Tour)
What's new in Android, Igor Malytsky ( Google Post I|O Tour)
 
DevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проектDevOps Workshop:Что бывает, когда DevOps приходит на проект
DevOps Workshop:Что бывает, когда DevOps приходит на проект
 
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArtIT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
IT Talk Kharkiv: «‎Soft skills в IT. Польза или вред? Максим Бастион, DataArt
 
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
 «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han... «Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
«Ноль копеек. Спастись от выгорания» — Сергей Чеботарев (Head of Design, Han...
 
Communication in QA's life
Communication in QA's lifeCommunication in QA's life
Communication in QA's life
 
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьмиНельзя просто так взять и договориться, или как мы работали со сложными людьми
Нельзя просто так взять и договориться, или как мы работали со сложными людьми
 
Знакомьтесь, DevOps
Знакомьтесь, DevOpsЗнакомьтесь, DevOps
Знакомьтесь, DevOps
 
DevOps in real life
DevOps in real lifeDevOps in real life
DevOps in real life
 
Codeless: автоматизация тестирования
Codeless: автоматизация тестированияCodeless: автоматизация тестирования
Codeless: автоматизация тестирования
 
Selenoid
SelenoidSelenoid
Selenoid
 
Selenide
SelenideSelenide
Selenide
 
A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"A. Sirota "Building an Automation Solution based on Appium"
A. Sirota "Building an Automation Solution based on Appium"
 
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
Эмоциональный интеллект или как не сойти с ума в условиях сложного и динамичн...
 
IT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNGIT talk: Как я перестал бояться и полюбил TestNG
IT talk: Как я перестал бояться и полюбил TestNG
 

Recently uploaded

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 

Recently uploaded (20)

UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 

Тарас Олексин - Sculpt! Your! Tests!

  • 2.  4+ years of test automation experience (in company, freelance)  Enjoys building simple and elegant solutions  Has beautiful eyes
  • 3. READABILITY more than 70% of a developers time is spend reading and understanding code* *https://blogs.msdn.microsoft.com/peterhal/2006/01/04/what-do-programmers-really-do-anyway-aka-part-2-of-the-yardstick-saga/
  • 4.  Tuning your language extension libraries new features  Readable web UI test stack  Sculpting! Your! Tests! WE’LL TALK:
  • 5. LOMBOK both beautiful island in Indonesia and awesome Java extension library https://projectlombok.org/
  • 6. TYPE INFERENCE automatic deduction of the data type of an expression
  • 7. LOCAL VARIABLE TYPE INFERENCE boolean isRemoteEnabled = true; final String browser = getProperty("browser", "FIREFOX"); final ArrayList<ProductType> productTypeList = new ArrayList<>(); var isRemoteEnabled = true; val browser = getProperty("browser", "FIREFOX"); val productTypeList = new ArrayList<ProductType>();
  • 8. TYPE INFERENCE val – final local variable var – non-final local variable works on: local variables loop scope variables https://habrahabr.ru/post/280075/ http://openjdk.java.net/jeps/286
  • 9. POJO public AutomationEngineer(String name, boolean likesToBuildFrameworks, boolean hatesBDD) { this.name = name; this.likesToBuildFrameworks = likesToBuildFrameworks; this.hatesBDD = hatesBDD; } public class AutomationEngineer { … private final String name; private final boolean likesToBuildFrameworks; private final boolean hatesBDD;
  • 10. public String getName() {return name;} public boolean hatesBDD() { return hatesBDD; } public boolean likesToBuildFrameworks() { … } @Override public boolean equals(Object o) { … } @Override public int hashCode() { … } @Override public String toString() { … } } POJO
  • 11. LOMBOK public class AutomationEngineer { private final String name; private final boolean likesToBuildFrameworks; private final boolean hatesBDD; } @Data
  • 12. public enum State { ALABAMA("AL", 1), ALASKA("AK", 2), ARIZONA("AZ", 3), CALIFORNIA("CA", 4); private final String shortName; private final int stateIndex; } LOMBOK State(String shortName, int stateIndex) { this.shortName = shortName; this.stateIndex = stateIndex; } public String getShortName() { return shortName; } public int getStateIndex() { return stateIndex; } } @Getter @RequiredArgsConstructor
  • 13. EXTENSION METHOD a method added to an object after the original object was compiled
  • 14. EXTENSION METHOD new ChromeDriver() .getClickableElement(By.id("some_id")) .click(); new ChromeDriver() .findElement(By.id("some_id")) .click();
  • 15. EXTENSION METHOD public class WebElementExtension { public static WebElement getClickableElement(WebDriver driver, By by){ return new WebDriverWait(driver, 30) .until(ExpectedConditions.elementToBeClickable(by)); } } @ExtensionMethod(WebElementExtension.class) public class ExtensionMethodExample { @Test void testDriverExtension(){ new ChromeDriver() .getClickableElement(By.id("some_id")) .click(); } }
  • 17. VAVR (EX JAVASLANG) functional library for Java 8+ to reduce the amount of code and to increase the robustness http://blog.vavr.io/
  • 18. PATTERN MATCHING act of checking a given sequence for the presence of the constituents of some pattern http://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
  • 19. PLAIN JAVA public void filterUsersBy(UserType user) { WebElement userLocator; switch (user) { case ADMIN: userLocator = adminUserLocator; break; case MEMBER: userLocator = memberUserLocator; break; case VENDOR: userLocator = vendorUserLocator; break; default: userLocator = superAdminLocator; break; } select(userLocator); click(filterButton); }
  • 20. public void filterUsersBy(UserType user) { val userLocator = Match(user).of( Case($(ADMIN), adminUserLocator), Case($(MEMBER), memberUserLocator), Case($(VENDOR), vendorUserLocator), Case($(), superAdminLocator) ); select(userLocator); click(filterButton); } VAVR
  • 21. public void doActionFor(UserType user) { Match(user).of( Case(isIn(ADMIN, SUPER_ADMIN), obj -> run(this::selectAdminUser)), Case($(MEMBER), obj -> run(this::selectMemberUser)), Case($(), obj -> {throw new SomeException("Invalid user: “ + obj);}) ); } VAVR
  • 22. OWNER library for getting rid of the boilerplate code in properties based configuration http://owner.aeonbits.org/
  • 24. public interface BrowserSetting extends Config { String browserName(); String version(); Platform platform(); boolean isRemote(); boolean javascriptEnabled(); boolean acceptSslCerts(); } OWNER BrowserSetting.properties: browserName=firefox version=57 platform=WINDOWS isRemote=true javascriptEnabled=true acceptSslCerts=false
  • 27. public List<Product> getProductsFor(ProductCategory category) { return filteredProducts; } JAVA List<WebElement> products = getVisibleElementsFor(productsLocator); List<Product> filteredProducts = new ArrayList<>(); for (WebElement productElement : products) { String productName = productElement.getText(); String productCategory = getCategoryFrom(productName); } if (productCategory.equals(category)) { Product product = new Product(productName); filteredProducts.add(product); }
  • 28. public List<Product> getProductsFor(ProductCategory category) { return getVisibleElementsFor(productsLocator) .stream() .map(WebElement::getText) .filter(productName -> getCategoryFrom(productName).equals(category)) .map(Product::new) .collect(toList()); } JAVA 8
  • 29.
  • 30. Gradle TestNG Selenide Allure AssertJ DSL layer Selenium Grid/Selenoid TO GO STACK API
  • 31. SELENIDE WebDriverManager ThreadLocal static instance SelenideElement built-in smart waits file uploads … maintain browser drivers manage WebDriver instance UI mapping wait strategies assertions …
  • 32. ASSERTJ void verifyAddingApplicant() { … assertTrue("John Smith".equals(applicant.getName()), "Failed to update applicant name"); … assertTrue(applicantsTable.getRecordsCount() == 1, “Applicants table has more than 1 record"); } void verifyAddingApplicant() { … assertThat(applicant).hasName(“John Smith“); … assertThat(applicantsTable).hasRecords(1); }
  • 33. CUSTOM ASSERT public class ApplicantAssert extends AbstractAssert<ApplicantAssert, ApplicantInfo> { public ApplicantAssert(ApplicantInfo actual) { super(actual, ApplicantAssert.class); } public static ApplicantAssert assertThat(ApplicantInfo actual) { return new ApplicantAssert(actual); } public ApplicantAssert hasName(String name) { ... } }
  • 34. SCULPTING! YOUR! TESTS! extending language with libraries using new language features using ready solutions building concise DSL
  • 35. void testAddingApplicant() { final ApplicantInfo applicant = getApplicantInfo(); final EducationInfo education = getEducationInfo(); applicantsPage .startAddingApplicant() .fillAllFieldsWith(applicant) .startAddingInfo(ApplicantInfoType.EDUCATION) .fillAllFieldsWith(education) .saveApplicant(); assertTrue(applicantsPage.getApplicantAddedMessage().isDisplayed(), "Failed to add new applicant"); } 1 2 3
  • 36. final ApplicantInfo applicant = getApplicantInfo(); final EducationInfo education = getEducationInfo(); assertThat(applicantsPage).applicantAdded(); applicantsPage .startAddingApplicant() .fillAllFieldsWith(applicant) .startAddingInfo(ApplicantInfoType.EDUCATION) .fillAllFieldsWith(education) .saveApplicant(); assertTrue(applicantsPage .getApplicantAddedMessage().isDisplayed(), "Failed to add new applicant"); val applicant = getApplicantInfo(); val education = getEducationInfo(); applicantsPage .add(applicant) .addInfo(education) .saveApplicant();
  • 37. void testAddingApplіcant() { val applicant = getApplicantInfo(); val education = getEducationInfo(); applicantsPage .add(applicant) .addInfo(education) .saveApplicant(); assertThat(applicantsPage).applicantAdded(); }
  • 38. void testAddingApplicant() { final ApplicantInfo applicant = getApplicantInfo(); final EducationInfo education = getEducationInfo(); applicantsPage .startAddingApplicant() .fillAllFieldsWith(applicant) .startAddingInfo(ApplicantInfoType.EDUCATION) .fillAllFieldsWith(education) .saveApplicant(); assertTrue(applicantsPage.getApplicantAddedMessage().isDisplayed(), "Failed to add new applicant"); }
  • 39. ADVANTAGES ? decreased code base increased code readability time saved for adding actual value …
  • 40. DOWNSIDES ? learning curve complexity increases external risks …
  • 42. HOW TO PRONOUNCE ? [SUITE] pronounced like Jason[JSON] [LINUX] pronounced sweet pronounced like the name [leenooks]